diff options
author | Justin Ruggles <justin.ruggles@gmail.com> | 2010-12-14 14:53:23 +0000 |
---|---|---|
committer | Justin Ruggles <justin.ruggles@gmail.com> | 2010-12-14 14:53:23 +0000 |
commit | b6a1e5236ee8547b421b1995cf1c1309c538330e (patch) | |
tree | dcfb023ef763d82bc57d3ce857fd73e6f63e976c /libavcodec/ac3enc.c | |
parent | 5b44ede0ba20bc823f833885069febab6016a429 (diff) | |
download | ffmpeg-b6a1e5236ee8547b421b1995cf1c1309c538330e.tar.gz |
Split out mantissa quantization into separate functions.
Originally committed as revision 25997 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/ac3enc.c')
-rw-r--r-- | libavcodec/ac3enc.c | 234 |
1 files changed, 130 insertions, 104 deletions
diff --git a/libavcodec/ac3enc.c b/libavcodec/ac3enc.c index 49bf44f404..eff205b56b 100644 --- a/libavcodec/ac3enc.c +++ b/libavcodec/ac3enc.c @@ -93,6 +93,7 @@ typedef struct AC3EncodeContext { /* mantissa encoding */ int mant1_cnt, mant2_cnt, mant4_cnt; ///< mantissa counts for bap=1,2,4 + uint16_t *qmant1_ptr, *qmant2_ptr, *qmant4_ptr; ///< mantissa pointers for bap=1,2,4 int16_t last_samples[AC3_MAX_CHANNELS][AC3_BLOCK_SIZE]; ///< last 256 samples from previous frame } AC3EncodeContext; @@ -968,6 +969,127 @@ static inline int asym_quant(int c, int e, int qbits) /** + * Quantize a set of mantissas for a single channel in a single block. + */ +static void quantize_mantissas_blk_ch(AC3EncodeContext *s, + int32_t *mdct_coef, int8_t exp_shift, + uint8_t *encoded_exp, uint8_t *bap, + uint16_t *qmant, int n) +{ + int i; + + for (i = 0; i < n; i++) { + int v; + int c = mdct_coef[i]; + int e = encoded_exp[i] - exp_shift; + int b = bap[i]; + switch (b) { + case 0: + v = 0; + break; + case 1: + v = sym_quant(c, e, 3); + switch (s->mant1_cnt) { + case 0: + s->qmant1_ptr = &qmant[i]; + v = 9 * v; + s->mant1_cnt = 1; + break; + case 1: + *s->qmant1_ptr += 3 * v; + s->mant1_cnt = 2; + v = 128; + break; + default: + *s->qmant1_ptr += v; + s->mant1_cnt = 0; + v = 128; + break; + } + break; + case 2: + v = sym_quant(c, e, 5); + switch (s->mant2_cnt) { + case 0: + s->qmant2_ptr = &qmant[i]; + v = 25 * v; + s->mant2_cnt = 1; + break; + case 1: + *s->qmant2_ptr += 5 * v; + s->mant2_cnt = 2; + v = 128; + break; + default: + *s->qmant2_ptr += v; + s->mant2_cnt = 0; + v = 128; + break; + } + break; + case 3: + v = sym_quant(c, e, 7); + break; + case 4: + v = sym_quant(c, e, 11); + switch (s->mant4_cnt) { + case 0: + s->qmant4_ptr = &qmant[i]; + v = 11 * v; + s->mant4_cnt = 1; + break; + default: + *s->qmant4_ptr += v; + s->mant4_cnt = 0; + v = 128; + break; + } + break; + case 5: + v = sym_quant(c, e, 15); + break; + case 14: + v = asym_quant(c, e, 14); + break; + case 15: + v = asym_quant(c, e, 16); + break; + default: + v = asym_quant(c, e, b - 1); + break; + } + qmant[i] = v; + } +} + + +/** + * Quantize mantissas using coefficients, exponents, and bit allocation pointers. + */ +static void quantize_mantissas(AC3EncodeContext *s, + int32_t mdct_coef[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][AC3_MAX_COEFS], + int8_t exp_shift[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS], + uint8_t encoded_exp[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][AC3_MAX_COEFS], + uint8_t bap[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][AC3_MAX_COEFS], + uint16_t qmant[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][AC3_MAX_COEFS]) +{ + int blk, ch; + + + for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) { + s->mant1_cnt = s->mant2_cnt = s->mant4_cnt = 0; + s->qmant1_ptr = s->qmant2_ptr = s->qmant4_ptr = NULL; + + for (ch = 0; ch < s->channels; ch++) { + quantize_mantissas_blk_ch(s, mdct_coef[blk][ch], exp_shift[blk][ch], + encoded_exp[blk][ch], bap[blk][ch], + qmant[blk][ch], s->nb_coefs[ch]); + } + } +} + + +/** * Write the AC-3 frame header to the output bitstream. */ static void output_frame_header(AC3EncodeContext *s) @@ -1005,16 +1127,12 @@ static void output_audio_block(AC3EncodeContext *s, uint8_t exp_strategy[AC3_MAX_CHANNELS], uint8_t encoded_exp[AC3_MAX_CHANNELS][AC3_MAX_COEFS], uint8_t bap[AC3_MAX_CHANNELS][AC3_MAX_COEFS], - int32_t mdct_coef[AC3_MAX_CHANNELS][AC3_MAX_COEFS], - int8_t exp_shift[AC3_MAX_CHANNELS], + uint16_t qmant[AC3_MAX_CHANNELS][AC3_MAX_COEFS], int block_num) { int ch, nb_groups, group_size, i, baie, rbnd; uint8_t *p; - uint16_t qmant[AC3_MAX_CHANNELS][AC3_MAX_COEFS]; int exp0, exp1; - int mant1_cnt, mant2_cnt, mant4_cnt; - uint16_t *qmant1_ptr, *qmant2_ptr, *qmant4_ptr; int delta0, delta1, delta2; for (ch = 0; ch < s->fbw_channels; ch++) @@ -1117,101 +1235,7 @@ static void output_audio_block(AC3EncodeContext *s, put_bits(&s->pb, 1, 0); /* no delta bit allocation */ put_bits(&s->pb, 1, 0); /* no data to skip */ - /* mantissa encoding : we use two passes to handle the grouping. A - one pass method may be faster, but it would necessitate to - modify the output stream. */ - - /* first pass: quantize */ - mant1_cnt = mant2_cnt = mant4_cnt = 0; - qmant1_ptr = qmant2_ptr = qmant4_ptr = NULL; - - for (ch = 0; ch < s->channels; ch++) { - int b, c, e, v; - - for (i = 0; i < s->nb_coefs[ch]; i++) { - c = mdct_coef[ch][i]; - e = encoded_exp[ch][i] - exp_shift[ch]; - b = bap[ch][i]; - switch (b) { - case 0: - v = 0; - break; - case 1: - v = sym_quant(c, e, 3); - switch (mant1_cnt) { - case 0: - qmant1_ptr = &qmant[ch][i]; - v = 9 * v; - mant1_cnt = 1; - break; - case 1: - *qmant1_ptr += 3 * v; - mant1_cnt = 2; - v = 128; - break; - default: - *qmant1_ptr += v; - mant1_cnt = 0; - v = 128; - break; - } - break; - case 2: - v = sym_quant(c, e, 5); - switch (mant2_cnt) { - case 0: - qmant2_ptr = &qmant[ch][i]; - v = 25 * v; - mant2_cnt = 1; - break; - case 1: - *qmant2_ptr += 5 * v; - mant2_cnt = 2; - v = 128; - break; - default: - *qmant2_ptr += v; - mant2_cnt = 0; - v = 128; - break; - } - break; - case 3: - v = sym_quant(c, e, 7); - break; - case 4: - v = sym_quant(c, e, 11); - switch (mant4_cnt) { - case 0: - qmant4_ptr = &qmant[ch][i]; - v = 11 * v; - mant4_cnt = 1; - break; - default: - *qmant4_ptr += v; - mant4_cnt = 0; - v = 128; - break; - } - break; - case 5: - v = sym_quant(c, e, 15); - break; - case 14: - v = asym_quant(c, e, 14); - break; - case 15: - v = asym_quant(c, e, 16); - break; - default: - v = asym_quant(c, e, b - 1); - break; - } - qmant[ch][i] = v; - } - } - - /* second pass : output the values */ + /* mantissa encoding */ for (ch = 0; ch < s->channels; ch++) { int b, q; @@ -1313,8 +1337,7 @@ static void output_frame(AC3EncodeContext *s, uint8_t exp_strategy[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS], uint8_t encoded_exp[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][AC3_MAX_COEFS], uint8_t bap[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][AC3_MAX_COEFS], - int32_t mdct_coef[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][AC3_MAX_COEFS], - int8_t exp_shift[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS]) + uint16_t qmant[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][AC3_MAX_COEFS]) { int blk; @@ -1324,7 +1347,7 @@ static void output_frame(AC3EncodeContext *s, for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) { output_audio_block(s, exp_strategy[blk], encoded_exp[blk], - bap[blk], mdct_coef[blk], exp_shift[blk], blk); + bap[blk], qmant[blk], blk); } output_frame_end(s); @@ -1346,6 +1369,7 @@ static int ac3_encode_frame(AVCodecContext *avctx, uint8_t encoded_exp[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][AC3_MAX_COEFS]; uint8_t bap[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][AC3_MAX_COEFS]; int8_t exp_shift[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS]; + uint16_t qmant[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][AC3_MAX_COEFS]; int frame_bits; if (s->bit_alloc.sr_code == 1) @@ -1359,7 +1383,9 @@ static int ac3_encode_frame(AVCodecContext *avctx, compute_bit_allocation(s, bap, encoded_exp, exp_strategy, frame_bits); - output_frame(s, frame, exp_strategy, encoded_exp, bap, mdct_coef, exp_shift); + quantize_mantissas(s, mdct_coef, exp_shift, encoded_exp, bap, qmant); + + output_frame(s, frame, exp_strategy, encoded_exp, bap, qmant); return s->frame_size; } |