Originally committed as revision 18860 to svn://svn.ffmpeg.org/ffmpeg/trunk
| ... | ... |
@@ -568,7 +568,7 @@ static void decode_transform_coeffs_ch(AC3DecodeContext *s, int blk, int ch, |
| 568 | 568 |
if (!blk) |
| 569 | 569 |
ff_eac3_decode_transform_coeffs_aht_ch(s, ch); |
| 570 | 570 |
for (bin = s->start_freq[ch]; bin < s->end_freq[ch]; bin++) {
|
| 571 |
- s->fixed_coeffs[ch][bin] = s->pre_mantissa[ch][bin][blk] >> s->dexps[ch][bin]; |
|
| 571 |
+ s->fixed_coeffs[ch][bin] = (s->pre_mantissa[ch][bin][blk] << 8) >> s->dexps[ch][bin]; |
|
| 572 | 572 |
} |
| 573 | 573 |
} |
| 574 | 574 |
} |
| ... | ... |
@@ -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]; |
| ... | ... |
@@ -66,18 +66,18 @@ typedef enum {
|
| 66 | 66 |
|
| 67 | 67 |
#define EAC3_SR_CODE_REDUCED 3 |
| 68 | 68 |
|
| 69 |
-/** lrint(M_SQRT2*cos(2*M_PI/12)*(1<<23)) */ |
|
| 70 |
-#define COEFF_0 10273905LL |
|
| 69 |
+/** lrint(M_SQRT2*cos(2*M_PI/12)*(1<<15)) */ |
|
| 70 |
+#define COEFF_0 40132 |
|
| 71 | 71 |
|
| 72 |
-/** lrint(M_SQRT2*cos(0*M_PI/12)*(1<<23)) = lrint(M_SQRT2*(1<<23)) */ |
|
| 73 |
-#define COEFF_1 11863283LL |
|
| 72 |
+/** lrint(M_SQRT2*cos(0*M_PI/12)*(1<<15)) = lrint(M_SQRT2*(1<<15)) */ |
|
| 73 |
+#define COEFF_1 46341 |
|
| 74 | 74 |
|
| 75 |
-/** lrint(M_SQRT2*cos(5*M_PI/12)*(1<<23)) */ |
|
| 76 |
-#define COEFF_2 3070444LL |
|
| 75 |
+/** lrint(M_SQRT2*cos(5*M_PI/12)*(1<<15)) */ |
|
| 76 |
+#define COEFF_2 11994 |
|
| 77 | 77 |
|
| 78 | 78 |
/** |
| 79 | 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 | 82 |
static void idct6(int pre_mant[6]) |
| 83 | 83 |
{
|
| ... | ... |
@@ -86,9 +86,9 @@ static void idct6(int pre_mant[6]) |
| 86 | 86 |
|
| 87 | 87 |
odd1 = pre_mant[1] - pre_mant[3] - pre_mant[5]; |
| 88 | 88 |
|
| 89 |
- even2 = ( pre_mant[2] * COEFF_0) >> 23; |
|
| 90 |
- tmp = ( pre_mant[4] * COEFF_1) >> 23; |
|
| 91 |
- odd0 = ((pre_mant[1] + pre_mant[5]) * COEFF_2) >> 23; |
|
| 89 |
+ even2 = ( pre_mant[2] * COEFF_0) >> 15; |
|
| 90 |
+ tmp = ( pre_mant[4] * COEFF_1) >> 15; |
|
| 91 |
+ odd0 = ((pre_mant[1] + pre_mant[5]) * COEFF_2) >> 15; |
|
| 92 | 92 |
|
| 93 | 93 |
even0 = pre_mant[0] + (tmp >> 1); |
| 94 | 94 |
even1 = pre_mant[0] - tmp; |
| ... | ... |
@@ -155,13 +155,13 @@ void ff_eac3_decode_transform_coeffs_aht_ch(AC3DecodeContext *s, int ch) |
| 155 | 155 |
if (!hebap) {
|
| 156 | 156 |
/* zero-mantissa dithering */ |
| 157 | 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 | 160 |
} else if (hebap < 8) {
|
| 161 | 161 |
/* Vector Quantization */ |
| 162 | 162 |
int v = get_bits(gbc, bits); |
| 163 | 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 | 166 |
} else {
|
| 167 | 167 |
/* Gain Adaptive Quantization */ |
| ... | ... |
@@ -175,22 +175,24 @@ void ff_eac3_decode_transform_coeffs_aht_ch(AC3DecodeContext *s, int ch) |
| 175 | 175 |
|
| 176 | 176 |
for (blk = 0; blk < 6; blk++) {
|
| 177 | 177 |
int mant = get_sbits(gbc, gbits); |
| 178 |
- if (mant == -(1 << (gbits-1))) {
|
|
| 178 |
+ if (log_gain > 0 && 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 <<= (15 - (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 = 32768 >> log_gain; |
|
| 185 | 187 |
else |
| 186 | 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 | 190 |
} else {
|
| 189 | 191 |
/* small mantissa, no GAQ, or Gk=1 */ |
| 190 |
- mant <<= 24 - bits; |
|
| 192 |
+ mant <<= 15 - (bits-1); |
|
| 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] * mant) >> 15; |
|
| 194 | 196 |
} |
| 195 | 197 |
} |
| 196 | 198 |
s->pre_mantissa[ch][bin][blk] = mant; |