Mercurial > libavcodec.hg
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 } |