[PATCH 2/2] Fix SCTE20 CC broken in film 24fps to NTSC 30fps =

Paul Fernquist fernqui at hotmail.com
Fri Jun 26 06:12:13 CEST 2009


conversion=0A=
=0A=
---=0A=
 modules/codec/cc.c             |   12 ++++--------=0A=
 modules/codec/cc.h             |   12 +++++++-----=0A=
 modules/codec/libmpeg2.c       |    6 ++++--=0A=
 modules/packetizer/h264.c      |    2 +-=0A=
 modules/packetizer/mpegvideo.c |    2 +-=0A=
 5 files changed, 17 insertions(+), 17 deletions(-)=0A=
=0A=
diff --git a/modules/codec/cc.c b/modules/codec/cc.c=0A=
index 59614a1..c1922f9 100644=0A=
--- a/modules/codec/cc.c=0A=
+++ b/modules/codec/cc.c=0A=
@@ -381,6 +381,7 @@ static subpicture_t *Convert( decoder_t *p_dec, =
block_t *p_block )=0A=
     /* TODO do the real decoding here */=0A=
     while( p_block->i_buffer >=3D 3 )=0A=
     {=0A=
+ //       printf( "CCCCCCCCCCCC %02x  %02x %02x  %04x\n", =
p_block->p_buffer[0], p_block->p_buffer[1], p_block->p_buffer[2], =
p_sys->i_field);=0A=
         if( p_block->p_buffer[0] =3D=3D p_sys->i_field )=0A=
             b_changed |=3D Eia608Parse( &p_sys->eia608, =
p_sys->i_channel, &p_block->p_buffer[1] );=0A=
 =0A=
@@ -617,16 +618,11 @@ static void Eia608ParseChannel( eia608_t *h, =
uint8_t d[2] )=0A=
     }=0A=
 =0A=
     /* */=0A=
-    const int d1 =3D d[0] & 0x7f;=0A=
-    const int d2 =3D d[1] & 0x7f;=0A=
-    if( d1 =3D=3D 0x14 )=0A=
+    const int d1 =3D d[0] & 0x78;=0A=
+    if( d1 =3D=3D 0x10 )=0A=
         h->i_channel =3D 1;=0A=
-    else if( d1 =3D=3D 0x1c )=0A=
+    else if( d1 =3D=3D 0x18 )=0A=
         h->i_channel =3D 2;=0A=
