]> git.sesse.net Git - vlc/blobdiff - modules/codec/svcdsub.c
Split SPS/PPS parsing and annex b conversion to a reusable utility function
[vlc] / modules / codec / svcdsub.c
index 6afddccc582b0fef7743b98eaf2e8c66259f6e2c..5467c0e78987d05eb104882df1f9c206813ac747 100644 (file)
@@ -34,8 +34,7 @@
 #include <vlc_common.h>
 #include <vlc_plugin.h>
 #include <vlc_codec.h>
-#include <vlc_osd.h>
-#include "vlc_bits.h"
+#include <vlc_bits.h>
 
 /*****************************************************************************
  * Module descriptor.
@@ -44,13 +43,6 @@ static int  DecoderOpen   ( vlc_object_t * );
 static int  PacketizerOpen( vlc_object_t * );
 static void DecoderClose  ( vlc_object_t * );
 
-#define DEBUG_TEXT N_("Enable debug")
-
-#define DEBUG_LONGTEXT  \
-    N_("This integer when viewed in binary is a debugging mask\n" \
-    "calls                 1\n" \
-    "packet assembly info  2\n" )
-
 vlc_module_begin ()
     set_description( N_("Philips OGT (SVCD subtitle) decoder") )
     set_shortname( N_("SVCD subtitles") )
@@ -59,8 +51,7 @@ vlc_module_begin ()
     set_capability( "decoder", 50 )
     set_callbacks( DecoderOpen, DecoderClose )
 
-    add_integer ( MODULE_STRING "-debug", 0, NULL,
-                  DEBUG_TEXT, DEBUG_LONGTEXT, true )
+    add_obsolete_integer ( MODULE_STRING "-debug" )
 
     add_submodule ()
     set_description( N_("Philips OGT (SVCD subtitle) packetizer") )
@@ -78,9 +69,6 @@ static void ParseHeader( decoder_t *, block_t * );
 static subpicture_t *DecodePacket( decoder_t *, block_t * );
 static void SVCDSubRenderImage( decoder_t *, block_t *, subpicture_region_t * );
 
-#define DECODE_DBG_CALL        1 /* calls */
-#define DECODE_DBG_PACKET      2 /* packet assembly info */
-
 #define GETINT16(p) ( (p[0] <<  8) +   p[1] )  ; p +=2;
 
 #define GETINT32(p) ( (p[0] << 24) +  (p[1] << 16) +    \
@@ -92,21 +80,15 @@ typedef enum  {
   SUBTITLE_BLOCK_COMPLETE = 2
 } packet_state_t;
 
