aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJustin Ruggles <justin.ruggles@gmail.com>2009-05-21 00:15:03 +0000
committerJustin Ruggles <justin.ruggles@gmail.com>2009-05-21 00:15:03 +0000
commit9907c7804aa2f0e3e2a2cfba5a8874432ea2d5e3 (patch)
treefc9ac571b6b47c817fafd3b63f39d2490b2fcee2
parentae04de316f03d038b21078c803007cb8f955777a (diff)
downloadffmpeg-9907c7804aa2f0e3e2a2cfba5a8874432ea2d5e3.tar.gz
eac3dec: make GAQ dequantization 24-bit
Originally committed as revision 18888 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r--libavcodec/ac3dec_data.c21
-rw-r--r--libavcodec/ac3dec_data.h2
-rw-r--r--libavcodec/eac3dec.c12
3 files changed, 18 insertions, 17 deletions
diff --git a/libavcodec/ac3dec_data.c b/libavcodec/ac3dec_data.c
index 2a3719ea07..b9f98f904e 100644
--- a/libavcodec/ac3dec_data.c
+++ b/libavcodec/ac3dec_data.c
@@ -87,19 +87,18 @@ const int16_t ff_eac3_gaq_remap_2_4_a[9][2] = {
/**
* Table E3.6, Gk=2 & Gk=4, B
* 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]
*/
-const int8_t ff_eac3_gaq_remap_2_4_b[9][2] = {
- { -22, -5 },
- { -46, -20 },
- { -56, -26 },
- { -60, -29 },
- { -62, -31 },
- { -63, -32 },
- { -64, -32 },
- { -64, -32 },
- { -64, -32 },
+const int16_t ff_eac3_gaq_remap_2_4_b[9][2] = {
+ { -5461, -1170 },
+ { -11703, -4915 },
+ { -14199, -6606 },
+ { -15327, -7412 },
+ { -15864, -7805 },
+ { -16126, -7999 },
+ { -16255, -8096 },
+ { -16320, -8144 },
+ { -16352, -8168 }
};
static const int16_t vq_hebap1[4][6] = {
diff --git a/libavcodec/ac3dec_data.h b/libavcodec/ac3dec_data.h
index 486d04a40b..c9bb58686b 100644
--- a/libavcodec/ac3dec_data.h
+++ b/libavcodec/ac3dec_data.h
@@ -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 int16_t ff_eac3_gaq_remap_1[12];
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 uint8_t ff_eac3_frm_expstr[32][6];
diff --git a/libavcodec/eac3dec.c b/libavcodec/eac3dec.c
index 8af729dc22..62f6d792cf 100644
--- a/libavcodec/eac3dec.c
+++ b/libavcodec/eac3dec.c
@@ -178,19 +178,21 @@ void ff_eac3_decode_transform_coeffs_aht_ch(AC3DecodeContext *s, int ch)
if (mant == -(1 << (gbits-1))) {
/* large mantissa */
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 */
if (mant >= 0)
- b = 32768 >> (log_gain+8);
+ b = 1 << (23 - (mbits - 1));
else
- b = ff_eac3_gaq_remap_2_4_b[hebap-8][log_gain-1];
- mant += (ff_eac3_gaq_remap_2_4_a[hebap-8][log_gain-1] * (mant>>8) + b) >> 7;
+ 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] << 8) * (int64_t)mant) >> 23) + b;
} else {
/* small mantissa, no GAQ, or Gk=1 */
mant <<= 24 - bits;
if (!log_gain) {
/* 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;