[vlc-commits] codec: cc: fix margins, shrink regions

Francois Cartegnie git at videolan.org
Wed Jan 11 22:50:57 CET 2017


vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Wed Jan 11 22:42:38 2017 +0100| [3a845cde382185f228db33e308abfab2ce3048a7] | committer: Francois Cartegnie

codec: cc: fix margins, shrink regions

Should now only send regions for grouped lines of text.
Removes the dirty newline hack for positioning.

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

 modules/codec/cc.c | 123 +++++++++++++++++++++++++++++++----------------------
 1 file changed, 71 insertions(+), 52 deletions(-)

diff --git a/modules/codec/cc.c b/modules/codec/cc.c
index c58c9f9..68a370f 100644
--- a/modules/codec/cc.c
+++ b/modules/codec/cc.c
@@ -205,7 +205,7 @@ typedef struct
 
 static void         Eia608Init( eia608_t * );
 static eia608_status_t Eia608Parse( eia608_t *h, int i_channel_selected, const uint8_t data[2] );
-static text_segment_t *Eia608Text( eia608_t *h );
+static void         Eia608FillUpdaterRegions( subpicture_updater_sys_t *p_updater, eia608_t *h );
 
 /* It will be enough up to 63 B frames, which is far too high for
  * broadcast environment */
@@ -405,26 +405,20 @@ static block_t *Pop( decoder_t *p_dec )
     return p_block;
 }
 