-#ifndef DECODE_DEBUG
-#define DECODE_DEBUG 1
-#endif
-#if DECODE_DEBUG
-#define dbg_print(mask, s, args...) \
-   if (p_sys && p_sys->i_debug & mask) \
+#ifndef NDEBUG
+# define dbg_print( s, args...) \
      msg_Dbg(p_dec, "%s: "s, __func__ , ##args)
 #else
-#define dbg_print(mask, s, args...)
+# define dbg_print( s, args...)
 #endif
 
 struct decoder_sys_t
 {
-  int      i_debug;       /* debugging mask */
-
   packet_state_t i_state; /* data-gathering state for this subtitle */
 
   block_t  *p_spu;        /* Bytes of the packet. */
@@ -149,9 +131,8 @@ static int DecoderOpen( vlc_object_t *p_this )
     if( p_sys == NULL )
         return VLC_ENOMEM;
 
-    p_sys->i_debug       = config_GetInt( p_this, MODULE_STRING "-debug" );
 
-    p_sys->i_image       = -1;
+    p_sys->i_image = -1;
 
     p_sys->i_state = SUBTITLE_BLOCK_EMPTY;
     p_sys->p_spu   = NULL;
@@ -161,7 +142,6 @@ static int DecoderOpen( vlc_object_t *p_this )
     p_dec->pf_decode_sub = Decode;
     p_dec->pf_packetize  = Packetize;
 
-    dbg_print( (DECODE_DBG_CALL) , "");
     return VLC_SUCCESS;
 }
 
@@ -193,9 +173,8 @@ void DecoderClose( vlc_object_t *p_this )
 static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block )
 {
     block_t *p_block, *p_spu;
-    decoder_sys_t *p_sys = p_dec->p_sys;
 
-    dbg_print( (DECODE_DBG_CALL) , "");
+    dbg_print( "" );
 
     if( pp_block == NULL || *pp_block == NULL ) return NULL;
 
@@ -260,6 +239,12 @@ static block_t *Reassemble( decoder_t *p_dec, block_t *p_block )
     uint16_t i_expected_image;
     uint8_t  i_packet, i_expected_packet;
 
+    if( p_block->i_flags & (BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) )
+    {
+        block_Release( p_block );
+        return NULL;
+    }
+
     if( p_block->i_buffer < SPU_HEADER_LEN )
     {
         msg_Dbg( p_dec, "invalid packet header (size %zu < %u)" ,
@@ -270,34 +255,6 @@ static block_t *Reassemble( decoder_t *p_dec, block_t *p_block )
 
     p_buffer = p_block->p_buffer;
 
-    /* Attach to our input thread and see if subtitle is selected. */
-    {
-        vlc_object_t * p_input;
-        vlc_value_t val;
-
-        p_input = vlc_object_find( p_dec, VLC_OBJECT_INPUT, FIND_PARENT );
-
-        if( !p_input ) return NULL;
-
-        if( var_Get( p_input, "sub-track", &val ) )
-        {
-            vlc_object_release( p_input );
-            return NULL;
-        }
-
-        vlc_object_release( p_input );
-        dbg_print( (DECODE_DBG_PACKET),
-                   "val.i_int %x p_buffer[i] %x", val.i_int, p_buffer[1]);
-
-        /* The dummy ES that the menu selection uses has an 0x70 at
-           the head which we need to strip off. */
-        if( val.i_int == -1 || (val.i_int & 0x03) != p_buffer[1] )
-        {
-            dbg_print( DECODE_DBG_PACKET, "subtitle not for us.\n");
-            return NULL;
-        }
-    }
-
     if( p_sys->i_state == SUBTITLE_BLOCK_EMPTY )
     {
         i_expected_image  = p_sys->i_image + 1;
@@ -309,6 +266,8 @@ static block_t *Reassemble( decoder_t *p_dec, block_t *p_block )
         i_expected_packet = p_sys->i_packet + 1;
     }
 
+    /* The dummy ES that the menu selection uses has an 0x70 at
+       the head which we need to strip off. */
     p_buffer += 2;
 
     if( *p_buffer & 0x80 )
@@ -355,8 +314,7 @@ static block_t *Reassemble( decoder_t *p_dec, block_t *p_block )
                       p_spu->i_buffer, p_sys->i_spu_size );
         }
 
-    dbg_print( (DECODE_DBG_PACKET),
-                 "subtitle packet complete, size=%zu", p_spu->i_buffer );
+        dbg_print( "subtitle packet complete, size=%zu", p_spu->i_buffer );
 
         p_sys->i_state = SUBTITLE_BLOCK_EMPTY;
         p_sys->p_spu = 0;
@@ -435,22 +393,21 @@ static void ParseHeader( decoder_t *p_dec, block_t *p_block )
     p_sys->i_image_length  = p_sys->i_spu_size - p_sys->i_image_offset;
     p_sys->metadata_length = p_sys->i_image_offset;
 
-  if( p_sys->i_debug & DECODE_DBG_PACKET )
-  {
-      msg_Dbg( p_dec, "x-start: %d, y-start: %d, width: %d, height %d, "
-           "spu size: %zu, duration: %"PRIu64" (d:%zu p:%"PRIu16")",
-           p_sys->i_x_start, p_sys->i_y_start,
-           p_sys->i_width, p_sys->i_height,
-           p_sys->i_spu_size, p_sys->i_duration,
-           p_sys->i_image_length, p_sys->i_image_offset);
-
-      for( i = 0; i < 4; i++ )
-      {
-          msg_Dbg( p_dec, "palette[%d]= T: %2x, Y: %2x, u: %2x, v: %2x", i,
-           p_sys->p_palette[i][3], p_sys->p_palette[i][0],
-           p_sys->p_palette[i][1], p_sys->p_palette[i][2] );
-      }
-  }
+#ifndef NDEBUG
+    msg_Dbg( p_dec, "x-start: %d, y-start: %d, width: %d, height %d, "
+             "spu size: %zu, duration: %"PRIu64" (d:%zu p:%"PRIu16")",
+             p_sys->i_x_start, p_sys->i_y_start,
+             p_sys->i_width, p_sys->i_height,
+             p_sys->i_spu_size, p_sys->i_duration,
+             p_sys->i_image_length, p_sys->i_image_offset);
+
+    for( i = 0; i < 4; i++ )
+    {
+        msg_Dbg( p_dec, "palette[%d]= T: %2x, Y: %2x, u: %2x, v: %2x", i,
+                 p_sys->p_palette[i][3], p_sys->p_palette[i][0],
+                 p_sys->p_palette[i][1], p_sys->p_palette[i][2] );
+    }
+#endif
 }
 
 /*****************************************************************************
@@ -469,7 +426,7 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, block_t *p_data )
     int i;
 
     /* Allocate the subpicture internal data. */
-    p_spu = decoder_NewSubpicture( p_dec );
+    p_spu = decoder_NewSubpicture( p_dec, NULL );
     if( !p_spu ) return NULL;
 
     p_spu->i_start = p_data->i_pts;
@@ -488,7 +445,8 @@ static subpicture_t *DecodePacket( decoder_t *p_dec, block_t *p_data )
        Two candidates are the video and the other possibility would be
        the access module.
     */
-    fmt.i_aspect = VOUT_ASPECT_FACTOR;
+    fmt.i_sar_num = p_sys->i_height;
+    fmt.i_sar_den = p_sys->i_width;
 
     fmt.i_width = fmt.i_visible_width = p_sys->i_width;
     fmt.i_height = fmt.i_visible_height = p_sys->i_height;