comparison eac3dec.c @ 9661:1fe22274393a libavcodec

eac3dec: use 16-bit pre-mantissas instead of 24-bit in AHT decoding. it is simpler and also fixes a bug in GAQ dequantization.
author jbr
date Sun, 17 May 2009 06:53:24 +0000
parents 323e4f591d7a
children debe2623a70a
comparison
equal deleted inserted replaced
9660:6d75bcdeaa30 9661:1fe22274393a
64 EAC3_GAQ_124 64 EAC3_GAQ_124
65 } EAC3GaqMode; 65 } EAC3GaqMode;
66 66
67 #define EAC3_SR_CODE_REDUCED 3 67 #define EAC3_SR_CODE_REDUCED 3
68 68
69 /** lrint(M_SQRT2*cos(2*M_PI/12)*(1<<23)) */ 69 /** lrint(M_SQRT2*cos(2*M_PI/12)*(1<<15)) */
70 #define COEFF_0 10273905LL 70 #define COEFF_0 40132
71 71
72 /** lrint(M_SQRT2*cos(0*M_PI/12)*(1<<23)) = lrint(M_SQRT2*(1<<23)) */ 72 /** lrint(M_SQRT2*cos(0*M_PI/12)*(1<<15)) = lrint(M_SQRT2*(1<<15)) */
73 #define COEFF_1 11863283LL 73 #define COEFF_1 46341
74 74
75 /** lrint(M_SQRT2*cos(5*M_PI/12)*(1<<23)) */ 75 /** lrint(M_SQRT2*cos(5*M_PI/12)*(1<<15)) */
76 #define COEFF_2 3070444LL 76 #define COEFF_2 11994
77 77
78 /** 78 /**
79 * Calculate 6-point IDCT of the pre-mantissas. 79 * Calculate 6-point IDCT of the pre-mantissas.
80 * All calculations are 24-bit fixed-point. 80 * All calculations are 16-bit fixed-point.
81 */ 81 */
82 static void idct6(int pre_mant[6]) 82 static void idct6(int pre_mant[6])
83 { 83 {
84 int tmp; 84 int tmp;
85 int even0, even1, even2, odd0, odd1, odd2; 85 int even0, even1, even2, odd0, odd1, odd2;
86 86
87 odd1 = pre_mant[1] - pre_mant[3] - pre_mant[5]; 87 odd1 = pre_mant[1] - pre_mant[3] - pre_mant[5];
88 88
89 even2 = ( pre_mant[2] * COEFF_0) >> 23; 89 even2 = ( pre_mant[2] * COEFF_0) >> 15;
90 tmp = ( pre_mant[4] * COEFF_1) >> 23; 90 tmp = ( pre_mant[4] * COEFF_1) >> 15;
91 odd0 = ((pre_mant[1] + pre_mant[5]) * COEFF_2) >> 23; 91 odd0 = ((pre_mant[1] + pre_mant[5]) * COEFF_2) >> 15;
92 92
93 even0 = pre_mant[0] + (tmp >> 1); 93 even0 = pre_mant[0] + (tmp >> 1);
94 even1 = pre_mant[0] - tmp; 94 even1 = pre_mant[0] - tmp;
95 95
96 tmp = even0; 96 tmp = even0;
153 int hebap = s->bap[ch][bin]; 153 int hebap = s->bap[ch][bin];
154 int bits = ff_eac3_bits_vs_hebap[hebap]; 154 int bits = ff_eac3_bits_vs_hebap[hebap];
155 if (!hebap) { 155 if (!hebap) {
156 /* zero-mantissa dithering */ 156 /* zero-mantissa dithering */
157 for (blk = 0; blk < 6; blk++) { 157 for (blk = 0; blk < 6; blk++) {
158 s->pre_mantissa[ch][bin][blk] = (av_lfg_get(&s->dith_state) & 0x7FFFFF) - 0x400000; 158 s->pre_mantissa[ch][bin][blk] = (av_lfg_get(&s->dith_state) & 0x7FFF) - 0x4000;
159 } 159 }
160 } else if (hebap < 8) { 160 } else if (hebap < 8) {
161 /* Vector Quantization */ 161 /* Vector Quantization */
162 int v = get_bits(gbc, bits); 162 int v = get_bits(gbc, bits);
163 for (blk = 0; blk < 6; blk++) { 163 for (blk = 0; blk < 6; blk++) {
164 s->pre_mantissa[ch][bin][blk] = ff_eac3_mantissa_vq[hebap][v][blk] << 8; 164 s->pre_mantissa[ch][bin][blk] = ff_eac3_mantissa_vq[hebap][v][blk];
165 } 165 }
166 } else { 166 } else {
167 /* Gain Adaptive Quantization */ 167 /* Gain Adaptive Quantization */
168 int gbits, log_gain; 168 int gbits, log_gain;
169 if (gaq_mode != EAC3_GAQ_NO && hebap < end_bap) { 169 if (gaq_mode != EAC3_GAQ_NO && hebap < end_bap) {
173 } 173 }
174 gbits = bits - log_gain; 174 gbits = bits - log_gain;
175 175
176 for (blk = 0; blk < 6; blk++) { 176 for (blk = 0; blk < 6; blk++) {
177 int mant = get_sbits(gbc, gbits); 177 int mant = get_sbits(gbc, gbits);
178 if (mant == -(1 << (gbits-1))) { 178 if (log_gain > 0 && mant == -(1 << (gbits-1))) {
179 /* large mantissa */ 179 /* large mantissa */
180 int b; 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 <<= (15 - (mbits - 1));
182 /* remap mantissa value to correct for asymmetric quantization */ 184 /* remap mantissa value to correct for asymmetric quantization */
183 if (mant >= 0) 185 if (mant >= 0)
184 b = 32768 >> (log_gain+8); 186 b = 32768 >> log_gain;
185 else 187 else
186 b = ff_eac3_gaq_remap_2_4_b[hebap-8][log_gain-1]; 188 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; 189 mant += ((ff_eac3_gaq_remap_2_4_a[hebap-8][log_gain-1] * mant) >> 15) + b;
188 } else { 190 } else {
189 /* small mantissa, no GAQ, or Gk=1 */ 191 /* small mantissa, no GAQ, or Gk=1 */
190 mant <<= 24 - bits; 192 mant <<= 15 - (bits-1);
191 if (!log_gain) { 193 if (!log_gain) {
192 /* remap mantissa value for no GAQ or Gk=1 */ 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] * mant) >> 15;
194 } 196 }
195 } 197 }
196 s->pre_mantissa[ch][bin][blk] = mant; 198 s->pre_mantissa[ch][bin][blk] = mant;
197 } 199 }
198 } 200 }