[vlc-commits] codec: cc: allow to pass format directly
Francois Cartegnie
git at videolan.org
Thu Nov 17 18:05:41 CET 2016
vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Wed Nov 16 20:54:30 2016 +0100| [2b7a60de8ec91870390c92d5609a82c2405fa905] | committer: Francois Cartegnie
codec: cc: allow to pass format directly
and strip unwanted headers
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=2b7a60de8ec91870390c92d5609a82c2405fa905
---
modules/codec/cc.h | 121 +++++++++++++++++++++------------------
modules/codec/libmpeg2.c | 4 +-
modules/packetizer/hxxx_common.c | 2 +-
modules/packetizer/mpegvideo.c | 2 +-
modules/packetizer/vc1.c | 2 +-
5 files changed, 69 insertions(+), 62 deletions(-)
diff --git a/modules/codec/cc.h b/modules/codec/cc.h
index f9c6170..6f8b6c4 100644
--- a/modules/codec/cc.h
+++ b/modules/codec/cc.h
@@ -96,64 +96,9 @@ static inline void cc_AppendData( cc_data_t *c, uint8_t cc_preamble, const uint8
c->p_data[c->i_data++] = cc[1];
}
-static inline void cc_Extract( cc_data_t *c, bool b_top_field_first, const uint8_t *p_src, int i_src )
+static inline void cc_Extract( cc_data_t *c, enum cc_payload_type_e i_payload_type,
+ bool b_top_field_first, const uint8_t *p_src, int i_src )
{
- static const uint8_t p_cc_ga94[4] = { 0x47, 0x41, 0x39, 0x34 };
- static const uint8_t p_cc_dvd[4] = { 0x43, 0x43, 0x01, 0xf8 }; /* ascii 'CC', type_code, cc_block_size */
- static const uint8_t p_cc_replaytv4a[2] = { 0xbb, 0x02 };/* RTV4K, BB02xxxxCC02 */
- static const uint8_t p_cc_replaytv4b[2] = { 0xcc, 0x02 };/* see DVR-ClosedCaption in samples */
- static const uint8_t p_cc_replaytv5a[2] = { 0x99, 0x02 };/* RTV5K, 9902xxxxAA02 */
- static const uint8_t p_cc_replaytv5b[2] = { 0xaa, 0x02 };/* see DVR-ClosedCaption in samples */
- static const uint8_t p_cc_scte20[2] = { 0x03, 0x81 }; /* user_data_type_code, SCTE 20 */
- static const uint8_t p_cc_scte20_old[2] = { 0x03, 0x01 };/* user_data_type_code, old, Note 1 */
-
- if( i_src < 4 )
- return;
-
- int i_payload_type;
- if( !memcmp( p_cc_ga94, p_src, 4 ) && i_src >= 5+1+1+1 && p_src[4] == 0x03 )
- {
- /* CC from DVB/ATSC TS */
- i_payload_type = CC_PAYLOAD_GA94;
- i_src -= 5;
- p_src += 5;
- }
- else if( !memcmp( p_cc_dvd, p_src, 4 ) && i_src > 4+1 )
- {
- i_payload_type = CC_PAYLOAD_DVD;
- }
- else if( i_src >= 2+2 + 2+2 &&
- ( ( !memcmp( p_cc_replaytv4a, &p_src[0], 2 ) && !memcmp( p_cc_replaytv4b, &p_src[4], 2 ) ) ||
- ( !memcmp( p_cc_replaytv5a, &p_src[0], 2 ) && !memcmp( p_cc_replaytv5b, &p_src[4], 2 ) ) ) )
- {
- i_payload_type = CC_PAYLOAD_REPLAYTV;
- }
- else if( ( !memcmp( p_cc_scte20, p_src, 2 ) ||
- !memcmp( p_cc_scte20_old, p_src, 2 ) ) && i_src > 2 )
- {
- i_payload_type = CC_PAYLOAD_SCTE20;
- }
- else if (p_src[0] == 0x03 && p_src[1] == i_src - 2) /* DIRECTV */
- {
- i_payload_type = CC_PAYLOAD_GA94;
- i_src -= 2;
- p_src += 2;
- }
- else
- {
-#if 0
-#define V(x) ( ( x < 0x20 || x >= 0x7f ) ? '?' : x )
- fprintf( stderr, "-------------- unknown user data " );
- for( int i = 0; i < i_src; i++ )
- fprintf( stderr, "%2.2x ", p_src[i] );
- for( int i = 0; i < i_src; i++ )
- fprintf( stderr, "%c ", V(p_src[i]) );
- fprintf( stderr, "\n" );
-#undef V
-#endif
- return;
- }
-
if( c->i_payload_type != CC_PAYLOAD_NONE && c->i_payload_type != i_payload_type )
{
c->i_payload_other_count++;
@@ -312,5 +257,67 @@ static inline void cc_Extract( cc_data_t *c, bool b_top_field_first, const uint8
}
}
+
+static inline void cc_ProbeAndExtract( cc_data_t *c, bool b_top_field_first, const uint8_t *p_src, int i_src )
+{
+ static const uint8_t p_cc_ga94[4] = { 0x47, 0x41, 0x39, 0x34 };
+ static const uint8_t p_cc_dvd[4] = { 0x43, 0x43, 0x01, 0xf8 }; /* ascii 'CC', type_code, cc_block_size */
+ static const uint8_t p_cc_replaytv4a[2] = { 0xbb, 0x02 };/* RTV4K, BB02xxxxCC02 */
+ static const uint8_t p_cc_replaytv4b[2] = { 0xcc, 0x02 };/* see DVR-ClosedCaption in samples */
+ static const uint8_t p_cc_replaytv5a[2] = { 0x99, 0x02 };/* RTV5K, 9902xxxxAA02 */
+ static const uint8_t p_cc_replaytv5b[2] = { 0xaa, 0x02 };/* see DVR-ClosedCaption in samples */
+ static const uint8_t p_cc_scte20[2] = { 0x03, 0x81 }; /* user_data_type_code, SCTE 20 */
+ static const uint8_t p_cc_scte20_old[2] = { 0x03, 0x01 };/* user_data_type_code, old, Note 1 */
+
+ if( i_src < 4 )
+ return;
+
+ enum cc_payload_type_e i_payload_type;
+ if( !memcmp( p_cc_ga94, p_src, 4 ) && i_src >= 5+1+1+1 && p_src[4] == 0x03 )
+ {
+ /* CC from DVB/ATSC TS */
+ i_payload_type = CC_PAYLOAD_GA94;
+ i_src -= 5;
+ p_src += 5;
+ }
+ else if( !memcmp( p_cc_dvd, p_src, 4 ) && i_src > 4+1 )
+ {
+ i_payload_type = CC_PAYLOAD_DVD;
+ }
+ else if( i_src >= 2+2 + 2+2 &&
+ ( ( !memcmp( p_cc_replaytv4a, &p_src[0], 2 ) && !memcmp( p_cc_replaytv4b, &p_src[4], 2 ) ) ||
+ ( !memcmp( p_cc_replaytv5a, &p_src[0], 2 ) && !memcmp( p_cc_replaytv5b, &p_src[4], 2 ) ) ) )
+ {
+ i_payload_type = CC_PAYLOAD_REPLAYTV;
+ }
+ else if( ( !memcmp( p_cc_scte20, p_src, 2 ) ||
+ !memcmp( p_cc_scte20_old, p_src, 2 ) ) && i_src > 2 )
+ {
+ i_payload_type = CC_PAYLOAD_SCTE20;
+ }
+ else if (p_src[0] == 0x03 && p_src[1] == i_src - 2) /* DIRECTV */
+ {
+ i_payload_type = CC_PAYLOAD_GA94;
+ i_src -= 2;
+ p_src += 2;
+ }
+ else
+ {
+#if 0
+#define V(x) ( ( x < 0x20 || x >= 0x7f ) ? '?' : x )
+ fprintf( stderr, "-------------- unknown user data " );
+ for( int i = 0; i < i_src; i++ )
+ fprintf( stderr, "%2.2x ", p_src[i] );
+ for( int i = 0; i < i_src; i++ )
+ fprintf( stderr, "%c ", V(p_src[i]) );
+ fprintf( stderr, "\n" );
+#undef V
+#endif
+ return;
+ }
+
+ cc_Extract( c, i_payload_type, b_top_field_first, p_src, i_src );
+}
+
#endif /* _CC_H */
diff --git a/modules/codec/libmpeg2.c b/modules/codec/libmpeg2.c
index f70ff3a..ef994d4 100644
--- a/modules/codec/libmpeg2.c
+++ b/modules/codec/libmpeg2.c
@@ -442,14 +442,14 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
if( p_sys->i_gop_user_data > 2 )
{
/* We now have picture info for any cached user_data out of the gop */
- cc_Extract( &p_sys->cc, b_top_field_first,
+ cc_ProbeAndExtract( &p_sys->cc, b_top_field_first,
&p_sys->p_gop_user_data[0], p_sys->i_gop_user_data );
p_sys->i_gop_user_data = 0;
}
/* Extract the CC from the user_data of the picture */
if( p_info->user_data_len > 2 )
- cc_Extract( &p_sys->cc, b_top_field_first,
+ cc_ProbeAndExtract( &p_sys->cc, b_top_field_first,
&p_info->user_data[0], p_info->user_data_len );
}
}
diff --git a/modules/packetizer/hxxx_common.c b/modules/packetizer/hxxx_common.c
index 137330e..0c5845a 100644
--- a/modules/packetizer/hxxx_common.c
+++ b/modules/packetizer/hxxx_common.c
@@ -68,7 +68,7 @@ void cc_storage_reset( cc_storage_t *p_ccs )
void cc_storage_append( cc_storage_t *p_ccs, bool b_top_field_first,
const uint8_t *p_buf, size_t i_buf )
{
- cc_Extract( &p_ccs->next, b_top_field_first, p_buf, i_buf );
+ cc_ProbeAndExtract( &p_ccs->next, b_top_field_first, p_buf, i_buf );
}
void cc_storage_commit( cc_storage_t *p_ccs, block_t *p_pic )
diff --git a/modules/packetizer/mpegvideo.c b/modules/packetizer/mpegvideo.c
index 22f6e86..fc205d7 100644
--- a/modules/packetizer/mpegvideo.c
+++ b/modules/packetizer/mpegvideo.c
@@ -702,7 +702,7 @@ static block_t *ParseMPEGBlock( decoder_t *p_dec, block_t *p_frag )
}
else if( p_frag->p_buffer[3] == 0xb2 && p_frag->i_buffer > 4 )
{
- cc_Extract( &p_sys->cc, p_sys->i_top_field_first,
+ cc_ProbeAndExtract( &p_sys->cc, p_sys->i_top_field_first,
&p_frag->p_buffer[4], p_frag->i_buffer - 4 );
}
else if( p_frag->p_buffer[3] == 0x00 )
diff --git a/modules/packetizer/vc1.c b/modules/packetizer/vc1.c
index e15b25f..51849dc 100644
--- a/modules/packetizer/vc1.c
+++ b/modules/packetizer/vc1.c
@@ -717,7 +717,7 @@ static block_t *ParseIDU( decoder_t *p_dec, bool *pb_ts_used, block_t *p_frag )
if( i_data >= sizeof(p_DVB1_user_identifier) &&
!memcmp( p_data, p_DVB1_user_identifier, sizeof(p_DVB1_user_identifier) ) )
{
- cc_Extract( &p_sys->cc_next, true, p_data, i_data );
+ cc_ProbeAndExtract( &p_sys->cc_next, true, p_data, i_data );
}
free( p_data );
More information about the vlc-commits
mailing list