[vlc-commits] Extract captions from DIRECTV
Rafaël Carré
git at videolan.org
Tue Nov 3 19:07:19 CET 2015
vlc | branch: master | Rafaël Carré <funman at videolan.org> | Tue Nov 3 19:06:04 2015 +0100| [99d4a4fd7488c75cb574d5019506d260ad8200cf] | committer: Rafaël Carré
Extract captions from DIRECTV
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=99d4a4fd7488c75cb574d5019506d260ad8200cf
---
modules/codec/cc.h | 12 ++++++++++--
modules/packetizer/h264.c | 11 +++++++++++
2 files changed, 21 insertions(+), 2 deletions(-)
diff --git a/modules/codec/cc.h b/modules/codec/cc.h
index d13bfd2..d92602b 100644
--- a/modules/codec/cc.h
+++ b/modules/codec/cc.h
@@ -112,6 +112,8 @@ static inline void cc_Extract( cc_data_t *c, bool b_top_field_first, const uint8
{
/* 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 )
{
@@ -128,6 +130,12 @@ static inline void cc_Extract( cc_data_t *c, bool b_top_field_first, const uint8
{
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
@@ -174,13 +182,13 @@ static inline void cc_Extract( cc_data_t *c, bool b_top_field_first, const uint8
* 0x00: field 1
* 0x01: field 2
*/
- const uint8_t *cc = &p_src[5];
+ const uint8_t *cc = &p_src[0];
const int i_count_cc = cc[0]&0x1f;
int i;
if( !(cc[0]&0x40) ) // process flag
return;
- if( i_src < 5 + 1+1 + i_count_cc*3 + 1) // broken packet
+ if( i_src < 1+1 + i_count_cc*3 + 1) // broken packet
return;
if( i_count_cc <= 0 ) // no cc present
return;
diff --git a/modules/packetizer/h264.c b/modules/packetizer/h264.c
index c87a411..7047465 100644
--- a/modules/packetizer/h264.c
+++ b/modules/packetizer/h264.c
@@ -1058,6 +1058,13 @@ static void ParseSei( decoder_t *p_dec, block_t *p_frag )
0x00, 0x31, /* US provider code */
0x47, 0x41, 0x39, 0x34 /* user identifier */
};
+
+ static const uint8_t p_DIRECTV_data_start_code[] = {
+ 0xb5, /* United States */
+ 0x00, 0x2f, /* US provider code */
+ 0x03 /* Captions */
+ };
+
const unsigned i_t35 = i_size;
const uint8_t *p_t35 = &pb_dec[i_used];
@@ -1066,6 +1073,10 @@ static void ParseSei( decoder_t *p_dec, block_t *p_frag )
!memcmp( p_t35, p_DVB1_data_start_code, sizeof(p_DVB1_data_start_code) ) )
{
cc_Extract( &p_sys->cc_next, true, &p_t35[3], i_t35 - 3 );
+ } else if( i_t35 >= sizeof(p_DIRECTV_data_start_code) &&
+ !memcmp( p_t35, p_DIRECTV_data_start_code, sizeof(p_DIRECTV_data_start_code) ) )
+ {
+ cc_Extract( &p_sys->cc_next, true, &p_t35[3], i_t35 - 3 );
}
}
More information about the vlc-commits
mailing list