-static subpicture_t *Subtitle( decoder_t *p_dec, text_segment_t *p_segments, mtime_t i_pts )
+static subpicture_t *Subtitle( decoder_t *p_dec, eia608_t *h, mtime_t i_pts )
 {
     //decoder_sys_t *p_sys = p_dec->p_sys;
     subpicture_t *p_spu = NULL;
 
     /* We cannot display a subpicture with no date */
     if( i_pts <= VLC_TS_INVALID )
-    {
-        msg_Warn( p_dec, "subtitle without a date" );
-        text_segment_ChainDelete( p_segments );
         return NULL;
-    }
 
     /* Create the subpicture unit */
     p_spu = decoder_NewSubpictureText( p_dec );
     if( !p_spu )
-    {
-        text_segment_ChainDelete( p_segments );
         return NULL;
-    }
+
     p_spu->i_start    = i_pts;
     p_spu->i_stop     = i_pts + 10000000;   /* 10s max */
     p_spu->b_ephemer  = true;
@@ -434,8 +428,8 @@ static subpicture_t *Subtitle( decoder_t *p_dec, text_segment_t *p_segments, mti
 
     /* The "leavetext" alignment is a special mode where the subpicture
        region itself gets aligned, but the text inside it does not */
+    p_spu_sys->region.align = SUBPICTURE_ALIGN_TOP;
     p_spu_sys->region.inner_align = SUBPICTURE_ALIGN_LEAVETEXT;
-    p_spu_sys->region.p_segments = p_segments;
     p_spu_sys->region.flags = UPDT_REGION_IGNORE_BACKGROUND | UPDT_REGION_USES_GRID_COORDINATES;
     /* Set style defaults (will be added to segments if none set) */
     p_spu_sys->p_default_style->i_style_flags |= STYLE_MONOSPACED;
@@ -450,6 +444,8 @@ static subpicture_t *Subtitle( decoder_t *p_dec, text_segment_t *p_segments, mti
     p_spu_sys->p_default_style->f_font_relsize = 100 * 8 / 10 / EIA608_SCREEN_ROWS;
     p_spu_sys->p_default_style->i_features |= (STYLE_HAS_FONT_COLOR | STYLE_HAS_FLAGS);
 
+    Eia608FillUpdaterRegions( p_spu_sys, h );
+
     return p_spu;
 }
 
@@ -498,8 +494,7 @@ static subpicture_t *Convert( decoder_t *p_dec, block_t **pp_block )
      */
     if( i_status & (EIA608_STATUS_DISPLAY | EIA608_STATUS_CHANGED) )
     {
-        text_segment_t *p_segments = Eia608Text( &p_sys->eia608 );
-        return Subtitle( p_dec, p_segments, i_pts );
+        return Subtitle( p_dec, &p_sys->eia608, i_pts );
     }
     return NULL;
 }
@@ -1021,7 +1016,7 @@ static void Eia608Strlcat( char *d, const char *s, int i_max )
 
 #define CAT(t) Eia608Strlcat( psz_text, t, i_text_max )
 
-static text_segment_t * Eia608TextLine( struct eia608_screen *screen, int i_row, bool b_endline )
+static text_segment_t * Eia608TextLine( struct eia608_screen *screen, int i_row )
 {
     const uint8_t *p_char = screen->characters[i_row];
     const eia608_color_t *p_color = screen->colors[i_row];
@@ -1037,19 +1032,6 @@ static text_segment_t * Eia608TextLine( struct eia608_screen *screen, int i_row,
     char psz_text[i_text_max + 1];
     psz_text[0] = '\0';
 
-    text_segment_t *p_segment, *p_segments_head = p_segment = text_segment_New( NULL );
-    if(!p_segment)
-        return NULL;
-
-    p_segment->style = text_style_Create( STYLE_NO_DEFAULTS );
-    if(!p_segment->style)
-    {
-        text_segment_Delete(p_segment);
-        return NULL;
-    }
-    /* Ensure we get a monospaced font (required for accurate positioning */
-    p_segment->style->i_style_flags |= STYLE_MONOSPACED;
-
     /* Search the start */
     i_start = 0;
 
@@ -1067,6 +1049,21 @@ static text_segment_t * Eia608TextLine( struct eia608_screen *screen, int i_row,
         i_end--;
 
     /* */
+    if( i_start > i_end ) /* Nothing to render */
+        return NULL;
+
+    text_segment_t *p_segment, *p_segments_head = p_segment = text_segment_New( NULL );
+    if(!p_segment)
+        return NULL;
+
+    p_segment->style = text_style_Create( STYLE_NO_DEFAULTS );
+    if(!p_segment->style)
+    {
+        text_segment_Delete(p_segment);
+        return NULL;
+    }
+    /* Ensure we get a monospaced font (required for accurate positioning */
+    p_segment->style->i_style_flags |= STYLE_MONOSPACED;
 
     for( x = i_start; x <= i_end; x++ )
     {
@@ -1118,11 +1115,6 @@ static text_segment_t * Eia608TextLine( struct eia608_screen *screen, int i_row,
         prev_color = color;
     }
 
-    if(b_endline)
-    {
-        CAT( "\n" );
-    }
-
 #undef CAT
 
     if( p_segment )
@@ -1135,6 +1127,54 @@ static text_segment_t * Eia608TextLine( struct eia608_screen *screen, int i_row,
     return p_segments_head;
 }
 
+static void Eia608FillUpdaterRegions( subpicture_updater_sys_t *p_updater, eia608_t *h )
+{
+    struct eia608_screen *screen = &h->screen[h->i_screen];
+    subpicture_updater_sys_region_t *p_region = &p_updater->region;
+    text_segment_t **pp_last = &p_region->p_segments;
+    bool b_newregion = false;
+
+    for( int i = 0; i < EIA608_SCREEN_ROWS; i++ )
+    {
+        if( !screen->row_used[i] )
+            continue;
+
+        text_segment_t *p_segments = Eia608TextLine( screen, i );
+        if( p_segments )
+        {
+            if( b_newregion )
+            {
+                p_region = SubpictureUpdaterSysRegionNew();
+                if( !p_region )
+                {
+                    text_segment_ChainDelete( p_segments );
+                    return;
+                }
+                pp_last = &p_region->p_segments;
+                b_newregion = false;
+            }
+
+            if( p_region->p_segments == NULL ) /* First segment in the [new] region */
+            {
+                p_region->origin.y = i; /* set start line number */
+            }
+            else /* Insert line break between region lines */
+            {
+                *pp_last = text_segment_New( "\n" );
+                if( *pp_last )
+                    pp_last = &((*pp_last)->p_next);
+            }
+
+            *pp_last = p_segments;
+            do { pp_last = &((*pp_last)->p_next); } while ( *pp_last != NULL );
+        }
+        else
+        {
+            b_newregion = !!p_region->p_segments;
+        }
+    }
+}
+
 /* */
 static void Eia608Init( eia608_t *h )
 {
@@ -1187,24 +1227,3 @@ static eia608_status_t Eia608Parse( eia608_t *h, int i_channel_selected, const u
     }
     return i_screen_status;
 }
-
-static text_segment_t *Eia608Text( eia608_t *h )
-{
-    struct eia608_screen *screen = &h->screen[h->i_screen];
-    text_segment_t *p_head = NULL, *p_last = NULL;
-
-    for( int i = 0; i < EIA608_SCREEN_ROWS; i++ )
-    {
-        text_segment_t *p_line = Eia608TextLine( screen, i, (i + 1 != EIA608_SCREEN_ROWS) );
-        if(p_line)
-        {
-            if(!p_head)
-                p_head = p_line;
-            else
-                p_last->p_next = p_line;
-            p_last = p_line;
-        }
-    }
-
-    return p_head;
-}



More information about the vlc-commits mailing list