@ -226,7 +226,7 @@ static inline void get_array(GetBitContext *gb, int *dst, int len, int bits)
static int dca_parse_audio_coding_header ( DCAContext * s , int base_channel )
static int dca_parse_audio_coding_header ( DCAContext * s , int base_channel )
{
{
int i , j ;
int i , j ;
static const floa t adj_table [ 4 ] = { 1.0 , 1.1250 , 1.2500 , 1.4375 } ;
static const uint8_ t adj_table [ 4 ] = { 16 , 18 , 20 , 23 } ;
static const int bitlen [ 11 ] = { 0 , 1 , 2 , 2 , 2 , 2 , 3 , 3 , 3 , 3 , 3 } ;
static const int bitlen [ 11 ] = { 0 , 1 , 2 , 2 , 2 , 2 , 3 , 3 , 3 , 3 , 3 } ;
static const int thr [ 11 ] = { 0 , 1 , 3 , 3 , 3 , 3 , 7 , 7 , 7 , 7 , 7 } ;
static const int thr [ 11 ] = { 0 , 1 , 3 , 3 , 3 , 3 , 7 , 7 , 7 , 7 , 7 } ;
@ -265,7 +265,7 @@ static int dca_parse_audio_coding_header(DCAContext *s, int base_channel)
/* Get scale factor adjustment */
/* Get scale factor adjustment */
for ( j = 0 ; j < 11 ; j + + )
for ( j = 0 ; j < 11 ; j + + )
for ( i = base_channel ; i < s - > audio_header . prim_channels ; i + + )
for ( i = base_channel ; i < s - > audio_header . prim_channels ; i + + )
s - > audio_header . scalefactor_adj [ i ] [ j ] = 1 ;
s - > audio_header . scalefactor_adj [ i ] [ j ] = 16 ;
for ( j = 1 ; j < 11 ; j + + )
for ( j = 1 ; j < 11 ; j + + )
for ( i = base_channel ; i < s - > audio_header . prim_channels ; i + + )
for ( i = base_channel ; i < s - > audio_header . prim_channels ; i + + )
@ -790,10 +790,7 @@ static int dca_subsubframe(DCAContext *s, int base_channel, int block_index)
{
{
int k , l ;
int k , l ;
int subsubframe = s - > current_subsubframe ;
int subsubframe = s - > current_subsubframe ;
const uint32_t * quant_step_table ;
const float * quant_step_table ;
LOCAL_ALIGNED_16 ( int32_t , block , [ SAMPLES_PER_SUBBAND * DCA_SUBBANDS ] ) ;
/*
/*
* Audio data
* Audio data
@ -801,13 +798,12 @@ static int dca_subsubframe(DCAContext *s, int base_channel, int block_index)
/* Select quantization step size table */
/* Select quantization step size table */
if ( s - > bit_rate_index = = 0x1f )
if ( s - > bit_rate_index = = 0x1f )
quant_step_table = ff_dca_lossless_quant_d ;
quant_step_table = ff_dca_lossless_quant ;
else
else
quant_step_table = ff_dca_lossy_quant_d ;
quant_step_table = ff_dca_lossy_quant ;
for ( k = base_channel ; k < s - > audio_header . prim_channels ; k + + ) {
for ( k = base_channel ; k < s - > audio_header . prim_channels ; k + + ) {
float ( * subband_samples ) [ 8 ] = s - > dca_chan [ k ] . subband_samples [ block_index ] ;
int32_t ( * subband_samples ) [ 8 ] = s - > dca_chan [ k ] . subband_samples [ block_index ] ;
float rscale [ DCA_SUBBANDS ] ;
if ( get_bits_left ( & s - > gb ) < 0 )
if ( get_bits_left ( & s - > gb ) < 0 )
return AVERROR_INVALIDDATA ;
return AVERROR_INVALIDDATA ;
@ -818,27 +814,25 @@ static int dca_subsubframe(DCAContext *s, int base_channel, int block_index)
/* Select the mid-tread linear quantizer */
/* Select the mid-tread linear quantizer */
int abits = s - > dca_chan [ k ] . bitalloc [ l ] ;
int abits = s - > dca_chan [ k ] . bitalloc [ l ] ;
float quant_step_size = quant_step_table [ abits ] ;
uint32_t quant_step_size = quant_step_table [ abits ] ;
/*
* Determine quantization index code book and its type
*/
/* Select quantization index code book */
int sel = s - > audio_header . quant_index_huffman [ k ] [ abits ] ;
/*
/*
* Extract bits from the bit stream
* Extract bits from the bit stream
*/
*/
if ( ! abits ) {
if ( ! abits )
rscale [ l ] = 0 ;
memset ( subband_samples [ l ] , 0 , SAMPLES_PER_SUBBAND *
memset ( block + SAMPLES_PER_SUBBAND * l , 0 , SAMPLES_PER_SUBBAND * sizeof ( block [ 0 ] ) ) ;
sizeof ( subband_samples [ l ] [ 0 ] ) ) ;
} else {
else {
uint32_t rscale ;
/* Deal with transients */
/* Deal with transients */
int sfi = s - > dca_chan [ k ] . transition_mode [ l ] & &
int sfi = s - > dca_chan [ k ] . transition_mode [ l ] & &
subsubframe > = s - > dca_chan [ k ] . transition_mode [ l ] ;
subsubframe > = s - > dca_chan [ k ] . transition_mode [ l ] ;
rscale [ l ] = quant_step_size * s - > dca_chan [ k ] . scale_factor [ l ] [ sfi ] *
/* Determine quantization index code book and its type.
s - > audio_header . scalefactor_adj [ k ] [ sel ] ;
Select quantization index code book */
int sel = s - > audio_header . quant_index_huffman [ k ] [ abits ] ;
rscale = ( s - > dca_chan [ k ] . scale_factor [ l ] [ sfi ] *
s - > audio_header . scalefactor_adj [ k ] [ sel ] + 8 ) > > 4 ;
if ( abits > = 11 | | ! dca_smpl_bitalloc [ abits ] . vlc [ sel ] . table ) {
if ( abits > = 11 | | ! dca_smpl_bitalloc [ abits ] . vlc [ sel ] . table ) {
if ( abits < = 7 ) {
if ( abits < = 7 ) {
@ -851,7 +845,7 @@ static int dca_subsubframe(DCAContext *s, int base_channel, int block_index)
block_code1 = get_bits ( & s - > gb , size ) ;
block_code1 = get_bits ( & s - > gb , size ) ;
block_code2 = get_bits ( & s - > gb , size ) ;
block_code2 = get_bits ( & s - > gb , size ) ;
err = decode_blockcodes ( block_code1 , block_code2 ,
err = decode_blockcodes ( block_code1 , block_code2 ,
levels , block + SAMPLES_PER_SUBBAND * l ) ;
levels , subband_samples [ l ] ) ;
if ( err ) {
if ( err ) {
av_log ( s - > avctx , AV_LOG_ERROR ,
av_log ( s - > avctx , AV_LOG_ERROR ,
" ERROR: block code look-up failed \n " ) ;
" ERROR: block code look-up failed \n " ) ;
@ -860,20 +854,18 @@ static int dca_subsubframe(DCAContext *s, int base_channel, int block_index)
} else {
} else {
/* no coding */
/* no coding */
for ( m = 0 ; m < SAMPLES_PER_SUBBAND ; m + + )
for ( m = 0 ; m < SAMPLES_PER_SUBBAND ; m + + )
block [ SAMPLES_PER_SUBBAND * l + m ] = get_sbits ( & s - > gb , abits - 3 ) ;
subband_samples [ l ] [ m ] = get_sbits ( & s - > gb , abits - 3 ) ;
}
}
} else {
} else {
/* Huffman coded */
/* Huffman coded */
for ( m = 0 ; m < SAMPLES_PER_SUBBAND ; m + + )
for ( m = 0 ; m < SAMPLES_PER_SUBBAND ; m + + )
block [ SAMPLES_PER_SUBBAND * l + m ] = get_bitalloc ( & s - > gb ,
subband_samples [ l ] [ m ] = get_bitalloc ( & s - > gb ,
& dca_smpl_bitalloc [ abits ] , sel ) ;
& dca_smpl_bitalloc [ abits ] , sel ) ;
}
}
s - > dcadsp . dequantize ( subband_samples [ l ] , quant_step_size , rscale ) ;
}
}
}
}
s - > fmt_conv . int32_to_float_fmul_array8 ( & s - > fmt_conv , subband_samples [ 0 ] ,
block , rscale , SAMPLES_PER_SUBBAND * s - > audio_header . vq_start_subband [ k ] ) ;
for ( l = 0 ; l < s - > audio_header . vq_start_subband [ k ] ; l + + ) {
for ( l = 0 ; l < s - > audio_header . vq_start_subband [ k ] ; l + + ) {
int m ;
int m ;
/*
/*
@ -883,25 +875,25 @@ static int dca_subsubframe(DCAContext *s, int base_channel, int block_index)
int n ;
int n ;
if ( s - > predictor_history )
if ( s - > predictor_history )
subband_samples [ l ] [ 0 ] + = ( ff_dca_adpcm_vb [ s - > dca_chan [ k ] . prediction_vq [ l ] ] [ 0 ] *
subband_samples [ l ] [ 0 ] + = ( ff_dca_adpcm_vb [ s - > dca_chan [ k ] . prediction_vq [ l ] ] [ 0 ] *
s - > dca_chan [ k ] . subband_samples_hist [ l ] [ 3 ] +
( int64_t ) s - > dca_chan [ k ] . subband_samples_hist [ l ] [ 3 ] +
ff_dca_adpcm_vb [ s - > dca_chan [ k ] . prediction_vq [ l ] ] [ 1 ] *
ff_dca_adpcm_vb [ s - > dca_chan [ k ] . prediction_vq [ l ] ] [ 1 ] *
s - > dca_chan [ k ] . subband_samples_hist [ l ] [ 2 ] +
( int64_t ) s - > dca_chan [ k ] . subband_samples_hist [ l ] [ 2 ] +
ff_dca_adpcm_vb [ s - > dca_chan [ k ] . prediction_vq [ l ] ] [ 2 ] *
ff_dca_adpcm_vb [ s - > dca_chan [ k ] . prediction_vq [ l ] ] [ 2 ] *
s - > dca_chan [ k ] . subband_samples_hist [ l ] [ 1 ] +
( int64_t ) s - > dca_chan [ k ] . subband_samples_hist [ l ] [ 1 ] +
ff_dca_adpcm_vb [ s - > dca_chan [ k ] . prediction_vq [ l ] ] [ 3 ] *
ff_dca_adpcm_vb [ s - > dca_chan [ k ] . prediction_vq [ l ] ] [ 3 ] *
s - > dca_chan [ k ] . subband_samples_hist [ l ] [ 0 ] ) *
( int64_t ) s - > dca_chan [ k ] . subband_samples_hist [ l ] [ 0 ] ) +
( 1.0f / 8192 ) ;
( 1 < < 12 ) > > 13 ;
for ( m = 1 ; m < SAMPLES_PER_SUBBAND ; m + + ) {
for ( m = 1 ; m < SAMPLES_PER_SUBBAND ; m + + ) {
floa t sum = ff_dca_adpcm_vb [ s - > dca_chan [ k ] . prediction_vq [ l ] ] [ 0 ] *
int64_ t sum = ff_dca_adpcm_vb [ s - > dca_chan [ k ] . prediction_vq [ l ] ] [ 0 ] *
subband_samples [ l ] [ m - 1 ] ;
( int64_t ) subband_samples [ l ] [ m - 1 ] ;
for ( n = 2 ; n < = 4 ; n + + )
for ( n = 2 ; n < = 4 ; n + + )
if ( m > = n )
if ( m > = n )
sum + = ff_dca_adpcm_vb [ s - > dca_chan [ k ] . prediction_vq [ l ] ] [ n - 1 ] *
sum + = ff_dca_adpcm_vb [ s - > dca_chan [ k ] . prediction_vq [ l ] ] [ n - 1 ] *
subband_samples [ l ] [ m - n ] ;
( int64_t ) subband_samples [ l ] [ m - n ] ;
else if ( s - > predictor_history )
else if ( s - > predictor_history )
sum + = ff_dca_adpcm_vb [ s - > dca_chan [ k ] . prediction_vq [ l ] ] [ n - 1 ] *
sum + = ff_dca_adpcm_vb [ s - > dca_chan [ k ] . prediction_vq [ l ] ] [ n - 1 ] *
s - > dca_chan [ k ] . subband_samples_hist [ l ] [ m - n + 4 ] ;
( int64_t ) s - > dca_chan [ k ] . subband_samples_hist [ l ] [ m - n + 4 ] ;
subband_samples [ l ] [ m ] + = sum * 1.0f / 8192 ;
subband_samples [ l ] [ m ] + = ( int32_t ) ( sum + ( 1 < < 12 ) > > 13 ) ;
}
}
}
}
@ -921,11 +913,12 @@ static int dca_subsubframe(DCAContext *s, int base_channel, int block_index)
s - > debug_flag | = 0x01 ;
s - > debug_flag | = 0x01 ;
}
}
s - > dcadsp . decode_hf ( subband_samples , s - > dca_chan [ k ] . high_freq_vq ,
s - > dcadsp . decode_hf_int ( subband_samples , s - > dca_chan [ k ] . high_freq_vq ,
ff_dca_high_freq_vq , subsubframe * SAMPLES_PER_SUBBAND ,
ff_dca_high_freq_vq , subsubframe * SAMPLES_PER_SUBBAND ,
s - > dca_chan [ k ] . scale_factor ,
s - > dca_chan [ k ] . scale_factor ,
s - > audio_header . vq_start_subband [ k ] ,
s - > audio_header . vq_start_subband [ k ] ,
s - > audio_header . subband_activity [ k ] ) ;
s - > audio_header . subband_activity [ k ] ) ;
}
}
}
}
@ -945,6 +938,8 @@ static int dca_filter_channels(DCAContext *s, int block_index, int upsample)
int k ;
int k ;
if ( upsample ) {
if ( upsample ) {
LOCAL_ALIGNED ( 32 , float , samples , [ 64 ] , [ SAMPLES_PER_SUBBAND ] ) ;
if ( ! s - > qmf64_table ) {
if ( ! s - > qmf64_table ) {
s - > qmf64_table = qmf64_precompute ( ) ;
s - > qmf64_table = qmf64_precompute ( ) ;
if ( ! s - > qmf64_table )
if ( ! s - > qmf64_table )
@ -953,21 +948,31 @@ static int dca_filter_channels(DCAContext *s, int block_index, int upsample)
/* 64 subbands QMF */
/* 64 subbands QMF */
for ( k = 0 ; k < s - > audio_header . prim_channels ; k + + ) {
for ( k = 0 ; k < s - > audio_header . prim_channels ; k + + ) {
float ( * subband_samples ) [ SAMPLES_PER_SUBBAND ] = s - > dca_chan [ k ] . subband_samples [ block_index ] ;
int32_t ( * subband_samples ) [ SAMPLES_PER_SUBBAND ] =
s - > dca_chan [ k ] . subband_samples [ block_index ] ;
s - > fmt_conv . int32_to_float ( samples [ 0 ] , subband_samples [ 0 ] ,
64 * SAMPLES_PER_SUBBAND ) ;
if ( s - > channel_order_tab [ k ] > = 0 )
if ( s - > channel_order_tab [ k ] > = 0 )
qmf_64_subbands ( s , k , subband_samples ,
qmf_64_subbands ( s , k , samples ,
s - > samples_chanptr [ s - > channel_order_tab [ k ] ] ,
s - > samples_chanptr [ s - > channel_order_tab [ k ] ] ,
/* Upsampling needs a factor 2 here. */
/* Upsampling needs a factor 2 here. */
M_SQRT2 / 32768.0 ) ;
M_SQRT2 / 32768.0 ) ;
}
}
} else {
} else {
/* 32 subbands QMF */
/* 32 subbands QMF */
LOCAL_ALIGNED ( 32 , float , samples , [ 32 ] , [ SAMPLES_PER_SUBBAND ] ) ;
for ( k = 0 ; k < s - > audio_header . prim_channels ; k + + ) {
for ( k = 0 ; k < s - > audio_header . prim_channels ; k + + ) {
float ( * subband_samples ) [ SAMPLES_PER_SUBBAND ] = s - > dca_chan [ k ] . subband_samples [ block_index ] ;
int32_t ( * subband_samples ) [ SAMPLES_PER_SUBBAND ] =
s - > dca_chan [ k ] . subband_samples [ block_index ] ;
s - > fmt_conv . int32_to_float ( samples [ 0 ] , subband_samples [ 0 ] ,
32 * SAMPLES_PER_SUBBAND ) ;
if ( s - > channel_order_tab [ k ] > = 0 )
if ( s - > channel_order_tab [ k ] > = 0 )
qmf_32_subbands ( s , k , subband_samples ,
qmf_32_subbands ( s , k , samples ,
s - > samples_chanptr [ s - > channel_order_tab [ k ] ] ,
s - > samples_chanptr [ s - > channel_order_tab [ k ] ] ,
M_SQRT1_2 / 32768.0 ) ;
M_SQRT1_2 / 32768.0 ) ;
}
}