# HG changeset patch # User banan # Date 1225014893 0 # Node ID 17aeecee2a97a1cfe766c04fa6d6fa7fffda8a27 # Parent 8ce423998cca36a069930837cce674717ae4458a Fix dca decoder with non simd float2int16 conversion diff -r 8ce423998cca -r 17aeecee2a97 dca.c --- a/dca.c Sun Oct 26 09:50:15 2008 +0000 +++ b/dca.c Sun Oct 26 09:54:53 2008 +0000 @@ -67,7 +67,6 @@ #define DCA_LFE 0x80 #define HEADER_SIZE 14 -#define CONVERT_BIAS 384 #define DCA_MAX_FRAME_SIZE 16384 @@ -159,7 +158,8 @@ int hist_index[DCA_PRIM_CHANNELS_MAX]; int output; ///< type of output - int bias; ///< output bias + float add_bias; ///< output bias + float scale_bias; ///< output scale DECLARE_ALIGNED_16(float, samples[1536]); /* 6 * 256 = 1536, might only need 5 */ const float *samples_chanptr[6]; @@ -230,8 +230,6 @@ 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->bias = CONVERT_BIAS; - init_get_bits(&s->gb, s->dca_buffer, s->dca_buffer_size * 8); /* Sync code */ @@ -748,7 +746,7 @@ //FIXME the coeffs are symetric, fix that for (j = 0; j < 512 / decifactor; j++) rTmp += samples_in[deciindex - j] * prCoeff[k + j * decifactor]; - samples_out[interp_index++] = rTmp / scale + bias; + samples_out[interp_index++] = (rTmp * scale) + bias; } } } @@ -984,8 +982,8 @@ /* static float pcm_to_double[8] = {32768.0, 32768.0, 524288.0, 524288.0, 0, 8388608.0, 8388608.0};*/ qmf_32_subbands(s, k, subband_samples[k], &s->samples[256 * k], - M_SQRT1_2 /*pcm_to_double[s->source_pcm_res] */ , - 0 /*s->bias */ ); + M_SQRT1_2*s->scale_bias /*pcm_to_double[s->source_pcm_res] */ , + s->add_bias ); } /* Down mixing */ @@ -1003,7 +1001,7 @@ s->lfe_data + lfe_samples + 2 * s->lfe * subsubframe, &s->samples[256 * i_channels], - 256.0, 0 /* s->bias */); + (1.0/256.0)*s->scale_bias, s->add_bias); /* Outputs 20bits pcm samples */ } @@ -1214,6 +1212,16 @@ for(i = 0; i < 6; i++) s->samples_chanptr[i] = s->samples + i * 256; avctx->sample_fmt = SAMPLE_FMT_S16; + + if(s->dsp.float_to_int16 == ff_float_to_int16_c) { + s->add_bias = 385.0f; + s->scale_bias = 1.0 / 32768.0; + } else { + s->add_bias = 0.0f; + s->scale_bias = 1.0; + } + + return 0; }