[FFmpeg-cvslog] ac3enc: move extract_exponents inner loop to ac3dsp

Mans Rullgard git at videolan.org
Tue Apr 5 02:33:10 CEST 2011


ffmpeg | branch: master | Mans Rullgard <mans at mansr.com> | Sat Mar 12 22:16:49 2011 +0000| [2310ee4b1cca48609d06774b7c3c70a5f38f3473] | committer: Mans Rullgard

ac3enc: move extract_exponents inner loop to ac3dsp

Signed-off-by: Mans Rullgard <mans at mansr.com>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=2310ee4b1cca48609d06774b7c3c70a5f38f3473
---

 libavcodec/ac3dsp.c |   23 +++++++++++++++++++++++
 libavcodec/ac3dsp.h |    2 ++
 libavcodec/ac3enc.c |   21 +++------------------
 3 files changed, 28 insertions(+), 18 deletions(-)

diff --git a/libavcodec/ac3dsp.c b/libavcodec/ac3dsp.c
index cd4d30b..dccad3b 100644
--- a/libavcodec/ac3dsp.c
+++ b/libavcodec/ac3dsp.c
@@ -19,6 +19,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#include "libavutil/avassert.h"
 #include "avcodec.h"
 #include "ac3.h"
 #include "ac3dsp.h"
@@ -149,6 +150,27 @@ static int ac3_compute_mantissa_size_c(int mant_cnt[5], uint8_t *bap,
     return bits;
 }
 
+static void ac3_extract_exponents_c(uint8_t *exp, int32_t *coef, int nb_coefs)
+{
+    int i;
+
+    for (i = 0; i < nb_coefs; i++) {
+        int e;
+        int v = abs(coef[i]);
+        if (v == 0)
+            e = 24;
+        else {
+            e = 23 - av_log2(v);
+            if (e >= 24) {
+                e = 24;
+                coef[i] = 0;
+            }
+            av_assert2(e >= 0);
+        }
+        exp[i] = e;
+    }
+}
+
 av_cold void ff_ac3dsp_init(AC3DSPContext *c, int bit_exact)
 {
     c->ac3_exponent_min = ac3_exponent_min_c;
@@ -158,6 +180,7 @@ av_cold void ff_ac3dsp_init(AC3DSPContext *c, int bit_exact)
     c->float_to_fixed24 = float_to_fixed24_c;
     c->bit_alloc_calc_bap = ac3_bit_alloc_calc_bap_c;
     c->compute_mantissa_size = ac3_compute_mantissa_size_c;
+    c->extract_exponents = ac3_extract_exponents_c;
 
     if (ARCH_ARM)
         ff_ac3dsp_init_arm(c, bit_exact);
diff --git a/libavcodec/ac3dsp.h b/libavcodec/ac3dsp.h
index aa605a8..b750767 100644
--- a/libavcodec/ac3dsp.h
+++ b/libavcodec/ac3dsp.h
@@ -105,6 +105,8 @@ typedef struct AC3DSPContext {
      * Calculate the number of bits needed to encode a set of mantissas.
      */
     int (*compute_mantissa_size)(int mant_cnt[5], uint8_t *bap, int nb_coefs);
+
+    void (*extract_exponents)(uint8_t *exp, int32_t *coef, int nb_coefs);
 } AC3DSPContext;
 
 void ff_ac3dsp_init    (AC3DSPContext *c, int bit_exact);
diff --git a/libavcodec/ac3enc.c b/libavcodec/ac3enc.c
index e0806b3..04e8b4f 100644
--- a/libavcodec/ac3enc.c
+++ b/libavcodec/ac3enc.c
@@ -562,28 +562,13 @@ static av_cold void exponent_init(AC3EncodeContext *s)
  */
 static void extract_exponents(AC3EncodeContext *s)
 {
-    int blk, ch, i;
+    int blk, ch;
 
     for (ch = 0; ch < s->channels; ch++) {
         for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) {
             AC3Block *block = &s->blocks[blk];
-            uint8_t *exp   = block->exp[ch];
-            int32_t *coef = block->fixed_coef[ch];
-            for (i = 0; i < AC3_MAX_COEFS; i++) {
-                int e;
-                int v = abs(coef[i]);
-                if (v == 0)
-                    e = 24;
-                else {
-                    e = 23 - av_log2(v);
-                    if (e >= 24) {
-                        e = 24;
-                        coef[i] = 0;
-                    }
-                    av_assert2(e >= 0);
-                }
-                exp[i] = e;
-            }
+            s->ac3dsp.extract_exponents(block->exp[ch], block->fixed_coef[ch],
+                                        AC3_MAX_COEFS);
         }
     }
 }



More information about the ffmpeg-cvslog mailing list