]> git.sesse.net Git - vlc/commitdiff
mpeg: implement title/seekpoint controls (refs #8455)
authorRémi Denis-Courmont <remi@remlab.net>
Mon, 26 Aug 2013 19:26:30 +0000 (22:26 +0300)
committerRémi Denis-Courmont <remi@remlab.net>
Mon, 26 Aug 2013 19:47:52 +0000 (22:47 +0300)
This is intended for VDR directories and Video CDs.

include/vlc_demux.h
include/vlc_input.h
modules/demux/ps.c
modules/demux/ts.c

index 1d56db007cdc6cfe8373f07e8e293578b208bca1..6bc05076ef7d1c839e0e761b3874668d33dbdfee 100644 (file)
@@ -172,6 +172,26 @@ enum demux_query_e
 
 VLC_API int demux_vaControlHelper( stream_t *, int64_t i_start, int64_t i_end, int64_t i_bitrate, int i_align, int i_query, va_list args );
 
+static inline void demux_UpdateTitleFromStream( demux_t *demux )
+{
+    stream_t *s = demux->s;
+    unsigned title, seekpoint;
+
+    if( stream_Control( s, STREAM_GET_TITLE, &title ) == VLC_SUCCESS
+     && title != (unsigned)demux->info.i_title )
+    {
+        demux->info.i_title = title;
+        demux->info.i_update = INPUT_UPDATE_TITLE;
+    }
+
+    if( stream_Control( s, STREAM_GET_SEEKPOINT, &seekpoint ) == VLC_SUCCESS
+     && seekpoint != (unsigned)demux->info.i_seekpoint )
+    {
+        demux->info.i_seekpoint = seekpoint;
+        demux->info.i_update = INPUT_UPDATE_SEEKPOINT;
+    }
+}
+
 /*************************************************************************
  * Miscellaneous helpers for demuxers
  *************************************************************************/
index 491c329b020e67c34aa6aa24db23c5f132c80e87..42e1388d27f49c1b96b93bb0a494f84cf1e8d492 100644 (file)
@@ -77,7 +77,7 @@ static inline seekpoint_t *vlc_seekpoint_Duplicate( const seekpoint_t *src )
 /*****************************************************************************
  * Title:
  *****************************************************************************/
-typedef struct
+typedef struct input_title_t
 {
     char        *psz_name;
 
index e15e5a1aeac8379511e71ee8fec5f767413915f3..7dc9aa795e89c7c5ea1297721490892c6cb82029 100644 (file)
@@ -444,6 +444,7 @@ static int Demux( demux_t *p_demux )
         break;
     }
 
+    demux_UpdateTitleFromStream( p_demux );
     return 1;
 }
 
@@ -530,6 +531,22 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
             }
             return VLC_EGENERIC;
 
+        case DEMUX_GET_TITLE_INFO:
+        {
+            struct input_title_t ***v = va_arg( args, struct input_title_t*** );
+            int *c = va_arg( args, int * );
+
+            *va_arg( args, int* ) = 0; /* Title offset */
+            *va_arg( args, int* ) = 0; /* Chapter offset */
+            return stream_Control( p_demux->s, STREAM_GET_TITLE_INFO, v, c );
+        }
+
+        case DEMUX_SET_TITLE:
+            return stream_Control( p_demux->s, STREAM_SET_TITLE, args );
+
+        case DEMUX_SET_SEEKPOINT:
+            return stream_Control( p_demux->s, STREAM_SET_SEEKPOINT, args );
+
         case DEMUX_GET_META:
             return stream_Control( p_demux->s, STREAM_GET_META, args );
 
index 666995a158d588a1c716ef084bc523b053490660..b958408c2e4f0765685fa127e2c0bf90f2ab87af 100644 (file)
@@ -1019,6 +1019,7 @@ static int Demux( demux_t *p_demux )
                    p_sys->i_ts_read * p_sys->i_packet_size );
     }
 
+    demux_UpdateTitleFromStream( p_demux );
     return 1;
 }
 
@@ -1189,6 +1190,22 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
         return VLC_SUCCESS;
     }
 
+    case DEMUX_GET_TITLE_INFO:
+    {
+        struct input_title_t ***v = va_arg( args, struct input_title_t*** );
+        int *c = va_arg( args, int * );
+
+        *va_arg( args, int* ) = 0; /* Title offset */
+        *va_arg( args, int* ) = 0; /* Chapter offset */
+        return stream_Control( p_demux->s, STREAM_GET_TITLE_INFO, v, c );
+    }
+
+    case DEMUX_SET_TITLE:
+        return stream_Control( p_demux->s, STREAM_SET_TITLE, args );
+
+    case DEMUX_SET_SEEKPOINT:
+        return stream_Control( p_demux->s, STREAM_SET_SEEKPOINT, args );
+
     case DEMUX_GET_META:
         return stream_Control( p_demux->s, STREAM_GET_META, args );