[vlc-devel] [PATCH] dvbsub.c : Don't fill region if page_state == 0

Björn Stenberg bjorn at haxx.se
Tue Jun 8 20:37:13 CEST 2010


Hi.

I've been working a little with DVB subtitling and found that if the region_fill bit is set, vlc always fills the whole area on every region update and thus overwrites any data previously rendered. This behaviour breaks "live" subtitling where words are recieved one at a time and added to an existing region.

My interpretation of ETSI EN 300 743 is that the region_fill_flag of a region composition segment should not cause the region to be filled when the containing page composition segment has its' page_state variable set to 0 (page update).

I suggest something like this:

diff --git a/modules/codec/dvbsub.c b/modules/codec/dvbsub.c
index fb7619c..2882dbc 100644
--- a/modules/codec/dvbsub.c
+++ b/modules/codec/dvbsub.c
@@ -840,7 +840,8 @@ static void decode_region_composition( decoder_t *p_dec,
     int i_segment_length, i_processed_length, i_id, i_version;
     int i_width, i_height, i_level_comp, i_depth, i_clut;
     int i_8_bg, i_4_bg, i_2_bg;
-    bool b_fill;
+    bool b_region_fill, b_fill = false;
+    decoder_page_t *p_page = p_sys->p_page;
 
     i_segment_length = bs_read( s, 16 );
     i_id = bs_read( s, 8 );
@@ -877,7 +878,7 @@ static void decode_region_composition( decoder_t *p_dec,
     /* Region attributes */
     p_region->i_id = i_id;
     p_region->i_version = i_version;
-    b_fill = bs_read( s, 1 );
+    b_region_fill = bs_read( s, 1 );
     bs_skip( s, 3 ); /* Reserved */
 
     i_width = bs_read( s, 16 );
@@ -917,6 +918,10 @@ static void decode_region_composition( decoder_t *p_dec,
         p_region->i_depth = 0;
         b_fill = true;
     }
+    else
+        if (b_region_fill && p_page->page_state != 0)
+            b_fill = true;
+
     if( p_region->i_depth &&
         ( ( p_region->i_depth != i_depth ) ||
           ( p_region->i_level_comp != i_level_comp ) ||

-- 
Björn



More information about the vlc-devel mailing list