]> git.sesse.net Git - vlc/commitdiff
fix teletext framing code in DVB PES packets ignored
authorMiha Sokolov <newsletter@fab-online.com>
Fri, 20 Mar 2015 09:38:51 +0000 (09:38 +0000)
committerJean-Baptiste Kempf <jb@videolan.org>
Fri, 20 Mar 2015 14:57:58 +0000 (15:57 +0100)
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

Signed-off-by: Jean-Baptiste Kempf <jb@videolan.org>
modules/codec/zvbi.c

index a5e5df666ed37a0632ac3146e6be61974ed67510..17b8b5a0a0eb4e64ebec91368010763ab770b770 100644 (file)
@@ -331,17 +331,20 @@ static subpicture_t *Decode( decoder_t *p_dec, block_t **pp_block )
 
             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;
-
-                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++;
+                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_block->i_buffer -= 2 + i_size;