eac3dec: revert commit r18860. keep the AHT IDCT 24-bit. will make AHT GAQ

dequantization 24-bit in a separate commit.

Originally committed as revision 18887 to svn://svn.ffmpeg.org/ffmpeg/trunk
release/0.6
Justin Ruggles 16 years ago
parent e20a4f53a0
commit ae04de316f
  1. 2
      libavcodec/ac3dec.c
  2. 21
      libavcodec/ac3dec_data.c
  3. 2
      libavcodec/ac3dec_data.h
  4. 38
      libavcodec/eac3dec.c

@ -562,7 +562,7 @@ static void decode_transform_coeffs_ch(AC3DecodeContext *s, int blk, int ch,
if (!blk) if (!blk)
ff_eac3_decode_transform_coeffs_aht_ch(s, ch); ff_eac3_decode_transform_coeffs_aht_ch(s, ch);
for (bin = s->start_freq[ch]; bin < s->end_freq[ch]; bin++) { for (bin = s->start_freq[ch]; bin < s->end_freq[ch]; bin++) {
s->fixed_coeffs[ch][bin] = (s->pre_mantissa[ch][bin][blk] << 8) >> s->dexps[ch][bin]; s->fixed_coeffs[ch][bin] = s->pre_mantissa[ch][bin][blk] >> s->dexps[ch][bin];
} }
} }
} }

@ -87,18 +87,19 @@ 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 int16_t ff_eac3_gaq_remap_2_4_b[9][2] = { const int8_t ff_eac3_gaq_remap_2_4_b[9][2] = {
{ -5461, -1170 }, { -22, -5 },
{ -11703, -4915 }, { -46, -20 },
{ -14199, -6606 }, { -56, -26 },
{ -15327, -7412 }, { -60, -29 },
{ -15864, -7805 }, { -62, -31 },
{ -16126, -7999 }, { -63, -32 },
{ -16255, -8096 }, { -64, -32 },
{ -16320, -8144 }, { -64, -32 },
{ -16352, -8168 } { -64, -32 },
}; };
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];
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 int16_t ff_eac3_gaq_remap_2_4_b[9][2]; extern const int8_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];

@ -66,18 +66,18 @@ typedef enum {
#define EAC3_SR_CODE_REDUCED 3 #define EAC3_SR_CODE_REDUCED 3
/** lrint(M_SQRT2*cos(2*M_PI/12)*(1<<15)) */ /** lrint(M_SQRT2*cos(2*M_PI/12)*(1<<23)) */
#define COEFF_0 40132 #define COEFF_0 10273905LL
/** lrint(M_SQRT2*cos(0*M_PI/12)*(1<<15)) = lrint(M_SQRT2*(1<<15)) */ /** lrint(M_SQRT2*cos(0*M_PI/12)*(1<<23)) = lrint(M_SQRT2*(1<<23)) */
#define COEFF_1 46341 #define COEFF_1 11863283LL
/** lrint(M_SQRT2*cos(5*M_PI/12)*(1<<15)) */ /** lrint(M_SQRT2*cos(5*M_PI/12)*(1<<23)) */
#define COEFF_2 11994 #define COEFF_2 3070444LL
/** /**
* Calculate 6-point IDCT of the pre-mantissas. * Calculate 6-point IDCT of the pre-mantissas.
* All calculations are 16-bit fixed-point. * All calculations are 24-bit fixed-point.
*/ */
static void idct6(int pre_mant[6]) static void idct6(int pre_mant[6])
{ {
@ -86,9 +86,9 @@ static void idct6(int pre_mant[6])
odd1 = pre_mant[1] - pre_mant[3] - pre_mant[5]; odd1 = pre_mant[1] - pre_mant[3] - pre_mant[5];
even2 = ( pre_mant[2] * COEFF_0) >> 15; even2 = ( pre_mant[2] * COEFF_0) >> 23;
tmp = ( pre_mant[4] * COEFF_1) >> 15; tmp = ( pre_mant[4] * COEFF_1) >> 23;
odd0 = ((pre_mant[1] + pre_mant[5]) * COEFF_2) >> 15; odd0 = ((pre_mant[1] + pre_mant[5]) * COEFF_2) >> 23;
even0 = pre_mant[0] + (tmp >> 1); even0 = pre_mant[0] + (tmp >> 1);
even1 = pre_mant[0] - tmp; even1 = pre_mant[0] - tmp;
@ -155,13 +155,13 @@ void ff_eac3_decode_transform_coeffs_aht_ch(AC3DecodeContext *s, int ch)
if (!hebap) { if (!hebap) {
/* zero-mantissa dithering */ /* zero-mantissa dithering */
for (blk = 0; blk < 6; blk++) { for (blk = 0; blk < 6; blk++) {
s->pre_mantissa[ch][bin][blk] = (av_lfg_get(&s->dith_state) & 0x7FFF) - 0x4000; s->pre_mantissa[ch][bin][blk] = (av_lfg_get(&s->dith_state) & 0x7FFFFF) - 0x400000;
} }
} else if (hebap < 8) { } else if (hebap < 8) {
/* Vector Quantization */ /* Vector Quantization */
int v = get_bits(gbc, bits); int v = get_bits(gbc, bits);
for (blk = 0; blk < 6; blk++) { for (blk = 0; blk < 6; blk++) {
s->pre_mantissa[ch][bin][blk] = ff_eac3_mantissa_vq[hebap][v][blk]; s->pre_mantissa[ch][bin][blk] = ff_eac3_mantissa_vq[hebap][v][blk] << 8;
} }
} else { } else {
/* Gain Adaptive Quantization */ /* Gain Adaptive Quantization */
@ -175,24 +175,22 @@ void ff_eac3_decode_transform_coeffs_aht_ch(AC3DecodeContext *s, int ch)
for (blk = 0; blk < 6; blk++) { for (blk = 0; blk < 6; blk++) {
int mant = get_sbits(gbc, gbits); int mant = get_sbits(gbc, gbits);
if (log_gain > 0 && mant == -(1 << (gbits-1))) { if (mant == -(1 << (gbits-1))) {
/* large mantissa */ /* large mantissa */
int b; int b;
int mbits = bits - (2 - log_gain); mant = get_sbits(gbc, bits-2+log_gain) << (26-log_gain-bits);
mant = get_sbits(gbc, mbits);
mant <<= (15 - (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; b = 32768 >> (log_gain+8);
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];
mant += ((ff_eac3_gaq_remap_2_4_a[hebap-8][log_gain-1] * mant) >> 15) + b; mant += (ff_eac3_gaq_remap_2_4_a[hebap-8][log_gain-1] * (mant>>8) + b) >> 7;
} else { } else {
/* small mantissa, no GAQ, or Gk=1 */ /* small mantissa, no GAQ, or Gk=1 */
mant <<= 15 - (bits-1); 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) >> 15; mant += (ff_eac3_gaq_remap_1[hebap-8] * (mant>>8)) >> 7;
} }
} }
s->pre_mantissa[ch][bin][blk] = mant; s->pre_mantissa[ch][bin][blk] = mant;

Loading…
Cancel
Save