]> git.sesse.net Git - vlc/blobdiff - modules/demux/vobsub.c
vobsub: strdup memleak (stream_Add copies the format)
[vlc] / modules / demux / vobsub.c
index c52e19f578097228ceb990718d3c9e3bb96f3164..6b9088db924adb79bc3633dd5f2b219047952d98 100644 (file)
@@ -40,6 +40,7 @@
 #include <vlc_charset.h>
 
 #include "ps.h"
+#include "vobsub.h"
 
 #define MAX_LINE 8192
 
@@ -472,6 +473,7 @@ static int ParseVobSubIDX( demux_t *p_demux )
     demux_sys_t *p_sys = p_demux->p_sys;
     text_t      *txt = &p_sys->txt;
     char        *line;
+    vobsub_track_t *current_tk = NULL;
 
     for( ;; )
     {
@@ -487,8 +489,8 @@ static int ParseVobSubIDX( demux_t *p_demux )
         else if( !strncmp( "size:", line, 5 ) )
         {
             /* Store the original size of the video */
-            if( sscanf( line, "size: %dx%d",
-                        &p_sys->i_original_frame_width, &p_sys->i_original_frame_height ) == 2 )
+            if( vobsub_size_parse( line, &p_sys->i_original_frame_width,
+                                   &p_sys->i_original_frame_height ) == VLC_SUCCESS )
             {
                 msg_Dbg( p_demux, "original frame size: %dx%d", p_sys->i_original_frame_width, p_sys->i_original_frame_height );
             }
@@ -499,33 +501,8 @@ static int ParseVobSubIDX( demux_t *p_demux )
         }
         else if( !strncmp( "palette:", line, 8 ) )
         {
-            int i;
-
-            /* Store the palette of the subs */
-            if( sscanf( line, "palette: %x, %x, %x, %x, %x, %x, %x, %x, %x, %x, %x, %x, %x, %x, %x, %x",
-                        &p_sys->palette[0], &p_sys->palette[1], &p_sys->palette[2], &p_sys->palette[3],
-                        &p_sys->palette[4], &p_sys->palette[5], &p_sys->palette[6], &p_sys->palette[7],
-                        &p_sys->palette[8], &p_sys->palette[9], &p_sys->palette[10], &p_sys->palette[11],
-                        &p_sys->palette[12], &p_sys->palette[13], &p_sys->palette[14], &p_sys->palette[15] ) == 16 )
+            if( vobsub_palette_parse( line, p_sys->palette ) == VLC_SUCCESS )
             {
-                for( i = 0; i < 16; i++ )
-                {
-                    uint8_t r = 0, g = 0, b = 0;
-                    uint8_t y = 0, u = 0, v = 0;
-                    r = (p_sys->palette[i] >> 16) & 0xff;
-                    g = (p_sys->palette[i] >> 8) & 0xff;
-                    b = (p_sys->palette[i] >> 0) & 0xff;
-                    /* msg_Dbg( p_demux, "palette %d: R=%x, G=%x, B=%x", i, r, g, b ); */
-                    y = (uint8_t) __MIN(abs(r * 2104 + g * 4130 + b * 802 + 4096 + 131072) >> 13, 235);
-                    u = (uint8_t) __MIN(abs(r * -1214 + g * -2384 + b * 3598 + 4096 + 1048576) >> 13, 240);
-                    v = (uint8_t) __MIN(abs(r * 3598 + g * -3013 + b * -585 + 4096 + 1048576) >> 13, 240);
-                    p_sys->palette[i] = 0;
-                    p_sys->palette[i] |= (y&0xff)<<16;
-                    p_sys->palette[i] |= (u&0xff);
-                    p_sys->palette[i] |= (v&0xff)<<8;
-                    /* msg_Dbg( p_demux, "palette %d: y=%x, u=%x, v=%x", i, y, u, v ); */
-
-                }
                 p_sys->b_palette = true;
                 msg_Dbg( p_demux, "vobsub palette read" );
             }
@@ -536,7 +513,7 @@ static int ParseVobSubIDX( demux_t *p_demux )
         }
         else if( !strncmp( "id:", line, 3 ) )
         {
-            char language[20];
+            char language[3];
             int i_track_id;
             es_format_t fmt;
 
@@ -546,9 +523,10 @@ static int ParseVobSubIDX( demux_t *p_demux )
             {
                 p_sys->i_tracks++;
                 p_sys->track = realloc( p_sys->track, sizeof( vobsub_track_t ) * (p_sys->i_tracks + 1 ) );
+                language[2] = '\0';
 
                 /* Init the track */
-                vobsub_track_t *current_tk = &p_sys->track[p_sys->i_tracks - 1];
+                current_tk = &p_sys->track[p_sys->i_tracks - 1];
                 memset( current_tk, 0, sizeof( vobsub_track_t ) );
                 current_tk->i_current_subtitle = 0;
                 current_tk->i_subtitles = 0;
@@ -556,10 +534,10 @@ static int ParseVobSubIDX( demux_t *p_demux )
                 current_tk->i_track_id = i_track_id;
                 current_tk->i_delay = (int64_t)0;
 
-                es_format_Init( &fmt, SPU_ES, VLC_FOURCC( 's','p','u',' ' ) );
+                es_format_Init( &fmt, SPU_ES, VLC_CODEC_SPU );
                 fmt.subs.spu.i_original_frame_width = p_sys->i_original_frame_width;
                 fmt.subs.spu.i_original_frame_height = p_sys->i_original_frame_height;
-                fmt.psz_language = strdup( language );
+                fmt.psz_language = language;
                 if( p_sys->b_palette )
                 {
                     fmt.subs.spu.palette[0] = 0xBeef;