@ -632,9 +632,14 @@ static const int ac3_bitrates[64] = {
384 , 448 , 448 , 512 , 512 , 576 , 576 , 640 , 640 ,
} ;
static const int ac3_channels [ 8 ] = {
static const u int8_ t ac3_channels [ 8 ] = {
2 , 1 , 2 , 3 , 3 , 4 , 4 , 5
} ;
static const uint8_t eac3_blocks [ 4 ] = {
1 , 2 , 3 , 6
} ;
# endif /* CONFIG_AC3_PARSER */
# ifdef CONFIG_AAC_PARSER
@ -653,6 +658,7 @@ static int ac3_sync(const uint8_t *buf, int *channels, int *sample_rate,
int * bit_rate , int * samples )
{
unsigned int fscod , frmsizecod , acmod , bsid , lfeon ;
unsigned int strmtyp , substreamid , frmsiz , fscod2 , numblkscod ;
GetBitContext bits ;
init_get_bits ( & bits , buf , AC3_HEADER_SIZE * 8 ) ;
@ -660,16 +666,16 @@ static int ac3_sync(const uint8_t *buf, int *channels, int *sample_rate,
if ( get_bits ( & bits , 16 ) ! = 0x0b77 )
return 0 ;
bsid = show_bits_long ( & bits , 29 ) & 0x1f ;
if ( bsid < = 8 ) { /* Normal AC-3 */
skip_bits ( & bits , 16 ) ; /* crc */
fscod = get_bits ( & bits , 2 ) ;
frmsizecod = get_bits ( & bits , 6 ) ;
if ( ! ac3_sample_rates [ fscod ] )
if ( fscod = = 3 )
return 0 ;
bsid = get_bits ( & bits , 5 ) ;
if ( bsid > 8 )
return 0 ;
skip_bits ( & bits , 5 ) ; /* bsid */
skip_bits ( & bits , 3 ) ; /* bsmod */
acmod = get_bits ( & bits , 3 ) ;
if ( acmod & 1 & & acmod ! = 1 )
@ -686,6 +692,41 @@ static int ac3_sync(const uint8_t *buf, int *channels, int *sample_rate,
* samples = 6 * 256 ;
return ac3_frame_sizes [ frmsizecod ] [ fscod ] * 2 ;
} else if ( bsid > = 10 & & bsid < = 16 ) { /* Enhanced AC-3 */
strmtyp = get_bits ( & bits , 2 ) ;
substreamid = get_bits ( & bits , 3 ) ;
if ( strmtyp ! = 0 | | substreamid ! = 0 )
return 0 ; /* Currently don't support additional streams */
frmsiz = get_bits ( & bits , 11 ) + 1 ;
fscod = get_bits ( & bits , 2 ) ;
if ( fscod = = 3 ) {
fscod2 = get_bits ( & bits , 2 ) ;
numblkscod = 3 ;
if ( fscod2 = = 3 )
return 0 ;
* sample_rate = ac3_sample_rates [ fscod2 ] / 2 ;
} else {
numblkscod = get_bits ( & bits , 2 ) ;
* sample_rate = ac3_sample_rates [ fscod ] ;
}
acmod = get_bits ( & bits , 3 ) ;
lfeon = get_bits1 ( & bits ) ;
* samples = eac3_blocks [ numblkscod ] * 256 ;
* bit_rate = frmsiz * ( * sample_rate ) * 16 / ( * samples ) ;
* channels = ac3_channels [ acmod ] + lfeon ;
return frmsiz * 2 ;
}
/* Unsupported bitstream version */
return 0 ;
}
# endif /* CONFIG_AC3_PARSER */