mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
Split out mantissa quantization into separate functions.
Originally committed as revision 25997 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
5b44ede0ba
commit
b6a1e5236e
@ -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;
|
||||
@ -967,6 +968,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.
|
||||
*/
|
||||
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user