changeset 7561:be6d31643128 libavcodec

oops, non-normalized downmix to mono contaminated add_bias for non-simd float-to-int.
author lorenm
date Wed, 13 Aug 2008 23:30:28 +0000
parents 0dc289443426
children ef456ee01ea2
files ac3dec.c
diffstat 1 files changed, 5 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/ac3dec.c	Wed Aug 13 19:43:18 2008 +0000
+++ b/ac3dec.c	Wed Aug 13 23:30:28 2008 +0000
@@ -606,6 +606,9 @@
 static inline void do_imdct(AC3DecodeContext *s, int channels)
 {
     int ch;
+    float add_bias = s->add_bias;
+    if(s->out_channels==1 && channels>1)
+        add_bias *= LEVEL_MINUS_3DB; // compensate for the gain in downmix
 
     for (ch=1; ch<=channels; ch++) {
         if (s->block_switch[ch]) {
@@ -614,13 +617,13 @@
             for(i=0; i<128; i++)
                 x[i] = s->transform_coeffs[ch][2*i];
             ff_imdct_half(&s->imdct_256, s->tmp_output, x);
-            s->dsp.vector_fmul_window(s->output[ch-1], s->delay[ch-1], s->tmp_output, s->window, s->add_bias, 128);
+            s->dsp.vector_fmul_window(s->output[ch-1], s->delay[ch-1], s->tmp_output, s->window, add_bias, 128);
             for(i=0; i<128; i++)
                 x[i] = s->transform_coeffs[ch][2*i+1];
             ff_imdct_half(&s->imdct_256, s->delay[ch-1], x);
         } else {
             ff_imdct_half(&s->imdct_512, s->tmp_output, s->transform_coeffs[ch]);
-            s->dsp.vector_fmul_window(s->output[ch-1], s->delay[ch-1], s->tmp_output, s->window, s->add_bias, 128);
+            s->dsp.vector_fmul_window(s->output[ch-1], s->delay[ch-1], s->tmp_output, s->window, add_bias, 128);
             memcpy(s->delay[ch-1], s->tmp_output+128, 128*sizeof(float));
         }
     }