[vlc-devel] commit: Renamed p_display to display, and made it a structure... ( Simon Hailes )

git version control git at videolan.org
Fri Sep 25 18:17:54 CEST 2009


vlc | branch: master | Simon Hailes <simon at screen.subtitling.com> | Tue Sep 22 00:19:09 2009 +0100| [7fcd1c9138717d6aaf166a60675177cc0f3db962] | committer: Rémi Denis-Courmont 

Renamed p_display to display, and made it a structure...

...not a pointer, so it's persistent. Also removes multiple free issues
previously causing crashes.

Signed-off-by: Rémi Denis-Courmont <remi at remlab.net>

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=7fcd1c9138717d6aaf166a60675177cc0f3db962
---

 modules/codec/dvbsub.c |   99 +++++++++++++++++++++++++++---------------------
 1 files changed, 56 insertions(+), 43 deletions(-)

diff --git a/modules/codec/dvbsub.c b/modules/codec/dvbsub.c
index 8e90df8..8b15708 100644
--- a/modules/codec/dvbsub.c
+++ b/modules/codec/dvbsub.c
@@ -234,7 +234,8 @@ struct decoder_sys_t
     dvbsub_page_t   *p_page;
     dvbsub_region_t *p_regions;
     dvbsub_clut_t   *p_cluts;
-    dvbsub_display_t *p_display;
+    /* this is very small, so keep forever */
+    dvbsub_display_t display;
     dvbsub_clut_t    default_clut;
 };
 
@@ -279,6 +280,7 @@ static void decode_clut( decoder_t *, bs_t * );
 static void free_all( decoder_t * );
 
 static void default_clut_init( decoder_t * );
+static void default_dds_init( decoder_t * );
 
 static subpicture_t *render( decoder_t * );
 
@@ -313,7 +315,9 @@ static int Open( vlc_object_t *p_this )
     p_sys->p_regions      = NULL;
     p_sys->p_cluts        = NULL;
     p_sys->p_page         = NULL;
-    p_sys->p_display      = NULL;
+
+    /* configure for SD res in case DDS is not present */
+    default_dds_init( p_dec );
 
     var_Create( p_this, DVBSUB_CFG_PREFIX "position",
                 VLC_VAR_INTEGER | VLC_VAR_DOINHERIT );
@@ -376,6 +380,11 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block )
     p_block = *pp_block;
     *pp_block = NULL;
 
