Commit a2952ca1 authored by jbr's avatar jbr

eac3dec: make GAQ dequantization 24-bit


git-svn-id: file:///var/local/repositories/ffmpeg/trunk@18888 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b
parent 3ac7a5a5
...@@ -87,19 +87,18 @@ const int16_t ff_eac3_gaq_remap_2_4_a[9][2] = { ...@@ -87,19 +87,18 @@ const int16_t ff_eac3_gaq_remap_2_4_a[9][2] = {
/** /**
* Table E3.6, Gk=2 & Gk=4, B * Table E3.6, Gk=2 & Gk=4, B
* Large mantissa inverse quantization, negative mantissa remapping offsets * Large mantissa inverse quantization, negative mantissa remapping offsets
* Table values from the spec are right-shifted by 8 to simplify calculations.
* ff_eac3_gaq_remap_3_4_b[hebap-8][Gk=2,4] * ff_eac3_gaq_remap_3_4_b[hebap-8][Gk=2,4]
*/ */
const int8_t ff_eac3_gaq_remap_2_4_b[9][2] = { const int16_t ff_eac3_gaq_remap_2_4_b[9][2] = {
{ -22, -5 }, { -5461, -1170 },
{ -46, -20 }, { -11703, -4915 },
{ -56, -26 }, { -14199, -6606 },
{ -60, -29 }, { -15327, -7412 },
{ -62, -31 }, { -15864, -7805 },
{ -63, -32 }, { -16126, -7999 },
{ -64, -32 }, { -16255, -8096 },
{ -64, -32 }, { -16320, -8144 },
{ -64, -32 }, { -16352, -8168 }
}; };
static const int16_t vq_hebap1[4][6] = { static const int16_t vq_hebap1[4][6] = {
......
...@@ -29,7 +29,7 @@ extern const uint8_t ff_eac3_hebap_tab[64]; ...@@ -29,7 +29,7 @@ extern const uint8_t ff_eac3_hebap_tab[64];
extern const uint8_t ff_eac3_bits_vs_hebap[20]; extern const uint8_t ff_eac3_bits_vs_hebap[20];
extern const int16_t ff_eac3_gaq_remap_1[12]; extern const int16_t ff_eac3_gaq_remap_1[12];
extern const int16_t ff_eac3_gaq_remap_2_4_a[9][2]; extern const int16_t ff_eac3_gaq_remap_2_4_a[9][2];
extern const int8_t ff_eac3_gaq_remap_2_4_b[9][2]; extern const int16_t ff_eac3_gaq_remap_2_4_b[9][2];
extern const int16_t (* const ff_eac3_mantissa_vq[8])[6]; extern const int16_t (* const ff_eac3_mantissa_vq[8])[6];
extern const uint8_t ff_eac3_frm_expstr[32][6]; 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,19 +178,21 @@ void ff_eac3_decode_transform_coeffs_aht_ch(AC3DecodeContext *s, int ch)
if (mant == -(1 << (gbits-1))) { if (mant == -(1 << (gbits-1))) {
/* large mantissa */ /* large mantissa */
int b; 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 */ /* remap mantissa value to correct for asymmetric quantization */
if (mant >= 0) if (mant >= 0)
b = 32768 >> (log_gain+8); b = 1 << (23 - (mbits - 1));
else else
b = ff_eac3_gaq_remap_2_4_b[hebap-8][log_gain-1]; 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] * (mant>>8) + b) >> 7; mant += (((ff_eac3_gaq_remap_2_4_a[hebap-8][log_gain-1] << 8) * (int64_t)mant) >> 23) + b;
} else { } else {
/* small mantissa, no GAQ, or Gk=1 */ /* small mantissa, no GAQ, or Gk=1 */
mant <<= 24 - bits; mant <<= 24 - bits;
if (!log_gain) { if (!log_gain) {
/* remap mantissa value for no GAQ or Gk=1 */ /* 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; s->pre_mantissa[ch][bin][blk] = mant;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment