Commit 857f2745 authored by François Cartegnie's avatar François Cartegnie 🤞

packetizer: a52: separate EAC3 bitstream parsing

parent 5718b12e
...@@ -55,6 +55,9 @@ struct vlc_a52_bitstream_info ...@@ -55,6 +55,9 @@ struct vlc_a52_bitstream_info
EAC3_STRMTYP_AC3_CONVERT = 2, EAC3_STRMTYP_AC3_CONVERT = 2,
EAC3_STRMTYP_RESERVED, EAC3_STRMTYP_RESERVED,
} strmtyp; } strmtyp;
uint16_t i_frmsiz;
uint8_t i_fscod2;
uint8_t i_numblkscod;
uint8_t i_substreamid; uint8_t i_substreamid;
} eac3; } eac3;
struct struct
...@@ -211,44 +214,60 @@ static inline int vlc_a52_header_ParseAc3( vlc_a52_header_t *p_header, ...@@ -211,44 +214,60 @@ static inline int vlc_a52_header_ParseAc3( vlc_a52_header_t *p_header,
/** /**
* It parse E-AC3 sync info * It parse E-AC3 sync info
*/ */
static inline int vlc_a52_header_ParseEac3( vlc_a52_header_t *p_header, static inline int vlc_a52_ParseEac3BitstreamInfo( struct vlc_a52_bitstream_info *bs,
const uint8_t *p_buf, const uint8_t *p_buf, size_t i_buf )
const uint32_t *p_acmod,
const unsigned *pi_fscod_samplerates )
{ {
struct vlc_a52_bitstream_info *bs = &p_header->bs;
bs_t s; bs_t s;
bs_init( &s, (void*)p_buf, VLC_A52_HEADER_SIZE ); bs_init( &s, p_buf, i_buf );
bs_skip( &s, 16 ); /* start code */
bs->eac3.strmtyp = bs_read( &s, 2 ); /* Stream Type */ bs->eac3.strmtyp = bs_read( &s, 2 ); /* Stream Type */
bs->eac3.i_substreamid = bs_read( &s, 3 );/* Substream Identification */ bs->eac3.i_substreamid = bs_read( &s, 3 );/* Substream Identification */
const uint16_t i_frmsiz = bs_read( &s, 11 ); bs->eac3.i_frmsiz = bs_read( &s, 11 );
if( i_frmsiz < 2 ) if( bs->eac3.i_frmsiz < 2 )
return VLC_EGENERIC; return VLC_EGENERIC;
p_header->i_size = 2 * (i_frmsiz + 1 );
bs->i_fscod = bs_read( &s, 2 ); bs->i_fscod = bs_read( &s, 2 );
if( bs->i_fscod == 0x03 ) if( bs->i_fscod == 0x03 )
{ {
const uint8_t i_fscod2 = bs_read( &s, 2 ); bs->eac3.i_fscod2 = bs_read( &s, 2 );
if( i_fscod2 == 0x03 ) if( bs->eac3.i_fscod2 == 0x03 )
return VLC_EGENERIC; return VLC_EGENERIC;
p_header->i_rate = pi_fscod_samplerates[i_fscod2] / 2; bs->eac3.i_numblkscod = 0x03;
}
else bs->eac3.i_numblkscod = bs_read( &s, 2 );
bs->i_acmod = bs_read( &s, 3 );
bs->i_lfeon = bs_read1( &s );
return VLC_SUCCESS;
}
static inline int vlc_a52_header_ParseEac3( vlc_a52_header_t *p_header,
const uint8_t *p_buf,
const uint32_t *p_acmod,
const unsigned *pi_fscod_samplerates )
{
if( vlc_a52_ParseEac3BitstreamInfo( &p_header->bs,
&p_buf[2], /* start code */
VLC_A52_HEADER_SIZE - 2 ) != VLC_SUCCESS )
return VLC_EGENERIC;
const struct vlc_a52_bitstream_info *bs = &p_header->bs;
p_header->i_size = 2 * (bs->eac3.i_frmsiz + 1 );
if( bs->i_fscod == 0x03 )
{
p_header->i_rate = pi_fscod_samplerates[bs->eac3.i_fscod2] / 2;
p_header->i_blocks_per_sync_frame = 6; p_header->i_blocks_per_sync_frame = 6;
} }
else else
{ {
static const int pi_numblkscod [4] = { 1, 2, 3, 6 }; static const int pi_numblkscod [4] = { 1, 2, 3, 6 };
p_header->i_rate = pi_fscod_samplerates[bs->i_fscod]; p_header->i_rate = pi_fscod_samplerates[bs->i_fscod];
p_header->i_blocks_per_sync_frame = pi_numblkscod[bs_read( &s, 2 )]; p_header->i_blocks_per_sync_frame = pi_numblkscod[bs->eac3.i_numblkscod];
} }
bs->i_acmod = bs_read( &s, 3 );
bs->i_lfeon = bs_read1( &s );
p_header->i_channels_conf = p_acmod[bs->i_acmod]; p_header->i_channels_conf = p_acmod[bs->i_acmod];
p_header->i_chan_mode = 0; p_header->i_chan_mode = 0;
if( bs->i_acmod == 0 ) if( bs->i_acmod == 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