DCA: optimise dca_subsubframe()

8% faster overall on Cortex-A8.

Originally committed as revision 22871 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Måns Rullgård 2010-04-13 10:15:00 +00:00
parent 2898526d6a
commit 69e171364e
1 changed files with 13 additions and 19 deletions

View File

@ -919,7 +919,8 @@ static int dca_subsubframe(DCAContext * s)
const float *quant_step_table; const float *quant_step_table;
/* FIXME */ /* FIXME */
float subband_samples[DCA_PRIM_CHANNELS_MAX][DCA_SUBBANDS][8]; LOCAL_ALIGNED_16(float, subband_samples, [DCA_PRIM_CHANNELS_MAX], [DCA_SUBBANDS][8]);
LOCAL_ALIGNED_16(int, block, [8]);
/* /*
* Audio data * Audio data
@ -939,7 +940,6 @@ static int dca_subsubframe(DCAContext * s)
int abits = s->bitalloc[k][l]; int abits = s->bitalloc[k][l];
float quant_step_size = quant_step_table[abits]; float quant_step_size = quant_step_table[abits];
float rscale;
/* /*
* Determine quantization index code book and its type * Determine quantization index code book and its type
@ -953,11 +953,15 @@ static int dca_subsubframe(DCAContext * s)
*/ */
if(!abits){ if(!abits){
memset(subband_samples[k][l], 0, 8 * sizeof(subband_samples[0][0][0])); memset(subband_samples[k][l], 0, 8 * sizeof(subband_samples[0][0][0]));
}else if(abits >= 11 || !dca_smpl_bitalloc[abits].vlc[sel].table){ } else {
/* Deal with transients */
int sfi = s->transition_mode[k][l] && subsubframe >= s->transition_mode[k][l];
float rscale = quant_step_size * s->scale_factor[k][l][sfi] * s->scalefactor_adj[k][sel];
if(abits >= 11 || !dca_smpl_bitalloc[abits].vlc[sel].table){
if(abits <= 7){ if(abits <= 7){
/* Block code */ /* Block code */
int block_code1, block_code2, size, levels; int block_code1, block_code2, size, levels;
int block[8];
size = abits_sizes[abits-1]; size = abits_sizes[abits-1];
levels = abits_levels[abits-1]; levels = abits_levels[abits-1];
@ -967,30 +971,20 @@ static int dca_subsubframe(DCAContext * s)
decode_blockcode(block_code1, levels, block); decode_blockcode(block_code1, levels, block);
block_code2 = get_bits(&s->gb, size); block_code2 = get_bits(&s->gb, size);
decode_blockcode(block_code2, levels, &block[4]); decode_blockcode(block_code2, levels, &block[4]);
for (m = 0; m < 8; m++)
subband_samples[k][l][m] = block[m];
}else{ }else{
/* no coding */ /* no coding */
for (m = 0; m < 8; m++) for (m = 0; m < 8; m++)
subband_samples[k][l][m] = get_sbits(&s->gb, abits - 3); block[m] = get_sbits(&s->gb, abits - 3);
} }
}else{ }else{
/* Huffman coded */ /* Huffman coded */
for (m = 0; m < 8; m++) for (m = 0; m < 8; m++)
subband_samples[k][l][m] = get_bitalloc(&s->gb, &dca_smpl_bitalloc[abits], sel); block[m] = get_bitalloc(&s->gb, &dca_smpl_bitalloc[abits], sel);
} }
/* Deal with transients */ s->dsp.int32_to_float_fmul_scalar(subband_samples[k][l],
if (s->transition_mode[k][l] && block, rscale, 8);
subsubframe >= s->transition_mode[k][l]) }
rscale = quant_step_size * s->scale_factor[k][l][1];
else
rscale = quant_step_size * s->scale_factor[k][l][0];
rscale *= s->scalefactor_adj[k][sel];
for (m = 0; m < 8; m++)
subband_samples[k][l][m] *= rscale;
/* /*
* Inverse ADPCM if in prediction mode * Inverse ADPCM if in prediction mode