Commit 2b0a1758 authored by Laurent Aimar's avatar Laurent Aimar

Added SCTE-20 CC support (close #2503).

parent cf6d7ded
...@@ -24,6 +24,8 @@ ...@@ -24,6 +24,8 @@
#ifndef _CC_H #ifndef _CC_H
#define _CC_H 1 #define _CC_H 1
#include <vlc_bits.h>
/* CC have a maximum rate of 9600 bit/s (per field?) */ /* CC have a maximum rate of 9600 bit/s (per field?) */
#define CC_MAX_DATA_SIZE (2 * 3*600) #define CC_MAX_DATA_SIZE (2 * 3*600)
typedef struct typedef struct
...@@ -81,6 +83,7 @@ static inline void cc_Extract( cc_data_t *c, const uint8_t *p_src, int i_src ) ...@@ -81,6 +83,7 @@ static inline void cc_Extract( cc_data_t *c, const uint8_t *p_src, int i_src )
static const uint8_t p_cc_replaytv4b[2] = { 0xcc, 0x02 }; static const uint8_t p_cc_replaytv4b[2] = { 0xcc, 0x02 };
static const uint8_t p_cc_replaytv5a[2] = { 0x99, 0x02 }; static const uint8_t p_cc_replaytv5a[2] = { 0x99, 0x02 };
static const uint8_t p_cc_replaytv5b[2] = { 0xaa, 0x02 }; static const uint8_t p_cc_replaytv5b[2] = { 0xaa, 0x02 };
static const uint8_t p_cc_scte20[2] = { 0x03, 0x81 };
//static const uint8_t p_afd_start[4] = { 0x44, 0x54, 0x47, 0x31 }; //static const uint8_t p_afd_start[4] = { 0x44, 0x54, 0x47, 0x31 };
if( i_src < 4 ) if( i_src < 4 )
...@@ -202,6 +205,42 @@ static inline void cc_Extract( cc_data_t *c, const uint8_t *p_src, int i_src ) ...@@ -202,6 +205,42 @@ static inline void cc_Extract( cc_data_t *c, const uint8_t *p_src, int i_src )
} }
c->b_reorder = false; c->b_reorder = false;
} }
else if( !memcmp( p_cc_scte20, p_src, 2 ) && i_src > 2 )
{
/* SCTE-20 CC */
bs_t s;
bs_init( &s, &p_src[2], i_src - 2 );
const int i_cc_count = bs_read( &s, 5 );
for( int i = 0; i < i_cc_count; i++ )
{
bs_skip( &s, 2 );
const int i_field_idx = bs_read( &s, 2 );
bs_skip( &s, 5 );
uint8_t cc[2];
for( int j = 0; j < 2; j++ )
{
cc[j] = 0;
for( int k = 0; k < 8; k++ )
cc[j] |= bs_read( &s, 1 ) << k;
}
bs_skip( &s, 1 );
if( i_field_idx != 1 && i_field_idx != 2 )
continue;
if( c->i_data + 2*3 > CC_MAX_DATA_SIZE )
continue;
const int i_field = i_field_idx - 1;
const int i_channel = cc_Channel( i_field, cc );
if( i_channel >= 0 && i_channel < 4 )
c->pb_present[i_channel] = true;
c->p_data[c->i_data++] = i_field;
c->p_data[c->i_data++] = cc[0];
c->p_data[c->i_data++] = cc[1];
}
c->b_reorder = true;
}
else else
{ {
#if 0 #if 0
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment