# HG changeset patch # User banan # Date 1280267143 0 # Node ID 67cb57c918b63f71d879b5050b44eeea6275c78e # Parent 91e45d11dd6e4146f6ba519100254419ee33c76c DCA: fix multichannel -> 2 channel downmix. Patch by Nick Brereton diff -r 91e45d11dd6e -r 67cb57c918b6 dca.c --- a/dca.c Tue Jul 27 21:44:09 2010 +0000 +++ b/dca.c Tue Jul 27 21:45:43 2010 +0000 @@ -879,17 +879,19 @@ /* downmixing routines */ #define MIX_REAR1(samples, si1, rs, coef) \ - samples[i] += samples[si1] * coef[rs][0]; \ - samples[i+256] += samples[si1] * coef[rs][1]; + samples[i] += (samples[si1] - add_bias) * coef[rs][0]; \ + samples[i+256] += (samples[si1] - add_bias) * coef[rs][1]; #define MIX_REAR2(samples, si1, si2, rs, coef) \ - samples[i] += samples[si1] * coef[rs][0] + samples[si2] * coef[rs+1][0]; \ - samples[i+256] += samples[si1] * coef[rs][1] + samples[si2] * coef[rs+1][1]; + samples[i] += (samples[si1] - add_bias) * coef[rs][0] + (samples[si2] - add_bias) * coef[rs+1][0]; \ + samples[i+256] += (samples[si1] - add_bias) * coef[rs][1] + (samples[si2] - add_bias) * coef[rs+1][1]; #define MIX_FRONT3(samples, coef) \ - t = samples[i]; \ - samples[i] = t * coef[0][0] + samples[i+256] * coef[1][0] + samples[i+512] * coef[2][0]; \ - samples[i+256] = t * coef[0][1] + samples[i+256] * coef[1][1] + samples[i+512] * coef[2][1]; + t = samples[i+c] - add_bias; \ + u = samples[i+l] - add_bias; \ + v = samples[i+r] - add_bias; \ + samples[i] = t * coef[0][0] + u * coef[1][0] + v * coef[2][0] + add_bias; \ + samples[i+256] = t * coef[0][1] + u * coef[1][1] + v * coef[2][1] + add_bias; #define DOWNMIX_TO_STEREO(op1, op2) \ for (i = 0; i < 256; i++){ \ @@ -898,10 +900,12 @@ } static void dca_downmix(float *samples, int srcfmt, - int downmix_coef[DCA_PRIM_CHANNELS_MAX][2]) + int downmix_coef[DCA_PRIM_CHANNELS_MAX][2], + const int8_t *channel_mapping, float add_bias) { + int c,l,r,sl,sr,s; int i; - float t; + float t, u, v; float coef[DCA_PRIM_CHANNELS_MAX][2]; for (i=0; iavctx->request_channels == 2 && s->prim_channels > 2) { - dca_downmix(s->samples, s->amode, s->downmix_coef); + dca_downmix(s->samples, s->amode, s->downmix_coef, s->channel_order_tab, s->add_bias); } /* Generate LFE samples for this subsubframe FIXME!!! */