+    /* configure for SD res in case DDS is not present */
+    /* a change of PTS is a good indication we must get a new DDS */
+    if (p_sys->i_pts != p_block->i_pts)
+        default_dds_init( p_dec );
+
     p_sys->i_pts = p_block->i_pts;
     if( p_sys->i_pts <= 0 )
     {
@@ -952,15 +961,13 @@ static void decode_display_definition( decoder_t *p_dec, bs_t *s )
     decoder_sys_t *p_sys = p_dec->p_sys;
     uint16_t      i_segment_length;
     uint16_t      i_processed_length = 40;
-    dvbsub_display_t *p_display;
-    dvbsub_display_t *p_old = p_sys->p_display;
     int           i_version;
 
     i_segment_length = bs_read( s, 16 );
     i_version        = bs_read( s, 4 );
 
     /* Check version number */
-    if( p_old && ( p_old->i_version == i_version ) )
+    if( p_sys->display.i_version == i_version )
     {
         /* The definition did not change */
         bs_skip( s, 8*i_segment_length - 4 );
@@ -970,33 +977,27 @@ static void decode_display_definition( decoder_t *p_dec, bs_t *s )
 #ifdef DEBUG_DVBSUB
     msg_Dbg( p_dec, "new display definition: %i", i_version );
 #endif
-    p_display = malloc( sizeof(dvbsub_display_t) );
-    if( p_display )
-    {
-        /* We don't have this version of the display definition: Parse it */
-        p_display->i_version = i_version;
-        p_display->b_windowed = bs_read( s, 1 );
-        bs_skip( s, 3 ); /* Reserved bits */
-        p_display->i_width = bs_read( s, 16 )+1;
-        p_display->i_height = bs_read( s, 16 )+1;
 
-        if( p_display->b_windowed )
-        {
+    /* We don't have this version of the display definition: Parse it */
+    p_sys->display.i_version = i_version;
+    p_sys->display.b_windowed = bs_read( s, 1 );
+    bs_skip( s, 3 ); /* Reserved bits */
+    p_sys->display.i_width = bs_read( s, 16 )+1;
+    p_sys->display.i_height = bs_read( s, 16 )+1;
+
+    if( p_sys->display.b_windowed )
+    {
 #ifdef DEBUG_DVBSUB
-            msg_Dbg( p_dec, "display definition with offsets (windowed)" );
+        msg_Dbg( p_dec, "display definition with offsets (windowed)" );
 #endif
-            /* Coordinates are measured from the top left corner */
-            p_display->i_x     = bs_read( s, 16 );
-            p_display->i_max_x = bs_read( s, 16 );
-            p_display->i_y     = bs_read( s, 16 );
-            p_display->i_max_y = bs_read( s, 16 );
-            i_processed_length += 64;
-        }
+        /* Coordinates are measured from the top left corner */
+        p_sys->display.i_x     = bs_read( s, 16 );
+        p_sys->display.i_max_x = bs_read( s, 16 );
+        p_sys->display.i_y     = bs_read( s, 16 );
+        p_sys->display.i_max_y = bs_read( s, 16 );
+        i_processed_length += 64;
     }
 
-    p_sys->p_display = p_display;
-    free( p_old );
-
     if( i_processed_length != i_segment_length*8 )
     {
         msg_Err( p_dec, "processed length %d != segment length %d",
@@ -1005,10 +1006,10 @@ static void decode_display_definition( decoder_t *p_dec, bs_t *s )
 
 #ifdef DEBUG_DVBSUB
     msg_Dbg( p_dec, "version: %d, width: %d, height: %d",
-             p_display->i_version, p_display->i_width, p_display->i_height );
-    if( p_display->b_windowed )
+             p_sys->display.i_version, p_sys->display.i_width, p_sys->display.i_height );
+    if( p_sys->display.b_windowed )
         msg_Dbg( p_dec, "xmin: %d, xmax: %d, ymin: %d, ymax: %d",
-                 p_display->i_x, p_display->i_max_x, p_display->i_y, p_display->i_max_y );
+                 p_sys->display.i_x, p_sys->display.i_max_x, p_sys->display.i_y, p_sys->display.i_max_y );
 #endif
 }
 
@@ -1409,7 +1410,7 @@ static void free_all( decoder_t *p_dec )
     dvbsub_region_t *p_reg, *p_reg_next;
     dvbsub_clut_t *p_clut, *p_clut_next;
 
-    free( p_sys->p_display );
+    /*free( p_sys->p_display ); No longer malloced */
 
     for( p_clut = p_sys->p_cluts; p_clut != NULL; p_clut = p_clut_next )
     {
@@ -1468,19 +1469,16 @@ static subpicture_t *render( decoder_t *p_dec )
     p_spu->i_original_picture_width = 720;
     p_spu->i_original_picture_height = 576;
 
-    if( p_sys->p_display )
-    {
-        p_spu->i_original_picture_width = p_sys->p_display->i_width;
-        p_spu->i_original_picture_height = p_sys->p_display->i_height;
+    p_spu->i_original_picture_width = p_sys->display.i_width;
+    p_spu->i_original_picture_height = p_sys->display.i_height;
 
-        if( p_sys->p_display->b_windowed )
-        {
-            /* TODO: check that this actually works */
-            p_spu->i_original_picture_width = p_sys->p_display->i_max_x - p_sys->p_display->i_x;
-            p_spu->i_original_picture_height = p_sys->p_display->i_max_y - p_sys->p_display->i_y;
-            i_base_x += p_sys->p_display->i_x;
-            i_base_y += p_sys->p_display->i_y;
-        }
+    if( p_sys->display.b_windowed )
+    {
+        /* TODO: check that this actually works */
+        p_spu->i_original_picture_width = p_sys->display.i_max_x - p_sys->display.i_x;
+        p_spu->i_original_picture_height = p_sys->display.i_max_y - p_sys->display.i_y;
+        i_base_x += p_sys->display.i_x;
+        i_base_y += p_sys->display.i_y;
     }
 
     pp_spu_region = &p_spu->p_region;
@@ -2608,3 +2606,18 @@ static void encode_pixel_line_8bp( bs_t *s, subpicture_region_t *p_region,
     /* Stuffing */
     bs_align_0( s );
 }
+
+
+static void default_dds_init( decoder_t * p_dec )
+{
+    decoder_sys_t *p_sys = p_dec->p_sys;
+
+    /* see notes on DDS at the top of the file */
+
+    /* configure for SD res in case DDS is not present */
+    p_sys->display.i_version = 0xff; /* an invalid version so it's always different */
+    p_sys->display.i_width = 720;
+    p_sys->display.i_height = 576;
+    p_sys->display.b_windowed = false;
+}
+




More information about the vlc-devel mailing list