]> git.sesse.net Git - vlc/blobdiff - modules/demux/cdg.c
Qt: CaptureOpenPanel: check and prefill with usual devices
[vlc] / modules / demux / cdg.c
index b4b49c4fbbad850a1d186fb78527788a26413e6d..c7a3b6ec7a84fd9298511d08c270e66a5758a388 100644 (file)
 # include "config.h"
 #endif
 
-#include <vlc/vlc.h>
+#include <vlc_common.h>
 #include <vlc_plugin.h>
 #include <vlc_demux.h>
 
-#include <vlc_codecs.h>
-
 /*****************************************************************************
  * Module descriptor
  *****************************************************************************/
 static int  Open ( vlc_object_t * );
 static void Close( vlc_object_t * );
 
-vlc_module_begin();
-    set_description( N_("CDG demuxer") );
-    set_category( CAT_INPUT );
-    set_subcategory( SUBCAT_INPUT_DEMUX );
-    set_capability( "demux", 3 );
-    set_callbacks( Open, Close );
-    add_shortcut( "cdg" );
-    add_shortcut( "subtitle" );
-vlc_module_end();
+vlc_module_begin ()
+    set_description( N_("CDG demuxer") )
+    set_category( CAT_INPUT )
+    set_subcategory( SUBCAT_INPUT_DEMUX )
+    set_capability( "demux", 3 )
+    set_callbacks( Open, Close )
+    add_shortcut( "cdg", "subtitle" )
+vlc_module_end ()
 
 /*****************************************************************************
  * Local prototypes
@@ -94,7 +91,7 @@ static int Open( vlc_object_t * p_this )
     p_demux->p_sys      = p_sys = malloc( sizeof( demux_sys_t ) );
 
     /* */
-    es_format_Init( &p_sys->fmt, VIDEO_ES, VLC_FOURCC('C','D','G', ' ' ) );
+    es_format_Init( &p_sys->fmt, VIDEO_ES, VLC_CODEC_CDG );
     p_sys->fmt.video.i_width  = 300-2*6;
     p_sys->fmt.video.i_height = 216-2*12 ;
 
@@ -102,7 +99,7 @@ static int Open( vlc_object_t * p_this )
 
     /* There is CDG_FRAME_RATE frames per second */
     date_Init( &p_sys->pts, CDG_FRAME_RATE, 1 );
-    date_Set( &p_sys->pts, 1 );
+    date_Set( &p_sys->pts, 0 );
 
     return VLC_SUCCESS;
 }
@@ -125,11 +122,14 @@ static int Demux( demux_t *p_demux )
     }
 
     p_block->i_dts =
-    p_block->i_pts = date_Increment( &p_sys->pts, 1 );
+    p_block->i_pts = VLC_TS_0 + date_Get( &p_sys->pts );
 
     es_out_Control( p_demux->out, ES_OUT_SET_PCR, p_block->i_pts );
 
     es_out_Send( p_demux->out, p_sys->p_es, p_block );
+
+    date_Increment( &p_sys->pts, 1 );
+
     return 1;
 }
 
@@ -149,11 +149,14 @@ static void Close ( vlc_object_t * p_this )
  *****************************************************************************/
 static int Control( demux_t *p_demux, int i_query, va_list args )
 {
-    switch( i_query )
-    {
-    default:
-        return demux_vaControlHelper( p_demux->s, 0, -1,
-                                       8*CDG_FRAME_SIZE*CDG_FRAME_RATE, CDG_FRAME_SIZE, i_query, args );
-    }
+    int i_ret = demux_vaControlHelper( p_demux->s, 0, -1,
+                                       8*CDG_FRAME_SIZE*CDG_FRAME_RATE, CDG_FRAME_SIZE,
+                                       i_query, args );
+    if( !i_ret && ( i_query == DEMUX_SET_POSITION || i_query == DEMUX_SET_TIME ) )
+        date_Set( &p_demux->p_sys->pts,
+                  stream_Tell( p_demux->s ) / CDG_FRAME_SIZE *
+                    INT64_C(1000000) / CDG_FRAME_RATE );
+
+    return i_ret;
 }