[vlc-devel] [PATCH] fix teletext framing code in DVB PES packets ignored

Miha Sokolov newsletter at fab-online.com
Fri Mar 20 11:38:51 CET 2015


Check the teletext framing code in PES buffer for each of the received lines 
and only copy those with correct framing code (p_block->p_buffer[3]) to the 
p_sliced buffer that is later forwarded to ZVBI vbi_decode. Invalid lines 
will not reach vbi_decode anymore.

When also packets with erroneous framing code are sent to vbi_decode (often 
0x00 with some noise), in most cases those are decoded as packet 1/2, 
causing the second text line on the teletext page to be overwritten with 
spaces. So we need to avoid sending such packets with invalid framing code 
to vbi_decode.

close #14191
---
modules/codec/zvbi.c | 23 +++++++++++++----------
1 file changed, 13 insertions(+), 10 deletions(-)

diff --git a/modules/codec/zvbi.c b/modules/codec/zvbi.c
--- a/modules/codec/zvbi.c
+++ b/modules/codec/zvbi.c
@@ -331,17 +331,20 @@

             if( ( i_id == 0x02 || i_id == 0x03 ) && i_size >= 44 && i_lines < MAX_SLICES )
             {
-                unsigned line_offset  = p_block->p_buffer[2] & 0x1f;
-                unsigned field_parity = p_block->p_buffer[2] & 0x20;
+                if(p_block->p_buffer[3] == 0xE4 )    /* framing_code */
+                {
+                    unsigned line_offset  = p_block->p_buffer[2] & 0x1f;
+                    unsigned field_parity = p_block->p_buffer[2] & 0x20;

-                p_sliced[i_lines].id = VBI_SLICED_TELETEXT_B;
-                if( line_offset > 0 )
-                    p_sliced[i_lines].line = line_offset + (field_parity ? 0 : 313);
-                else
-                    p_sliced[i_lines].line = 0;
-                for( int i = 0; i < 42; i++ )
-                    p_sliced[i_lines].data[i] = vbi_rev8( p_block->p_buffer[4 + i] );
-                i_lines++;
+                    p_sliced[i_lines].id = VBI_SLICED_TELETEXT_B;
+                    if( line_offset > 0 )
+                        p_sliced[i_lines].line = line_offset + (field_parity ? 0 : 313);
+                    else
+                        p_sliced[i_lines].line = 0;
+                    for( int i = 0; i < 42; i++ )
+                        p_sliced[i_lines].data[i] = vbi_rev8( p_block->p_buffer[4 + i] );
+                    i_lines++;
+                }
             }

             p_block->i_buffer -= 2 + i_size;

-- 
2.1.3




More information about the vlc-devel mailing list