---
libavcodec/ac3enc.c | 223 +++++++++++++++++++++++++++++----------------------
1 files changed, 126 insertions(+), 97 deletions(-)
diff --git libavcodec/ac3enc.c libavcodec/ac3enc.c
index 26178ca..b264991 100644
--- libavcodec/ac3enc.c
+++ libavcodec/ac3enc.c
@@ -248,6 +248,62 @@ static void mdct512(int32_t *out, int16_t *in)
}
}
+/* compute log2(max(abs(tab[]))) */
+static int log2_tab(int16_t *tab, int n)
+{
+ int i, v;
+
+ v = 0;
+ for (i = 0; i < n; i++)
+ v |= abs(tab[i]);
+ return av_log2(v);
+}
+
+static void lshift_tab(int16_t *tab, int n, int lshift)
+{
+ int i;
+
+ if (lshift > 0) {
+ for (i = 0; i < n; i++)
+ tab[i] <<= lshift;
+ } else if (lshift < 0) {
+ lshift = -lshift;
+ for (i = 0; i < n; i++)
+ tab[i] >>= lshift;
+ }
+}
+
+static void apply_mdct(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])
+{
+ int blk, ch, i, v;
+
+ for (ch = 0; ch < s->channels; ch++) {
+ /* fixed mdct to the six sub blocks & exponent computation */
+ for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) {
+ int16_t *input_samples = &s->planar_samples[ch][blk * AC3_BLOCK_SIZE];
+
+ /* apply the MDCT window */
+ for (i = 0; i < AC3_BLOCK_SIZE; i++) {
+ s->windowed_samples[i] = MUL16(input_samples[i],
+ ff_ac3_window[i]) >> 15;
+ s->windowed_samples[AC3_BLOCK_SIZE*2-i-1] = MUL16(input_samples[AC3_BLOCK_SIZE*2-i-1],
+ ff_ac3_window[i]) >> 15;
+ }
+
+ /* Normalize the samples to use the maximum available precision */
+ v = 14 - log2_tab(s->windowed_samples, AC3_BLOCK_SIZE*2);
+ v = FFMAX(0, v);
+ exp_shift[blk][ch] = v - 9;
+ lshift_tab(s->windowed_samples, AC3_BLOCK_SIZE*2, v);
+
+ /* do the MDCT */
+ mdct512(mdct_coef[blk][ch], s->windowed_samples);
+ }
+ }
+}
+
/* XXX: use another norm ? */
static int calc_exp_diff(uint8_t *exp1, uint8_t *exp2, int n)
{
@@ -378,6 +434,61 @@ static int encode_exp(uint8_t *exp, int nb_exps, int exp_strategy)
return 4 + (nb_groups / 3) * 7;
}
+static void process_exponents(AC3EncodeContext *s,
+ int32_t mdct_coef[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][AC3_MAX_COEFS],
+ uint8_t exp[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][AC3_MAX_COEFS],
+ uint8_t exp_strategy[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS],
+ int8_t exp_shift[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS],
+ int *frame_bits)
+{
+ int ch, blk, i, v;
+
+ *frame_bits = 0;
+ for (ch = 0; ch < s->channels; ch++) {
+ /* fixed mdct to the six sub blocks & exponent computation */
+ for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) {
+ /* compute "exponents". We take into account the normalization there */
+ for (i = 0; i < AC3_MAX_COEFS; i++) {
+ int e;
+ v = abs(mdct_coef[blk][ch][i]);
+ if (v == 0)
+ e = 24;
+ else {
+ e = 23 - av_log2(v) + exp_shift[blk][ch];
+ if (e >= 24) {
+ e = 24;
+ mdct_coef[blk][ch][i] = 0;
+ }
+ }
+ exp[blk][ch][i] = e;
+ }
+ }
+
+ compute_exp_strategy(exp_strategy, exp, ch, ch == s->lfe_ch);
+
+ /* compute the exponents as the decoder will see them. The
+ EXP_REUSE case must be handled carefully : we select the
+ min of the exponents */
+ blk = 0;
+ while (blk < AC3_MAX_BLOCKS) {
+ int blk2;
+ int blk1 = blk + 1;
+ while (blk1 < AC3_MAX_BLOCKS && exp_strategy[blk1][ch] == EXP_REUSE) {
+ exponent_min(exp[blk][ch], exp[blk1][ch], s->nb_coefs[ch]);
+ blk1++;
+ }
+ *frame_bits += encode_exp(exp[blk][ch], s->nb_coefs[ch],
+ exp_strategy[blk][ch]);
+ /* copy encoded exponents for reuse case */
+ for (blk2 = blk+1; blk2 < blk1; blk2++) {
+ memcpy(exp[blk2][ch], exp[blk][ch],
+ s->nb_coefs[ch] * sizeof(uint8_t));
+ }
+ blk = blk1;
+ }
+ }
+}
+
/* return the size in bits taken by the mantissa */
static int compute_mantissa_size(AC3EncodeContext *s, uint8_t *m, int nb_coefs)
{
@@ -1097,32 +1208,6 @@ static unsigned int pow_poly(unsigned int a, unsigned int n, unsigned int poly)
return r;
}
-
-/* compute log2(max(abs(tab[]))) */
-static int log2_tab(int16_t *tab, int n)
-{
- int i, v;
-
- v = 0;
- for (i = 0; i < n; i++)
- v |= abs(tab[i]);
- return av_log2(v);
-}
-
-static void lshift_tab(int16_t *tab, int n, int lshift)
-{
- int i;
-
- if (lshift > 0) {
- for (i = 0; i < n; i++)
- tab[i] <<= lshift;
- } else if (lshift < 0) {
- lshift = -lshift;
- for (i = 0; i < n; i++)
- tab[i] >>= lshift;
- }
-}
-
/* fill the end of the frame and compute the two crcs */
static int output_frame_end(AC3EncodeContext *s)
{
@@ -1179,11 +1264,22 @@ static void deinterleave_samples(AC3EncodeContext *s, const int16_t *samples)
}
}
+static void adjust_frame_size(AC3EncodeContext *s)
+{
+ while (s->bits_written >= s->bit_rate && s->samples_written >= s->sample_rate) {
+ s->bits_written -= s->bit_rate;
+ s->samples_written -= s->sample_rate;
+ }
+ s->frame_size = s->frame_size_min + (s->bits_written * s->sample_rate < s->samples_written * s->bit_rate);
+ s->bits_written += s->frame_size * 16;
+ s->samples_written += AC3_FRAME_SIZE;
+}
+
static int AC3_encode_frame(AVCodecContext *avctx,
unsigned char *frame, int buf_size, void *data)
{
AC3EncodeContext *s = avctx->priv_data;
- int blk, i, v, ch;
+ int blk;
int32_t mdct_coef[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][AC3_MAX_COEFS];
uint8_t exp[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][AC3_MAX_COEFS];
uint8_t exp_strategy[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS];
@@ -1193,78 +1289,11 @@ static int AC3_encode_frame(AVCodecContext *avctx,
deinterleave_samples(s, data);
- frame_bits = 0;
- for (ch = 0; ch < s->channels; ch++) {
- /* fixed mdct to the six sub blocks & exponent computation */
- for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) {
- int16_t *input_samples = &s->planar_samples[ch][blk * AC3_BLOCK_SIZE];
-
- /* apply the MDCT window */
- for (i = 0; i < AC3_BLOCK_SIZE; i++) {
- s->windowed_samples[i] = MUL16(input_samples[i],
- ff_ac3_window[i]) >> 15;
- s->windowed_samples[AC3_BLOCK_SIZE*2-i-1] = MUL16(input_samples[AC3_BLOCK_SIZE*2-i-1],
- ff_ac3_window[i]) >> 15;
- }
-
- /* Normalize the samples to use the maximum available precision */
- v = 14 - log2_tab(s->windowed_samples, AC3_BLOCK_SIZE*2);
- v = FFMAX(0, v);
- exp_shift[blk][ch] = v - 9;
- lshift_tab(s->windowed_samples, AC3_BLOCK_SIZE*2, v);
-
- /* do the MDCT */
- mdct512(mdct_coef[blk][ch], s->windowed_samples);
+ apply_mdct(s, mdct_coef, exp_shift);
- /* compute "exponents". We take into account the normalization there */
- for (i = 0; i < AC3_MAX_COEFS; i++) {
- int e;
- v = abs(mdct_coef[blk][ch][i]);
- if (v == 0)
- e = 24;
- else {
- e = 23 - av_log2(v) + exp_shift[blk][ch];
- if (e >= 24) {
- e = 24;
- mdct_coef[blk][ch][i] = 0;
- }
- }
- exp[blk][ch][i] = e;
- }
- }
-
- compute_exp_strategy(exp_strategy, exp, ch, ch == s->lfe_ch);
-
- /* compute the exponents as the decoder will see them. The
- EXP_REUSE case must be handled carefully : we select the
- min of the exponents */
- blk = 0;
- while (blk < AC3_MAX_BLOCKS) {
- int blk2;
- int blk1 = blk + 1;
- while (blk1 < AC3_MAX_BLOCKS && exp_strategy[blk1][ch] == EXP_REUSE) {
- exponent_min(exp[blk][ch], exp[blk1][ch], s->nb_coefs[ch]);
- blk1++;
- }
- frame_bits += encode_exp(exp[blk][ch], s->nb_coefs[ch],
- exp_strategy[blk][ch]);
- /* copy encoded exponents for reuse case */
- for (blk2 = blk+1; blk2 < blk1; blk2++) {
- memcpy(exp[blk2][ch], exp[blk][ch],
- s->nb_coefs[ch] * sizeof(uint8_t));
- }
- blk = blk1;
- }
- }
+ process_exponents(s, mdct_coef, exp, exp_strategy, exp_shift, &frame_bits);
- /* adjust for fractional frame sizes */
- while (s->bits_written >= s->bit_rate && s->samples_written >= s->sample_rate) {
- s->bits_written -= s->bit_rate;
- s->samples_written -= s->sample_rate;
- }
- s->frame_size = s->frame_size_min + (s->bits_written * s->sample_rate < s->samples_written * s->bit_rate);
- s->bits_written += s->frame_size * 16;
- s->samples_written += AC3_FRAME_SIZE;
+ adjust_frame_size(s);
compute_bit_allocation(s, bap, exp, exp_strategy, frame_bits);
/* everything is known... let's output the frame */
_______________________________________________
FFmpeg-soc mailing list
[email protected]
https://lists.mplayerhq.hu/mailman/listinfo/ffmpeg-soc