[vlc-commits] cea708: Render the correct number of lines in BT mode

Devin Heitmueller git at videolan.org
Sat Jan 26 00:36:21 CET 2019


vlc | branch: master | Devin Heitmueller <dheitmueller at ltnglobal.com> | Wed Jan 23 17:09:12 2019 -0500| [b1d1aca72ffaafb5af6abd2308bbc28ebe105fff] | committer: Jean-Baptiste Kempf

cea708: Render the correct number of lines in BT mode

The existing logic was making the decision on which lines to
render based exclusively on the i_firstrow/i_lastrow attributes,
which may be larger than the rowcount specified when the window
is created.  This can result in more lines being rendered than
requested by the sender.

Take into account the window rowcount property to render the
correct number of lines, and in cases where that number is less
than the delta between first/last, make sure to render the
correct subset of lines (i.e. the last N lines in the case of
TB).

Signed-off-by: Devin Heitmueller <dheitmueller at ltnglobal.com>
Signed-off-by: Jean-Baptiste Kempf <jb at videolan.org>

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

 modules/codec/cea708.c | 21 ++++++++++++++++++++-
 1 file changed, 20 insertions(+), 1 deletion(-)

diff --git a/modules/codec/cea708.c b/modules/codec/cea708.c
index 34b2f37d4a..0a4b40ab64 100644
--- a/modules/codec/cea708.c
+++ b/modules/codec/cea708.c
@@ -987,8 +987,27 @@ static void CEA708SpuConvert( const cea708_window_t *p_w,
     if( p_region == NULL && !(p_region = SubpictureUpdaterSysRegionNew()) )
         return;
 
+    int first, last;
+
+    if (p_w->style.scroll_direction == CEA708_WA_DIRECTION_BT) {
+        /* BT is a bit of a special case since we need to grab the last N
+           rows between first and last, rather than the first... */
+        last = p_w->i_lastrow;
+        if (p_w->i_lastrow - p_w->i_row_count < p_w->i_firstrow)
+            first = p_w->i_firstrow;
+        else
+            first = p_w->i_lastrow - p_w->i_row_count + 1;
+
+    } else {
+        first = p_w->i_firstrow;
+        if (p_w->i_firstrow + p_w->i_row_count > p_w->i_lastrow)
+            last = p_w->i_lastrow;
+        else
+            last = p_w->i_firstrow + p_w->i_row_count - 1;
+    }
+
     text_segment_t **pp_last = &p_region->p_segments;
-    for( uint8_t i=p_w->i_firstrow; i<=p_w->i_lastrow; i++ )
+    for( uint8_t i=first; i<=last; i++ )
     {
         if( !p_w->rows[i] )
             continue;



More information about the vlc-commits mailing list