+static int RecordCallback( vlc_object_t *p_this, char const *psz_cmd,
+ vlc_value_t oldval, vlc_value_t newval,
+ void *p_data );
+static int FrameNextCallback( vlc_object_t *p_this, char const *psz_cmd,
+ vlc_value_t oldval, vlc_value_t newval,
+ void *p_data );
+
+typedef struct
+{
+ const char *psz_name;
+ vlc_callback_t callback;
+} vlc_input_callback_t;
+
+static void InputAddCallbacks( input_thread_t *, const vlc_input_callback_t * );
+static void InputDelCallbacks( input_thread_t *, const vlc_input_callback_t * );
+
+#ifdef CALLBACK /* For windows */
+# undef CALLBACK /* We don't care of this one here */
+#endif
+/* List all callbacks added by input */
+#define CALLBACK(name,cb) { name, cb }
+static const vlc_input_callback_t p_input_callbacks[] =
+{
+ CALLBACK( "state", StateCallback ),
+ CALLBACK( "rate", RateCallback ),
+ CALLBACK( "rate-slower", RateOffsetCallback ),
+ CALLBACK( "rate-faster", RateOffsetCallback ),
+ CALLBACK( "position", PositionCallback ),
+ CALLBACK( "position-offset", PositionCallback ),
+ CALLBACK( "time", TimeCallback ),
+ CALLBACK( "time-offset", TimeCallback ),
+ CALLBACK( "bookmark", BookmarkCallback ),
+ CALLBACK( "program", ProgramCallback ),
+ CALLBACK( "title", TitleCallback ),
+ CALLBACK( "chapter", SeekpointCallback ),
+ CALLBACK( "audio-delay", EsDelayCallback ),
+ CALLBACK( "spu-delay", EsDelayCallback ),
+ CALLBACK( "video-es", ESCallback ),
+ CALLBACK( "audio-es", ESCallback ),
+ CALLBACK( "spu-es", ESCallback ),
+ CALLBACK( "record", RecordCallback ),
+ CALLBACK( "frame-next", FrameNextCallback ),
+
+ CALLBACK( NULL, NULL )
+};
+static const vlc_input_callback_t p_input_navigation_callbacks[] =
+{
+ CALLBACK( "next-title", TitleCallback ),
+ CALLBACK( "prev-title", TitleCallback ),
+
+ CALLBACK( NULL, NULL )
+};
+static const vlc_input_callback_t p_input_title_callbacks[] =
+{
+ CALLBACK( "next-chapter", SeekpointCallback ),
+ CALLBACK( "prev-chapter", SeekpointCallback ),
+
+ CALLBACK( NULL, NULL )
+};
+#undef CALLBACK
+