diff eac3dec.c @ 9681:116836dbd25d libavcodec

eac3dec: make GAQ dequantization 24-bit
author jbr
date Thu, 21 May 2009 00:15:03 +0000
parents debe2623a70a
children 0596729ae4af
line wrap: on
line diff
--- a/eac3dec.c	Thu May 21 00:09:23 2009 +0000
+++ b/eac3dec.c	Thu May 21 00:15:03 2009 +0000
@@ -178,19 +178,21 @@
                 if (mant == -(1 << (gbits-1))) {
                     /* large mantissa */
                     int b;
-                    mant = get_sbits(gbc, bits-2+log_gain) << (26-log_gain-bits);
+                    int mbits = bits - (2 - log_gain);
+                    mant = get_sbits(gbc, mbits);
+                    mant <<= (23 - (mbits - 1));
                     /* remap mantissa value to correct for asymmetric quantization */
                     if (mant >= 0)
-                        b = 32768 >> (log_gain+8);
+                        b = 1 << (23 - (mbits - 1));
                     else
-                        b = ff_eac3_gaq_remap_2_4_b[hebap-8][log_gain-1];
-                    mant += (ff_eac3_gaq_remap_2_4_a[hebap-8][log_gain-1] * (mant>>8) + b) >> 7;
+                        b = ff_eac3_gaq_remap_2_4_b[hebap-8][log_gain-1] << 8;
+                    mant += (((ff_eac3_gaq_remap_2_4_a[hebap-8][log_gain-1] << 8) * (int64_t)mant) >> 23) + b;
                 } else {
                     /* small mantissa, no GAQ, or Gk=1 */
                     mant <<= 24 - bits;
                     if (!log_gain) {
                         /* remap mantissa value for no GAQ or Gk=1 */
-                        mant += (ff_eac3_gaq_remap_1[hebap-8] * (mant>>8)) >> 7;
+                        mant += ((ff_eac3_gaq_remap_1[hebap-8] << 8) * (int64_t)mant) >> 23;
                     }
                 }
                 s->pre_mantissa[ch][bin][blk] = mant;