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 */
|
/* mantissa encoding */
|
||||||
int mant1_cnt, mant2_cnt, mant4_cnt; ///< mantissa counts for bap=1,2,4
|
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
|
int16_t last_samples[AC3_MAX_CHANNELS][AC3_BLOCK_SIZE]; ///< last 256 samples from previous frame
|
||||||
} AC3EncodeContext;
|
} 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.
|
* 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 exp_strategy[AC3_MAX_CHANNELS],
|
||||||
uint8_t encoded_exp[AC3_MAX_CHANNELS][AC3_MAX_COEFS],
|
uint8_t encoded_exp[AC3_MAX_CHANNELS][AC3_MAX_COEFS],
|
||||||
uint8_t bap[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],
|
uint16_t qmant[AC3_MAX_CHANNELS][AC3_MAX_COEFS],
|
||||||
int8_t exp_shift[AC3_MAX_CHANNELS],
|
|
||||||
int block_num)
|
int block_num)
|
||||||
{
|
{
|
||||||
int ch, nb_groups, group_size, i, baie, rbnd;
|
int ch, nb_groups, group_size, i, baie, rbnd;
|
||||||
uint8_t *p;
|
uint8_t *p;
|
||||||
uint16_t qmant[AC3_MAX_CHANNELS][AC3_MAX_COEFS];
|
|
||||||
int exp0, exp1;
|
int exp0, exp1;
|
||||||
int mant1_cnt, mant2_cnt, mant4_cnt;
|
|
||||||
uint16_t *qmant1_ptr, *qmant2_ptr, *qmant4_ptr;
|
|
||||||
int delta0, delta1, delta2;
|
int delta0, delta1, delta2;
|
||||||
|
|
||||||
for (ch = 0; ch < s->fbw_channels; ch++)
|
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 delta bit allocation */
|
||||||
put_bits(&s->pb, 1, 0); /* no data to skip */
|
put_bits(&s->pb, 1, 0); /* no data to skip */
|
||||||
|
|
||||||
/* mantissa encoding : we use two passes to handle the grouping. A
|
/* mantissa encoding */
|
||||||
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 */
|
|
||||||
for (ch = 0; ch < s->channels; ch++) {
|
for (ch = 0; ch < s->channels; ch++) {
|
||||||
int b, q;
|
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 exp_strategy[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS],
|
||||||
uint8_t encoded_exp[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][AC3_MAX_COEFS],
|
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],
|
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],
|
uint16_t qmant[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][AC3_MAX_COEFS])
|
||||||
int8_t exp_shift[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS])
|
|
||||||
{
|
{
|
||||||
int blk;
|
int blk;
|
||||||
|
|
||||||
@ -1324,7 +1347,7 @@ static void output_frame(AC3EncodeContext *s,
|
|||||||
|
|
||||||
for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) {
|
for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) {
|
||||||
output_audio_block(s, exp_strategy[blk], encoded_exp[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);
|
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 encoded_exp[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][AC3_MAX_COEFS];
|
||||||
uint8_t bap[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];
|
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;
|
int frame_bits;
|
||||||
|
|
||||||
if (s->bit_alloc.sr_code == 1)
|
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);
|
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;
|
return s->frame_size;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user