---
 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

Reply via email to