@ -112,6 +112,7 @@ enum DCAXxchSpeakerMask {
# define DCA_NSYNCAUX 0x9A1105A0
# define SAMPLES_PER_SUBBAND 8 // number of samples per subband per subsubframe
/** Bit allocation */
typedef struct BitAlloc {
@ -437,7 +438,7 @@ static int dca_subframe_header(DCAContext *s, int base_channel, int block_index)
if ( ! base_channel ) {
s - > subsubframes [ s - > current_subframe ] = get_bits ( & s - > gb , 2 ) + 1 ;
if ( block_index + s - > subsubframes [ s - > current_subframe ] > s - > sample_blocks / 8 ) {
if ( block_index + s - > subsubframes [ s - > current_subframe ] > ( s - > sample_blocks / SAMPLES_PER_SUBBAND ) ) {
s - > subsubframes [ s - > current_subframe ] = 1 ;
return AVERROR_INVALIDDATA ;
}
@ -616,7 +617,7 @@ static int dca_subframe_header(DCAContext *s, int base_channel, int block_index)
}
static void qmf_32_subbands ( DCAContext * s , int chans ,
float samples_in [ 32 ] [ 8 ] , float * samples_out ,
float samples_in [ 32 ] [ SAMPLES_PER_SUBBAND ] , float * samples_out ,
float scale )
{
const float * prCoeff ;
@ -664,7 +665,7 @@ static QMF64_table *qmf64_precompute(void)
/* FIXME: Totally unoptimized. Based on the reference code and
* http : //multimedia.cx/mirror/dca-transform.pdf, with guessed tweaks
* for doubling the size . */
static void qmf_64_subbands ( DCAContext * s , int chans , float samples_in [ 64 ] [ 8 ] ,
static void qmf_64_subbands ( DCAContext * s , int chans , float samples_in [ 64 ] [ SAMPLES_PER_SUBBAND ] ,
float * samples_out , float scale )
{
float raXin [ 64 ] ;
@ -675,7 +676,7 @@ static void qmf_64_subbands(DCAContext *s, int chans, float samples_in[64][8],
for ( i = s - > subband_activity [ chans ] ; i < 64 ; i + + )
raXin [ i ] = 0.0 ;
for ( subindex = 0 ; subindex < 8 ; subindex + + ) {
for ( subindex = 0 ; subindex < SAMPLES_PER_SUBBAND ; subindex + + ) {
for ( i = 0 ; i < s - > subband_activity [ chans ] ; i + + )
raXin [ i ] = samples_in [ i ] [ subindex ] ;
@ -866,8 +867,8 @@ static int dca_subsubframe(DCAContext *s, int base_channel, int block_index)
const float * quant_step_table ;
/* FIXME */
float ( * subband_samples ) [ DCA_SUBBANDS ] [ 8 ] = s - > subband_samples [ block_index ] ;
LOCAL_ALIGNED_16 ( int32_t , block , [ 8 * DCA_SUBBANDS ] ) ;
float ( * subband_samples ) [ DCA_SUBBANDS ] [ SAMPLES_PER_SUBBAND ] = s - > subband_samples [ block_index ] ;
LOCAL_ALIGNED_16 ( int32_t , block , [ SAMPLES_PER_SUBBAND * DCA_SUBBANDS ] ) ;
/*
* Audio data
@ -905,7 +906,7 @@ static int dca_subsubframe(DCAContext *s, int base_channel, int block_index)
*/
if ( ! abits ) {
rscale [ l ] = 0 ;
memset ( block + 8 * l , 0 , 8 * sizeof ( block [ 0 ] ) ) ;
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 ] ;
@ -923,7 +924,7 @@ static int dca_subsubframe(DCAContext *s, int base_channel, int block_index)
block_code1 = get_bits ( & s - > gb , size ) ;
block_code2 = get_bits ( & s - > gb , size ) ;
err = decode_blockcodes ( block_code1 , block_code2 ,
levels , block + 8 * l ) ;
levels , block + SAMPLES_PER_SUBBAND * l ) ;
if ( err ) {
av_log ( s - > avctx , AV_LOG_ERROR ,
" ERROR: block code look-up failed \n " ) ;
@ -931,20 +932,20 @@ static int dca_subsubframe(DCAContext *s, int base_channel, int block_index)
}
} else {
/* no coding */
for ( m = 0 ; m < 8 ; m + + )
block [ 8 * l + m ] = get_sbits ( & s - > gb , abits - 3 ) ;
for ( m = 0 ; m < SAMPLES_PER_SUBBAND ; m + + )
block [ SAMPLES_PER_SUBBAND * l + m ] = get_sbits ( & s - > gb , abits - 3 ) ;
}
} else {
/* Huffman coded */
for ( m = 0 ; m < 8 ; m + + )
block [ 8 * l + m ] = get_bitalloc ( & s - > gb ,
for ( m = 0 ; m < SAMPLES_PER_SUBBAND ; m + + )
block [ SAMPLES_PER_SUBBAND * l + m ] = get_bitalloc ( & s - > gb ,
& dca_smpl_bitalloc [ abits ] , sel ) ;
}
}
}
s - > fmt_conv . int32_to_float_fmul_array8 ( & s - > fmt_conv , subband_samples [ k ] [ 0 ] ,
block , rscale , 8 * s - > vq_start_subband [ k ] ) ;
block , rscale , SAMPLES_PER_SUBBAND * s - > vq_start_subband [ k ] ) ;
for ( l = 0 ; l < s - > vq_start_subband [ k ] ; l + + ) {
int m ;
@ -963,7 +964,7 @@ static int dca_subsubframe(DCAContext *s, int base_channel, int block_index)
ff_dca_adpcm_vb [ s - > prediction_vq [ k ] [ l ] ] [ 3 ] *
s - > subband_samples_hist [ k ] [ l ] [ 0 ] ) *
( 1.0f / 8192 ) ;
for ( m = 1 ; m < 8 ; m + + ) {
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 ] ;
for ( n = 2 ; n < = 4 ; n + + )
@ -988,7 +989,7 @@ static int dca_subsubframe(DCAContext *s, int base_channel, int block_index)
s - > debug_flag | = 0x01 ;
}
s - > dcadsp . decode_hf ( subband_samples [ k ] , s - > high_freq_vq [ k ] ,
ff_dca_high_freq_vq , subsubframe * 8 ,
ff_dca_high_freq_vq , subsubframe * SAMPLES_PER_SUBBAND ,
s - > scale_factor [ k ] , s - > vq_start_subband [ k ] ,
s - > subband_activity [ k ] ) ;
}
@ -1012,7 +1013,7 @@ static int dca_subsubframe(DCAContext *s, int base_channel, int block_index)
static int dca_filter_channels ( DCAContext * s , int block_index , int upsample )
{
float ( * subband_samples ) [ DCA_SUBBANDS ] [ 8 ] = s - > subband_samples [ block_index ] ;
float ( * subband_samples ) [ DCA_SUBBANDS ] [ SAMPLES_PER_SUBBAND ] = s - > subband_samples [ block_index ] ;
int k ;
if ( upsample ) {
@ -1742,7 +1743,7 @@ static int dca_decode_frame(AVCodecContext *avctx, void *data,
s - > profile = FF_PROFILE_DTS ;
for ( i = 0 ; i < ( s - > sample_blocks / 8 ) ; i + + ) {
for ( i = 0 ; i < ( s - > sample_blocks / SAMPLES_PER_SUBBAND ) ; i + + ) {
if ( ( ret = dca_decode_block ( s , 0 , i ) ) ) {
av_log ( avctx , AV_LOG_ERROR , " error decoding block \n " ) ;
return ret ;
@ -1811,7 +1812,7 @@ static int dca_decode_frame(AVCodecContext *avctx, void *data,
return ret ;
/* get output buffer */
frame - > nb_samples = 256 * ( s - > sample_blocks / 8 ) ;
frame - > nb_samples = 256 * ( s - > sample_blocks / SAMPLES_PER_SUBBAND ) ;
if ( s - > exss_ext_mask & DCA_EXT_EXSS_XLL ) {
int xll_nb_samples = s - > xll_segments * s - > xll_smpl_in_seg ;
/* Check for invalid/unsupported conditions first */
@ -1881,7 +1882,7 @@ static int dca_decode_frame(AVCodecContext *avctx, void *data,
}
/* filter to get final output */
for ( i = 0 ; i < ( s - > sample_blocks / 8 ) ; i + + ) {
for ( i = 0 ; i < ( s - > sample_blocks / SAMPLES_PER_SUBBAND ) ; i + + ) {
int ch ;
unsigned block = upsample ? 512 : 256 ;
for ( ch = 0 ; ch < channels ; ch + + )
@ -1950,7 +1951,7 @@ static int dca_decode_frame(AVCodecContext *avctx, void *data,
}
/* update lfe history */
lfe_samples = 2 * s - > lfe * ( s - > sample_blocks / 8 ) ;
lfe_samples = 2 * s - > lfe * ( s - > sample_blocks / SAMPLES_PER_SUBBAND ) ;
for ( i = 0 ; i < 2 * s - > lfe * 4 ; i + + )
s - > lfe_data [ i ] = s - > lfe_data [ i + lfe_samples ] ;