-    else if( d1 =3D=3D 0x15 )=0A=
-        h->i_channel =3D 3;=0A=
-    else if( d1 =3D=3D 0x1d )=0A=
-        h->i_channel =3D 4;=0A=
 }=0A=
 static bool Eia608ParseTextAttribute( eia608_t *h, uint8_t d2 )=0A=
 {=0A=
diff --git a/modules/codec/cc.h b/modules/codec/cc.h=0A=
index cb3740f..3af4ffc 100644=0A=
--- a/modules/codec/cc.h=0A=
+++ b/modules/codec/cc.h=0A=
@@ -77,7 +77,7 @@ static inline void cc_AppendData( cc_data_t *c, int =
i_field, const uint8_t cc[2]=0A=
     c->p_data[c->i_data++] =3D cc[1];=0A=
 }=0A=
 =0A=
-static inline void cc_Extract( cc_data_t *c, const uint8_t *p_src, int =
i_src )=0A=
+static inline void cc_Extract( cc_data_t *c, const uint8_t *p_src, int =
i_src, bool b_cc_fields_reversed )=0A=
 {=0A=
     static const uint8_t p_cc_ga94[4] =3D { 0x47, 0x41, 0x39, 0x34 };=0A=
     static const uint8_t p_cc_dvd[4] =3D { 0x43, 0x43, 0x01, 0xf8 };=0A=
@@ -201,7 +201,7 @@ static inline void cc_Extract( cc_data_t *c, const =
uint8_t *p_src, int i_src )=0A=
         for( int i =3D 0; i < i_cc_count; i++ )=0A=
         {=0A=
             bs_skip( &s, 2 );=0A=
-            const int i_field_idx =3D bs_read( &s, 2 );=0A=
+            int i_field_idx =3D bs_read( &s, 2 );=0A=
             bs_skip( &s, 5 );=0A=
             uint8_t cc[2];=0A=
             for( int j =3D 0; j < 2; j++ )=0A=
@@ -212,12 +212,14 @@ static inline void cc_Extract( cc_data_t *c, const =
uint8_t *p_src, int i_src )=0A=
             }=0A=
             bs_skip( &s, 1 );=0A=
 =0A=
-            if( i_field_idx !=3D 1 && i_field_idx !=3D 2 )=0A=
+            if( i_field_idx < 1 )=0A=
                 continue;=0A=
             if( c->i_data + 2*3 > CC_MAX_DATA_SIZE )=0A=
                 continue;=0A=
-=0A=
-            const int i_field =3D i_field_idx - 1;=0A=
+            /* In film mode(3 2 pull down), a third picture field(idx =
3) is the repeat of the first field and=0A=
+             * an odd number of fields reverses field order of the =
following pictures */=0A=
+            int i_field =3D (i_field_idx - 1) & 1;=0A=
+            if(b_cc_fields_reversed) i_field ^=3D 1;=0A=
 =0A=
             cc_AppendData( c, i_field, &cc[0] );=0A=
         }=0A=
diff --git a/modules/codec/libmpeg2.c b/modules/codec/libmpeg2.c=0A=
index bd8eff6..41dc912 100644=0A=
--- a/modules/codec/libmpeg2.c=0A=
+++ b/modules/codec/libmpeg2.c=0A=
@@ -425,16 +425,18 @@ static picture_t *DecodeBlock( decoder_t *p_dec, =
block_t **pp_block )=0A=
                     p_sys->i_cc_flags =3D BLOCK_FLAG_TYPE_B;=0A=
                 else p_sys->i_cc_flags =3D BLOCK_FLAG_TYPE_I;=0A=
 =0A=
+                bool b_cc_fields_reversed =3D =
!(p_sys->p_info->current_picture !=3D NULL ?  =
p_sys->p_info->current_picture->flags & PIC_FLAG_TOP_FIELD_FIRST : 1);=0A=
+=0A=
                 if( p_sys->i_gop_user_data > 2 )=0A=
                 {=0A=
                     /* We now have picture info for any cached =
user_data out of the gop */=0A=
-                    cc_Extract( &p_sys->cc, &p_sys->p_gop_user_data[0], =
p_sys->i_gop_user_data );=0A=
+                    cc_Extract( &p_sys->cc, &p_sys->p_gop_user_data[0], =
p_sys->i_gop_user_data, b_cc_fields_reversed );=0A=
                     p_sys->i_gop_user_data =3D 0;=0A=
                 }=0A=
 =0A=
                 /* Extract the CC from the user_data of the picture */=0A=
                 if( p_info->user_data_len > 2 )=0A=
-                    cc_Extract( &p_sys->cc, &p_info->user_data[0], =
p_info->user_data_len );=0A=
+                    cc_Extract( &p_sys->cc, &p_info->user_data[0], =
p_info->user_data_len, b_cc_fields_reversed );=0A=
             }=0A=
         }=0A=
         break;=0A=
diff --git a/modules/packetizer/h264.c b/modules/packetizer/h264.c=0A=
index 3baac0c..ca8a167 100644=0A=
--- a/modules/packetizer/h264.c=0A=
+++ b/modules/packetizer/h264.c=0A=
@@ -1122,7 +1122,7 @@ static void ParseSei( decoder_t *p_dec, block_t =
*p_frag )=0A=
             if( i_t35 >=3D 5 &&=0A=
                 !memcmp( p_t35, p_dvb1_data_start_code, =
sizeof(p_dvb1_data_start_code) ) )=0A=
             {=0A=
-                cc_Extract( &p_sys->cc_next, &p_t35[3], i_t35 - 3 );=0A=
+                cc_Extract( &p_sys->cc_next, &p_t35[3], i_t35 - 3, =
false );=0A=
             }=0A=
         }=0A=
         i_used +=3D i_size;=0A=
diff --git a/modules/packetizer/mpegvideo.c =
b/modules/packetizer/mpegvideo.c=0A=
index fa3c0e2..279e61a 100644=0A=
--- a/modules/packetizer/mpegvideo.c=0A=
+++ b/modules/packetizer/mpegvideo.c=0A=
@@ -625,7 +625,7 @@ static block_t *ParseMPEGBlock( decoder_t *p_dec, =
block_t *p_frag )=0A=
     }=0A=
     else if( p_frag->p_buffer[3] =3D=3D 0xb2 && p_frag->i_buffer > 4 )=0A=
     {=0A=
-        cc_Extract( &p_sys->cc, &p_frag->p_buffer[4], p_frag->i_buffer =
- 4 );=0A=
+        cc_Extract( &p_sys->cc, &p_frag->p_buffer[4], p_frag->i_buffer =
- 4, false );=0A=
     }=0A=
     else if( p_frag->p_buffer[3] =3D=3D 0x00 )=0A=
     {=0A=
-- =0A=
1.6.1.2=0A=
=0A=

------=_NextPart_000_0005_01C9F628.C3D990B0--



More information about the vlc-devel mailing list