Browse code

eac3dec: make GAQ dequantization 24-bit

Originally committed as revision 18888 to svn://svn.ffmpeg.org/ffmpeg/trunk

Justin Ruggles authored on 2009/05/21 09:15:03
Showing 3 changed files
... ...
@@ -87,19 +87,18 @@ const int16_t ff_eac3_gaq_remap_2_4_a[9][2] = {
87 87
 /**
88 88
  * Table E3.6, Gk=2 & Gk=4, B
89 89
  * Large mantissa inverse quantization, negative mantissa remapping offsets
90
- * Table values from the spec are right-shifted by 8 to simplify calculations.
91 90
  * ff_eac3_gaq_remap_3_4_b[hebap-8][Gk=2,4]
92 91
  */
93
-const int8_t ff_eac3_gaq_remap_2_4_b[9][2] = {
94
-    { -22,  -5 },
95
-    { -46, -20 },
96
-    { -56, -26 },
97
-    { -60, -29 },
98
-    { -62, -31 },
99
-    { -63, -32 },
100
-    { -64, -32 },
101
-    { -64, -32 },
102
-    { -64, -32 },
92
+const int16_t ff_eac3_gaq_remap_2_4_b[9][2] = {
93
+    {  -5461, -1170 },
94
+    { -11703, -4915 },
95
+    { -14199, -6606 },
96
+    { -15327, -7412 },
97
+    { -15864, -7805 },
98
+    { -16126, -7999 },
99
+    { -16255, -8096 },
100
+    { -16320, -8144 },
101
+    { -16352, -8168 }
103 102
 };
104 103
 
105 104
 static const int16_t vq_hebap1[4][6] = {
... ...
@@ -29,7 +29,7 @@ extern const uint8_t ff_eac3_hebap_tab[64];
29 29
 extern const uint8_t ff_eac3_bits_vs_hebap[20];
30 30
 extern const int16_t ff_eac3_gaq_remap_1[12];
31 31
 extern const int16_t ff_eac3_gaq_remap_2_4_a[9][2];
32
-extern const int8_t  ff_eac3_gaq_remap_2_4_b[9][2];
32
+extern const int16_t ff_eac3_gaq_remap_2_4_b[9][2];
33 33
 
34 34
 extern const int16_t (* const ff_eac3_mantissa_vq[8])[6];
35 35
 extern const uint8_t ff_eac3_frm_expstr[32][6];
... ...
@@ -178,19 +178,21 @@ void ff_eac3_decode_transform_coeffs_aht_ch(AC3DecodeContext *s, int ch)
178 178
                 if (mant == -(1 << (gbits-1))) {
179 179
                     /* large mantissa */
180 180
                     int b;
181
-                    mant = get_sbits(gbc, bits-2+log_gain) << (26-log_gain-bits);
181
+                    int mbits = bits - (2 - log_gain);
182
+                    mant = get_sbits(gbc, mbits);
183
+                    mant <<= (23 - (mbits - 1));
182 184
                     /* remap mantissa value to correct for asymmetric quantization */
183 185
                     if (mant >= 0)
184
-                        b = 32768 >> (log_gain+8);
186
+                        b = 1 << (23 - (mbits - 1));
185 187
                     else
186
-                        b = ff_eac3_gaq_remap_2_4_b[hebap-8][log_gain-1];
187
-                    mant += (ff_eac3_gaq_remap_2_4_a[hebap-8][log_gain-1] * (mant>>8) + b) >> 7;
188
+                        b = ff_eac3_gaq_remap_2_4_b[hebap-8][log_gain-1] << 8;
189
+                    mant += (((ff_eac3_gaq_remap_2_4_a[hebap-8][log_gain-1] << 8) * (int64_t)mant) >> 23) + b;
188 190
                 } else {
189 191
                     /* small mantissa, no GAQ, or Gk=1 */
190 192
                     mant <<= 24 - bits;
191 193
                     if (!log_gain) {
192 194
                         /* remap mantissa value for no GAQ or Gk=1 */
193
-                        mant += (ff_eac3_gaq_remap_1[hebap-8] * (mant>>8)) >> 7;
195
+                        mant += ((ff_eac3_gaq_remap_1[hebap-8] << 8) * (int64_t)mant) >> 23;
194 196
                     }
195 197
                 }
196 198
                 s->pre_mantissa[ch][bin][blk] = mant;