@ -229,43 +229,47 @@ static int dca_parse_audio_coding_header(DCAContext *s, int base_channel)
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 } ;
s - > total_channels = get_bits ( & s - > gb , 3 ) + 1 + base_channel ;
s - > prim_channels = s - > total_channels ;
s - > audio_header . total_channels = get_bits ( & s - > gb , 3 ) + 1 + base_channel ;
s - > audio_header . prim_channels = s - > audio_header . total_channels ;
if ( s - > prim_channels > DCA_PRIM_CHANNELS_MAX )
s - > prim_channels = DCA_PRIM_CHANNELS_MAX ;
if ( s - > audio_header . prim_channels > DCA_PRIM_CHANNELS_MAX )
s - > audio_header . prim_channels = DCA_PRIM_CHANNELS_MAX ;
for ( i = base_channel ; i < s - > prim_channels ; i + + ) {
s - > subband_activity [ i ] = get_bits ( & s - > gb , 5 ) + 2 ;
if ( s - > subband_activity [ i ] > DCA_SUBBANDS )
s - > subband_activity [ i ] = DCA_SUBBANDS ;
for ( i = base_channel ; i < s - > audio_header . prim_channels ; i + + ) {
s - > audio_header . subband_activity [ i ] = get_bits ( & s - > gb , 5 ) + 2 ;
if ( s - > audio_header . subband_activity [ i ] > DCA_SUBBANDS )
s - > audio_header . subband_activity [ i ] = DCA_SUBBANDS ;
}
for ( i = base_channel ; i < s - > prim_channels ; i + + ) {
s - > vq_start_subband [ i ] = get_bits ( & s - > gb , 5 ) + 1 ;
if ( s - > vq_start_subband [ i ] > DCA_SUBBANDS )
s - > vq_start_subband [ i ] = DCA_SUBBANDS ;
for ( i = base_channel ; i < s - > audio_header . prim_channels ; i + + ) {
s - > audio_header . vq_start_subband [ i ] = get_bits ( & s - > gb , 5 ) + 1 ;
if ( s - > audio_header . vq_start_subband [ i ] > DCA_SUBBANDS )
s - > audio_header . vq_start_subband [ i ] = DCA_SUBBANDS ;
}
get_array ( & s - > gb , s - > joint_intensity + base_channel , s - > prim_channels - base_channel , 3 ) ;
get_array ( & s - > gb , s - > transient_huffman + base_channel , s - > prim_channels - base_channel , 2 ) ;
get_array ( & s - > gb , s - > scalefactor_huffman + base_channel , s - > prim_channels - base_channel , 3 ) ;
get_array ( & s - > gb , s - > bitalloc_huffman + base_channel , s - > prim_channels - base_channel , 3 ) ;
get_array ( & s - > gb , s - > audio_header . joint_intensity + base_channel ,
s - > audio_header . prim_channels - base_channel , 3 ) ;
get_array ( & s - > gb , s - > audio_header . transient_huffman + base_channel ,
s - > audio_header . prim_channels - base_channel , 2 ) ;
get_array ( & s - > gb , s - > audio_header . scalefactor_huffman + base_channel ,
s - > audio_header . prim_channels - base_channel , 3 ) ;
get_array ( & s - > gb , s - > audio_header . bitalloc_huffman + base_channel ,
s - > audio_header . prim_channels - base_channel , 3 ) ;
/* Get codebooks quantization indexes */
if ( ! base_channel )
memset ( s - > quant_index_huffman , 0 , sizeof ( s - > quant_index_huffman ) ) ;
memset ( s - > audio_header . quant_index_huffman , 0 , sizeof ( s - > audio_header . quant_index_huffman ) ) ;
for ( j = 1 ; j < 11 ; j + + )
for ( i = base_channel ; i < s - > prim_channels ; i + + )
s - > quant_index_huffman [ i ] [ j ] = get_bits ( & s - > gb , bitlen [ j ] ) ;
for ( i = base_channel ; i < s - > audio_header . prim_channels ; i + + )
s - > audio_header . quant_index_huffman [ i ] [ j ] = get_bits ( & s - > gb , bitlen [ j ] ) ;
/* Get scale factor adjustment */
for ( j = 0 ; j < 11 ; j + + )
for ( i = base_channel ; i < s - > prim_channels ; i + + )
s - > scalefactor_adj [ i ] [ j ] = 1 ;
for ( i = base_channel ; i < s - > audio_header . prim_channels ; i + + )
s - > audio_header . scalefactor_adj [ i ] [ j ] = 1 ;
for ( j = 1 ; j < 11 ; j + + )
for ( i = base_channel ; i < s - > prim_channels ; i + + )
if ( s - > quant_index_huffman [ i ] [ j ] < thr [ j ] )
s - > scalefactor_adj [ i ] [ j ] = adj_table [ get_bits ( & s - > gb , 2 ) ] ;
for ( i = base_channel ; i < s - > audio_header . prim_channels ; i + + )
if ( s - > audio_header . quant_index_huffman [ i ] [ j ] < thr [ j ] )
s - > audio_header . scalefactor_adj [ i ] [ j ] = adj_table [ get_bits ( & s - > gb , 2 ) ] ;
if ( s - > crc_present ) {
/* Audio header CRC check */
@ -336,7 +340,7 @@ static int dca_parse_frame_header(DCAContext *s)
s - > output | = DCA_LFE ;
/* Primary audio coding header */
s - > subframes = get_bits ( & s - > gb , 4 ) + 1 ;
s - > audio_header . subframes = get_bits ( & s - > gb , 4 ) + 1 ;
return dca_parse_audio_coding_header ( s , 0 ) ;
}
@ -371,53 +375,53 @@ static int dca_subframe_header(DCAContext *s, int base_channel, int block_index)
s - > partial_samples [ s - > current_subframe ] = get_bits ( & s - > gb , 3 ) ;
}
for ( j = base_channel ; j < s - > prim_channels ; j + + ) {
for ( k = 0 ; k < s - > subband_activity [ j ] ; k + + )
s - > prediction_mode [ j ] [ k ] = get_bits ( & s - > gb , 1 ) ;
for ( j = base_channel ; j < s - > audio_header . prim_channels ; j + + ) {
for ( k = 0 ; k < s - > audio_header . subband_activity [ j ] ; k + + )
s - > dca_chan [ j ] . prediction_mode [ k ] = get_bits ( & s - > gb , 1 ) ;
}
/* Get prediction codebook */
for ( j = base_channel ; j < s - > prim_channels ; j + + ) {
for ( k = 0 ; k < s - > subband_activity [ j ] ; k + + ) {
if ( s - > prediction_mode [ j ] [ k ] > 0 ) {
for ( j = base_channel ; j < s - > audio_header . prim_channels ; j + + ) {
for ( k = 0 ; k < s - > audio_header . subband_activity [ j ] ; k + + ) {
if ( s - > dca_chan [ j ] . prediction_mode [ k ] > 0 ) {
/* (Prediction coefficient VQ address) */
s - > prediction_vq [ j ] [ k ] = get_bits ( & s - > gb , 12 ) ;
s - > dca_chan [ j ] . prediction_vq [ k ] = get_bits ( & s - > gb , 12 ) ;
}
}
}
/* Bit allocation index */
for ( j = base_channel ; j < s - > prim_channels ; j + + ) {
for ( k = 0 ; k < s - > vq_start_subband [ j ] ; k + + ) {
if ( s - > bitalloc_huffman [ j ] = = 6 )
s - > bitalloc [ j ] [ k ] = get_bits ( & s - > gb , 5 ) ;
else if ( s - > bitalloc_huffman [ j ] = = 5 )
s - > bitalloc [ j ] [ k ] = get_bits ( & s - > gb , 4 ) ;
else if ( s - > bitalloc_huffman [ j ] = = 7 ) {
for ( j = base_channel ; j < s - > audio_header . prim_channels ; j + + ) {
for ( k = 0 ; k < s - > audio_header . vq_start_subband [ j ] ; k + + ) {
if ( s - > audio_header . bitalloc_huffman [ j ] = = 6 )
s - > dca_chan [ j ] . bitalloc [ k ] = get_bits ( & s - > gb , 5 ) ;
else if ( s - > audio_header . bitalloc_huffman [ j ] = = 5 )
s - > dca_chan [ j ] . bitalloc [ k ] = get_bits ( & s - > gb , 4 ) ;
else if ( s - > audio_header . bitalloc_huffman [ j ] = = 7 ) {
av_log ( s - > avctx , AV_LOG_ERROR ,
" Invalid bit allocation index \n " ) ;
return AVERROR_INVALIDDATA ;
} else {
s - > bitalloc [ j ] [ k ] =
get_bitalloc ( & s - > gb , & dca_bitalloc_index , s - > bitalloc_huffman [ j ] ) ;
s - > dca_chan [ j ] . bitalloc [ k ] =
get_bitalloc ( & s - > gb , & dca_bitalloc_index , s - > audio_header . bitalloc_huffman [ j ] ) ;
}
if ( s - > bitalloc [ j ] [ k ] > 26 ) {
if ( s - > dca_chan [ j ] . bitalloc [ k ] > 26 ) {
ff_dlog ( s - > avctx , " bitalloc index [%i][%i] too big (%i) \n " ,
j , k , s - > bitalloc [ j ] [ k ] ) ;
j , k , s - > dca_chan [ j ] . bitalloc [ k ] ) ;
return AVERROR_INVALIDDATA ;
}
}
}
/* Transition mode */
for ( j = base_channel ; j < s - > prim_channels ; j + + ) {
for ( k = 0 ; k < s - > subband_activity [ j ] ; k + + ) {
s - > transition_mode [ j ] [ k ] = 0 ;
for ( j = base_channel ; j < s - > audio_header . prim_channels ; j + + ) {
for ( k = 0 ; k < s - > audio_header . subband_activity [ j ] ; k + + ) {
s - > dca_chan [ j ] . transition_mode [ k ] = 0 ;
if ( s - > subsubframes [ s - > current_subframe ] > 1 & &
k < s - > vq_start_subband [ j ] & & s - > bitalloc [ j ] [ k ] > 0 ) {
s - > transition_mode [ j ] [ k ] =
get_bitalloc ( & s - > gb , & dca_tmode , s - > transient_huffman [ j ] ) ;
k < s - > audio_header . vq_start_subband [ j ] & & s - > dca_chan [ j ] . bitalloc [ k ] > 0 ) {
s - > dca_chan [ j ] . transition_mode [ k ] =
get_bitalloc ( & s - > gb , & dca_tmode , s - > audio_header . transient_huffman [ j ] ) ;
}
}
}
@ -425,14 +429,14 @@ static int dca_subframe_header(DCAContext *s, int base_channel, int block_index)
if ( get_bits_left ( & s - > gb ) < 0 )
return AVERROR_INVALIDDATA ;
for ( j = base_channel ; j < s - > prim_channels ; j + + ) {
for ( j = base_channel ; j < s - > audio_header . prim_channels ; j + + ) {
const uint32_t * scale_table ;
int scale_sum , log_size ;
memset ( s - > scale_factor [ j ] , 0 ,
s - > subband_activity [ j ] * sizeof ( s - > scale_factor [ 0 ] [ 0 ] [ 0 ] ) * 2 ) ;
memset ( s - > dca_chan [ j ] . scale_factor , 0 ,
s - > audio_header . subband_activity [ j ] * sizeof ( s - > dca_chan [ j ] . scale_factor [ 0 ] [ 0 ] ) * 2 ) ;
if ( s - > scalefactor_huffman [ j ] = = 6 ) {
if ( s - > audio_header . scalefactor_huffman [ j ] = = 6 ) {
scale_table = ff_dca_scale_factor_quant7 ;
log_size = 7 ;
} else {
@ -443,45 +447,46 @@ static int dca_subframe_header(DCAContext *s, int base_channel, int block_index)
/* When huffman coded, only the difference is encoded */
scale_sum = 0 ;
for ( k = 0 ; k < s - > subband_activity [ j ] ; k + + ) {
if ( k > = s - > vq_start_subband [ j ] | | s - > bitalloc [ j ] [ k ] > 0 ) {
scale_sum = get_scale ( & s - > gb , s - > scalefactor_huffman [ j ] , scale_sum , log_size ) ;
s - > scale_factor [ j ] [ k ] [ 0 ] = scale_table [ scale_sum ] ;
for ( k = 0 ; k < s - > audio_header . subband_activity [ j ] ; k + + ) {
if ( k > = s - > audio_header . vq_start_subband [ j ] | | s - > dca_chan [ j ] . bitalloc [ k ] > 0 ) {
scale_sum = get_scale ( & s - > gb , s - > audio_header . scalefactor_huffman [ j ] , scale_sum , log_size ) ;
s - > dca_chan [ j ] . scale_factor [ k ] [ 0 ] = scale_table [ scale_sum ] ;
}
if ( k < s - > vq_start_subband [ j ] & & s - > transition_mode [ j ] [ k ] ) {
if ( k < s - > audio_header . vq_start_subband [ j ] & & s - > dca_chan [ j ] . transition_mode [ k ] ) {
/* Get second scale factor */
scale_sum = get_scale ( & s - > gb , s - > scalefactor_huffman [ j ] , scale_sum , log_size ) ;
s - > scale_factor [ j ] [ k ] [ 1 ] = scale_table [ scale_sum ] ;
scale_sum = get_scale ( & s - > gb , s - > audio_header . scalefactor_huffman [ j ] , scale_sum , log_size ) ;
s - > dca_chan [ j ] . scale_factor [ k ] [ 1 ] = scale_table [ scale_sum ] ;
}
}
}
/* Joint subband scale factor codebook select */
for ( j = base_channel ; j < s - > prim_channels ; j + + ) {
for ( j = base_channel ; j < s - > audio_header . prim_channels ; j + + ) {
/* Transmitted only if joint subband coding enabled */
if ( s - > joint_intensity [ j ] > 0 )
s - > joint_huff [ j ] = get_bits ( & s - > gb , 3 ) ;
if ( s - > audio_header . joint_intensity [ j ] > 0 )
s - > dca_chan [ j ] . joint_huff = get_bits ( & s - > gb , 3 ) ;
}
if ( get_bits_left ( & s - > gb ) < 0 )
return AVERROR_INVALIDDATA ;
/* Scale factors for joint subband coding */
for ( j = base_channel ; j < s - > prim_channels ; j + + ) {
for ( j = base_channel ; j < s - > audio_header . prim_channels ; j + + ) {
int source_channel ;
/* Transmitted only if joint subband coding enabled */
if ( s - > joint_intensity [ j ] > 0 ) {
if ( s - > audio_header . joint_intensity [ j ] > 0 ) {
int scale = 0 ;
source_channel = s - > joint_intensity [ j ] - 1 ;
source_channel = s - > audio_header . joint_intensity [ j ] - 1 ;
/* When huffman coded, only the difference is encoded
* ( is this valid as well for joint scales ? ? ? ) */
for ( k = s - > subband_activity [ j ] ; k < s - > subband_activity [ source_channel ] ; k + + ) {
scale = get_scale ( & s - > gb , s - > joint_huff [ j ] , 64 /* bias */ , 7 ) ;
s - > joint_scale_factor [ j ] [ k ] = scale ; /*joint_scale_table[scale]; */
for ( k = s - > audio_header . subband_activity [ j ] ;
k < s - > audio_header . subband_activity [ source_channel ] ; k + + ) {
scale = get_scale ( & s - > gb , s - > dca_chan [ j ] . joint_huff , 64 /* bias */ , 7 ) ;
s - > dca_chan [ j ] . joint_scale_factor [ k ] = scale ; /*joint_scale_table[scale]; */
}
if ( ! ( s - > debug_flag & 0x02 ) ) {
@ -506,10 +511,10 @@ static int dca_subframe_header(DCAContext *s, int base_channel, int block_index)
*/
/* VQ encoded high frequency subbands */
for ( j = base_channel ; j < s - > prim_channels ; j + + )
for ( k = s - > vq_start_subband [ j ] ; k < s - > subband_activity [ j ] ; k + + )
for ( j = base_channel ; j < s - > audio_header . prim_channels ; j + + )
for ( k = s - > audio_header . vq_start_subband [ j ] ; k < s - > audio_header . subband_activity [ j ] ; k + + )
/* 1 vector -> 32 samples */
s - > high_freq_vq [ j ] [ k ] = get_bits ( & s - > gb , 10 ) ;
s - > dca_chan [ j ] . high_freq_vq [ k ] = get_bits ( & s - > gb , 10 ) ;
/* Low frequency effect data */
if ( ! base_channel & & s - > lfe ) {
@ -543,7 +548,7 @@ static void qmf_32_subbands(DCAContext *s, int chans,
{
const float * prCoeff ;
int sb_act = s - > subband_activity [ chans ] ;
int sb_act = s - > audio_header . subband_activity [ chans ] ;
scale * = sqrt ( 1 / 8.0 ) ;
@ -554,9 +559,9 @@ static void qmf_32_subbands(DCAContext *s, int chans,
prCoeff = ff_dca_fir_32bands_perfect ;
s - > dcadsp . qmf_32_subbands ( samples_in , sb_act , & s - > synth , & s - > imdct ,
s - > subband_fir_hist [ chans ] ,
& s - > hist_index [ chans ] ,
s - > subband_fir_noidea [ chans ] , prCoeff ,
s - > dca_chan [ chans ] . subband_fir_hist ,
& s - > dca_chan [ chans ] . hist_index ,
s - > dca_chan [ chans ] . subband_fir_noidea , prCoeff ,
samples_out , s - > raXin , scale ) ;
}
@ -591,14 +596,14 @@ static void qmf_64_subbands(DCAContext *s, int chans, float samples_in[64][SAMPL
{
float raXin [ 64 ] ;
float A [ 32 ] , B [ 32 ] ;
float * raX = s - > subband_fir_hist [ chans ] ;
float * raZ = s - > subband_fir_noidea [ chans ] ;
float * raX = s - > dca_chan [ chans ] . subband_fir_hist ;
float * raZ = s - > dca_chan [ chans ] . subband_fir_noidea ;
unsigned i , j , k , subindex ;
for ( i = s - > subband_activity [ chans ] ; i < 64 ; i + + )
for ( i = s - > audio_header . subband_activity [ chans ] ; i < 64 ; i + + )
raXin [ i ] = 0.0 ;
for ( subindex = 0 ; subindex < SAMPLES_PER_SUBBAND ; subindex + + ) {
for ( i = 0 ; i < s - > subband_activity [ chans ] ; i + + )
for ( i = 0 ; i < s - > audio_header . subband_activity [ chans ] ; i + + )
raXin [ i ] = samples_in [ i ] [ subindex ] ;
for ( k = 0 ; k < 32 ; k + + ) {
@ -787,8 +792,6 @@ static int dca_subsubframe(DCAContext *s, int base_channel, int block_index)
const float * quant_step_table ;
/* FIXME */
float ( * subband_samples ) [ DCA_SUBBANDS ] [ SAMPLES_PER_SUBBAND ] = s - > subband_samples [ block_index ] ;
LOCAL_ALIGNED_16 ( int32_t , block , [ SAMPLES_PER_SUBBAND * DCA_SUBBANDS ] ) ;
/*
@ -801,17 +804,18 @@ static int dca_subsubframe(DCAContext *s, int base_channel, int block_index)
else
quant_step_table = ff_dca_lossy_quant_d ;
for ( k = base_channel ; k < s - > 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 ] ;
float rscale [ DCA_SUBBANDS ] ;
if ( get_bits_left ( & s - > gb ) < 0 )
return AVERROR_INVALIDDATA ;
for ( l = 0 ; l < s - > vq_start_subband [ k ] ; l + + ) {
for ( l = 0 ; l < s - > audio_header . vq_start_subband [ k ] ; l + + ) {
int m ;
/* Select the mid-tread linear quantizer */
int abits = s - > bitalloc [ k ] [ l ] ;
int abits = s - > dca_chan [ k ] . bitalloc [ l ] ;
float quant_step_size = quant_step_table [ abits ] ;
@ -820,7 +824,7 @@ static int dca_subsubframe(DCAContext *s, int base_channel, int block_index)
*/
/* Select quantization index code book */
int sel = s - > quant_index_huffman [ k ] [ abits ] ;
int sel = s - > audio_header . quant_index_huffman [ k ] [ abits ] ;
/*
* Extract bits from the bit stream
@ -830,9 +834,10 @@ static int dca_subsubframe(DCAContext *s, int base_channel, int block_index)
memset ( block + SAMPLES_PER_SUBBAND * l , 0 , SAMPLES_PER_SUBBAND * sizeof ( block [ 0 ] ) ) ;
} else {
/* Deal with transients */
int sfi = s - > transition_mode [ k ] [ l ] & & subsubframe > = s - > transition_mode [ k ] [ l ] ;
rscale [ l ] = quant_step_size * s - > scale_factor [ k ] [ l ] [ sfi ] *
s - > scalefactor_adj [ k ] [ sel ] ;
int sfi = 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 ] *
s - > audio_header . scalefactor_adj [ k ] [ sel ] ;
if ( abits > = 11 | | ! dca_smpl_bitalloc [ abits ] . vlc [ sel ] . table ) {
if ( abits < = 7 ) {
@ -865,54 +870,61 @@ static int dca_subsubframe(DCAContext *s, int base_channel, int block_index)
}
}
s - > fmt_conv . int32_to_float_fmul_array8 ( & s - > fmt_conv , subband_samples [ k ] [ 0 ] ,
block , rscale , SAMPLES_PER_SUBBAND * s - > vq_start_subband [ k ] ) ;
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 - > vq_start_subband [ k ] ; l + + ) {
for ( l = 0 ; l < s - > audio_header . vq_start_subband [ k ] ; l + + ) {
int m ;
/*
* Inverse ADPCM if in prediction mode
*/
if ( s - > prediction_mode [ k ] [ l ] ) {
if ( s - > dca_chan [ k ] . prediction_mode [ l ] ) {
int n ;
if ( s - > predictor_history )
subband_samples [ k ] [ l ] [ 0 ] + = ( ff_dca_adpcm_vb [ s - > prediction_vq [ k ] [ l ] ] [ 0 ] *
s - > subband_samples_hist [ k ] [ l ] [ 3 ] +
ff_dca_adpcm_vb [ s - > prediction_vq [ k ] [ l ] ] [ 1 ] *
s - > subband_samples_hist [ k ] [ l ] [ 2 ] +
ff_dca_adpcm_vb [ s - > prediction_vq [ k ] [ l ] ] [ 2 ] *
s - > subband_samples_hist [ k ] [ l ] [ 1 ] +
ff_dca_adpcm_vb [ s - > prediction_vq [ k ] [ l ] ] [ 3 ] *
s - > subband_samples_hist [ k ] [ 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 ] +
ff_dca_adpcm_vb [ s - > dca_chan [ k ] . prediction_vq [ l ] ] [ 1 ] *
s - > dca_chan [ k ] . subband_samples_hist [ l ] [ 2 ] +
ff_dca_adpcm_vb [ s - > dca_chan [ k ] . prediction_vq [ l ] ] [ 2 ] *
s - > dca_chan [ k ] . subband_samples_hist [ l ] [ 1 ] +
ff_dca_adpcm_vb [ s - > dca_chan [ k ] . prediction_vq [ l ] ] [ 3 ] *
s - > dca_chan [ k ] . subband_samples_hist [ l ] [ 0 ] ) *
( 1.0f / 8192 ) ;
for ( m = 1 ; m < SAMPLES_PER_SUBBAND ; m + + ) {
float sum = ff_dca_adpcm_vb [ s - > prediction_vq [ k ] [ l ] ] [ 0 ] *
subband_samples [ k ] [ l ] [ m - 1 ] ;
float sum = ff_dca_adpcm_vb [ s - > dca_chan [ k ] . prediction_vq [ l ] ] [ 0 ] *
subband_samples [ l ] [ m - 1 ] ;
for ( n = 2 ; n < = 4 ; n + + )
if ( m > = n )
sum + = ff_dca_adpcm_vb [ s - > prediction_vq [ k ] [ l ] ] [ n - 1 ] *
subband_samples [ k ] [ l ] [ m - n ] ;
sum + = ff_dca_adpcm_vb [ s - > dca_chan [ k ] . prediction_vq [ l ] ] [ n - 1 ] *
subband_samples [ l ] [ m - n ] ;
else if ( s - > predictor_history )
sum + = ff_dca_adpcm_vb [ s - > prediction_vq [ k ] [ l ] ] [ n - 1 ] *
s - > subband_samples_hist [ k ] [ l ] [ m - n + 4 ] ;
subband_samples [ k ] [ l ] [ m ] + = sum * 1.0f / 8192 ;
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 ] ;
subband_samples [ l ] [ m ] + = sum * 1.0f / 8192 ;
}
}
}
/* Backup predictor history for adpcm */
for ( l = 0 ; l < DCA_SUBBANDS ; l + + )
AV_COPY128 ( s - > dca_chan [ k ] . subband_samples_hist [ l ] , & subband_samples [ l ] [ 4 ] ) ;
/*
* Decode VQ encoded high frequencies
*/
if ( s - > subband_activity [ k ] > s - > vq_start_subband [ k ] ) {
if ( s - > audio_header . subband_activity [ k ] > s - > audio_header . vq_start_subband [ k ] ) {
if ( ! s - > debug_flag & 0x01 ) {
av_log ( s - > avctx , AV_LOG_DEBUG ,
" Stream with high frequencies VQ coding \n " ) ;
s - > debug_flag | = 0x01 ;
}
s - > dcadsp . decode_hf ( subband_samples [ k ] , s - > high_freq_vq [ k ] ,
s - > dcadsp . decode_hf ( subband_samples , s - > dca_chan [ k ] . high_freq_vq ,
ff_dca_high_freq_vq , subsubframe * SAMPLES_PER_SUBBAND ,
s - > scale_factor [ k ] , s - > vq_start_subband [ k ] ,
s - > subband_activity [ k ] ) ;
s - > dca_chan [ k ] . scale_factor ,
s - > audio_header . vq_start_subband [ k ] ,
s - > audio_header . subband_activity [ k ] ) ;
}
}
@ -924,17 +936,11 @@ static int dca_subsubframe(DCAContext *s, int base_channel, int block_index)
}
}
/* Backup predictor history for adpcm */
for ( k = base_channel ; k < s - > prim_channels ; k + + )
for ( l = 0 ; l < s - > vq_start_subband [ k ] ; l + + )
AV_COPY128 ( s - > subband_samples_hist [ k ] [ l ] , & subband_samples [ k ] [ l ] [ 4 ] ) ;
return 0 ;
}
static int dca_filter_channels ( DCAContext * s , int block_index , int upsample )
{
float ( * subband_samples ) [ DCA_SUBBANDS ] [ SAMPLES_PER_SUBBAND ] = s - > subband_samples [ block_index ] ;
int k ;
if ( upsample ) {
@ -945,18 +951,22 @@ static int dca_filter_channels(DCAContext *s, int block_index, int upsample)
}
/* 64 subbands QMF */
for ( k = 0 ; k < s - > 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 ] ;
if ( s - > channel_order_tab [ k ] > = 0 )
qmf_64_subbands ( s , k , subband_samples [ k ] ,
qmf_64_subbands ( s , k , subband_samples ,
s - > samples_chanptr [ s - > channel_order_tab [ k ] ] ,
/* Upsampling needs a factor 2 here. */
M_SQRT2 / 32768.0 ) ;
}
} else {
/* 32 subbands QMF */
for ( k = 0 ; k < s - > 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 ] ;
if ( s - > channel_order_tab [ k ] > = 0 )
qmf_32_subbands ( s , k , subband_samples [ k ] ,
qmf_32_subbands ( s , k , subband_samples ,
s - > samples_chanptr [ s - > channel_order_tab [ k ] ] ,
M_SQRT1_2 / 32768.0 ) ;
}
@ -983,7 +993,7 @@ static int dca_filter_channels(DCAContext *s, int block_index, int upsample)
/* FIXME: This downmixing is probably broken with upsample.
* Probably totally broken also with XLL in general . */
/* Downmixing to Stereo */
if ( s - > prim_channels + ! ! s - > lfe > 2 & &
if ( s - > audio_header . prim_channels + ! ! s - > lfe > 2 & &
s - > avctx - > request_channel_layout = = AV_CH_LAYOUT_STEREO ) {
dca_downmix ( s - > samples_chanptr , s - > amode , ! ! s - > lfe , s - > downmix_coef ,
s - > channel_order_tab ) ;
@ -1060,7 +1070,7 @@ static int dca_subframe_footer(DCAContext *s, int base_channel)
return AVERROR_INVALIDDATA ;
}
for ( out = 0 ; out < ff_dca_channels [ s - > core_downmix_amode ] ; out + + ) {
for ( in = 0 ; in < s - > prim_channels + ! ! s - > lfe ; in + + ) {
for ( in = 0 ; in < s - > audio_header . prim_channels + ! ! s - > lfe ; in + + ) {
uint16_t tmp = get_bits ( & s - > gb , 9 ) ;
if ( ( tmp & 0xFF ) > 241 ) {
av_log ( s - > avctx , AV_LOG_ERROR ,
@ -1106,9 +1116,9 @@ static int dca_decode_block(DCAContext *s, int base_channel, int block_index)
int ret ;
/* Sanity check */
if ( s - > current_subframe > = s - > subframes ) {
if ( s - > current_subframe > = s - > audio_header . subframes ) {
av_log ( s - > avctx , AV_LOG_DEBUG , " check failed: %i>%i " ,
s - > current_subframe , s - > subframes ) ;
s - > current_subframe , s - > audio_header . subframes ) ;
return AVERROR_INVALIDDATA ;
}
@ -1128,7 +1138,7 @@ static int dca_decode_block(DCAContext *s, int base_channel, int block_index)
s - > current_subsubframe = 0 ;
s - > current_subframe + + ;
}
if ( s - > current_subframe > = s - > subframes ) {
if ( s - > current_subframe > = s - > audio_header . subframes ) {
/* Read subframe footer */
if ( ( ret = dca_subframe_footer ( s , base_channel ) ) )
return ret ;
@ -1169,7 +1179,7 @@ static int scan_for_extensions(AVCodecContext *avctx)
case DCA_SYNCWORD_XCH : {
int ext_amode , xch_fsize ;
s - > xch_base_channel = s - > prim_channels ;
s - > xch_base_channel = s - > audio_header . prim_channels ;
/* validate sync word using XCHFSIZE field */
xch_fsize = show_bits ( & s - > gb , 10 ) ;
@ -1254,7 +1264,7 @@ static int set_channel_layout(AVCodecContext *avctx, int channels, int num_core_
if ( s - > amode < 16 ) {
avctx - > channel_layout = dca_core_channel_layout [ s - > amode ] ;
if ( s - > prim_channels + ! ! s - > lfe > 2 & &
if ( s - > audio_header . prim_channels + ! ! s - > lfe > 2 & &
avctx - > request_channel_layout = = AV_CH_LAYOUT_STEREO ) {
/*
* Neither the core ' s auxiliary data nor our default tables contain
@ -1289,7 +1299,7 @@ static int set_channel_layout(AVCodecContext *avctx, int channels, int num_core_
if ( num_core_channels + ! ! s - > lfe > 2 & &
avctx - > request_channel_layout = = AV_CH_LAYOUT_STEREO ) {
channels = 2 ;
s - > output = s - > prim_channels = = 2 ? s - > amode : DCA_STEREO ;
s - > output = s - > audio_header . prim_channels = = 2 ? s - > amode : DCA_STEREO ;
avctx - > channel_layout = AV_CH_LAYOUT_STEREO ;
/* Stereo downmix coefficients
@ -1315,7 +1325,7 @@ static int set_channel_layout(AVCodecContext *avctx, int channels, int num_core_
if ( num_core_channels + ! ! s - > lfe >
FF_ARRAY_ELEMS ( ff_dca_default_coeffs [ 0 ] ) ) {
avpriv_request_sample ( s - > avctx , " Downmixing %d channels " ,
s - > prim_channels + ! ! s - > lfe ) ;
s - > audio_header . prim_channels + ! ! s - > lfe ) ;
return AVERROR_PATCHWELCOME ;
}
for ( i = 0 ; i < num_core_channels + ! ! s - > lfe ; i + + ) {
@ -1387,7 +1397,7 @@ static int dca_decode_frame(AVCodecContext *avctx, void *data,
}
/* record number of core channels incase less than max channels are requested */
num_core_channels = s - > prim_channels ;
num_core_channels = s - > audio_header . prim_channels ;
if ( s - > ext_coding )
s - > core_ext_mask = dca_ext_audio_descr_mask [ s - > ext_descr ] ;
@ -1398,7 +1408,7 @@ static int dca_decode_frame(AVCodecContext *avctx, void *data,
avctx - > profile = s - > profile ;
full_channels = channels = s - > prim_channels + ! ! s - > lfe ;
full_channels = channels = s - > audio_header . prim_channels + ! ! s - > lfe ;
ret = set_channel_layout ( avctx , channels , num_core_channels ) ;
if ( ret < 0 )