]> git.sesse.net Git - vlc/blobdiff - modules/codec/telx.c
Convert stream to system timestamp after the decoder.
[vlc] / modules / codec / telx.c
index 455f4b9636ad47b14dd2c5a8fefb01c8830007a4..9c6978f0fdb153fc3433023d4508ae18a56c818e 100644 (file)
 #ifdef HAVE_CONFIG_H
 # include "config.h"
 #endif
-
-#include <vlc/vlc.h>
 #include <assert.h>
 #include <stdint.h>
 
+#include <vlc_common.h>
+#include <vlc_plugin.h>
+
 #include "vlc_vout.h"
 #include "vlc_bits.h"
 #include "vlc_codec.h"
@@ -68,7 +69,7 @@ static subpicture_t *Decode( decoder_t *, block_t ** );
         "your subtitles don't appear.")
 
 vlc_module_begin();
-    set_description( _("Teletext subtitles decoder") );
+    set_description( N_("Teletext subtitles decoder") );
     set_shortname( "Teletext" );
     set_capability( "decoder", 50 );
     set_category( CAT_INPUT );
@@ -91,15 +92,15 @@ vlc_module_end();
 struct decoder_sys_t
 {
   int         i_align;
-  bool  b_is_subtitle[9];
+  bool        b_is_subtitle[9];
   char        ppsz_lines[32][128];
   char        psz_prev_text[512];
   mtime_t     prev_pts;
   int         i_page[9];
-  bool  b_erase[9];
-  uint16_t *  pi_active_national_set[9];
+  bool        b_erase[9];
+  const uint16_t *  pi_active_national_set[9];
   int         i_wanted_page, i_wanted_magazine;
-  bool  b_ignore_sub_flag;
+  bool        b_ignore_sub_flag;
 };
 
 /****************************************************************************
@@ -117,7 +118,7 @@ struct decoder_sys_t
  * 0x08 0x09 0x0a 0x0b 0x0c 0x0d (apparently a control character) 0x0e 0x0f
  */
 
-static uint16_t ppi_national_subsets[][20] =
+static const uint16_t ppi_national_subsets[][20] =
 {
   { 0x00a3, 0x0024, 0x0040, 0x00ab, 0x00bd, 0x00bb, 0x005e, 0x0023,
     0x002d, 0x00bc, 0x00a6, 0x00be, 0x00f7 }, /* english ,000 */
@@ -129,7 +130,7 @@ static uint16_t ppi_national_subsets[][20] =
     0x00e9, 0x00e4, 0x00f6, 0x00e5, 0x00fc }, /* swedish,finnish,hungarian ,010 */
 
   { 0x0023, 0x016f, 0x010d, 0x0165, 0x017e, 0x00fd, 0x00ed, 0x0159,
-    0x00e9, 0x00e1, 0x0115, 0x00fa, 0x0161 }, /* czech,slovak  ,011 */
+    0x00e9, 0x00e1, 0x011b, 0x00fa, 0x0161 }, /* czech,slovak  ,011 */
 
   { 0x0023, 0x0024, 0x00a7, 0x00c4, 0x00d6, 0x00dc, 0x005e, 0x005f,
     0x00b0, 0x00e4, 0x00f6, 0x00fc, 0x00df }, /* german ,100 */
@@ -182,10 +183,7 @@ static int Open( vlc_object_t *p_this )
     p_dec->pf_decode_sub = Decode;
     p_sys = p_dec->p_sys = malloc( sizeof(decoder_sys_t) );
     if( p_sys == NULL )
-    {
-        msg_Err( p_dec, "out of memory" );
         return VLC_ENOMEM;
-    }
 
     memset( p_sys, 0, sizeof(decoder_sys_t) );
 
@@ -194,9 +192,10 @@ static int Open( vlc_object_t *p_this )
         p_sys->pi_active_national_set[i] = ppi_national_subsets[1];
 
     var_Create( p_dec, "telx-override-page",
-                VLC_VAR_BOOL | VLC_VAR_DOINHERIT );
+                VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
     var_Get( p_dec, "telx-override-page", &val );
-    if( val.i_int == -1 && p_dec->fmt_in.subs.dvb.i_id != -1 )
+    if( val.i_int == -1 && p_dec->fmt_in.subs.dvb.i_id != -1 
+          && p_dec->fmt_in.subs.dvb.i_id != (1<<16) ) /* ignore if TS demux wants page 100 (unlikely to be sub) */
     {
         p_sys->i_wanted_magazine = p_dec->fmt_in.subs.dvb.i_id >> 16;
         if( p_sys->i_wanted_magazine == 0 )
@@ -232,7 +231,7 @@ static int Open( vlc_object_t *p_this )
     var_Get( p_dec, "telx-ignore-subtitle-flag", &val );
     p_sys->b_ignore_sub_flag = val.b_bool;
 
-    msg_Dbg( p_dec, "starting telx on magazine %d page %x flag %d",
+    msg_Dbg( p_dec, "starting telx on magazine %d page %02x flag %d",
              p_sys->i_wanted_magazine, p_sys->i_wanted_page,
              p_sys->b_ignore_sub_flag );
 
@@ -455,7 +454,8 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block )
     char psz_line[256];
     int i, total;
 
-    if( pp_block == NULL || *pp_block == NULL ) return NULL;
+    if( pp_block == NULL || *pp_block == NULL )
+        return NULL;
     p_block = *pp_block;
     *pp_block = NULL;
 
@@ -705,7 +705,7 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block )
     fmt.i_aspect = 0;
     fmt.i_width = fmt.i_height = 0;
     fmt.i_x_offset = fmt.i_y_offset = 0;
-    p_spu->p_region = p_spu->pf_create_region( VLC_OBJECT(p_dec), &fmt );
+    p_spu->p_region = subpicture_region_New( &fmt );
     if( p_spu->p_region == NULL )
     {
         msg_Err( p_dec, "cannot allocate SPU region" );
@@ -714,15 +714,14 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block )
 
     /* Normal text subs, easy markup */
     p_spu->p_region->i_align = SUBPICTURE_ALIGN_BOTTOM | p_sys->i_align;
-    p_spu->i_x = p_sys->i_align ? 20 : 0;
-    p_spu->i_y = 10;
-
+    p_spu->p_region->i_x = p_sys->i_align ? 20 : 0;
+    p_spu->p_region->i_y = 10;
     p_spu->p_region->psz_text = strdup(psz_text);
+
     p_spu->i_start = p_block->i_pts;
     p_spu->i_stop = p_block->i_pts + p_block->i_length;
     p_spu->b_ephemer = (p_block->i_length == 0);
     p_spu->b_absolute = false;
-    p_spu->b_pausable = true;
     dbg((p_dec, "%ld --> %ld\n", (long int) p_block->i_pts/100000, (long int)p_block->i_length/100000));
 
     block_Release( p_block );