Process all EXP_REUSE blocks at once in exponent_min().
authorJustin Ruggles <justin.ruggles@gmail.com>
Sat, 15 Jan 2011 01:59:21 +0000 (01:59 +0000)
committerJustin Ruggles <justin.ruggles@gmail.com>
Sat, 15 Jan 2011 01:59:21 +0000 (01:59 +0000)
43% faster in function encode_exponents().

Originally committed as revision 26358 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavcodec/ac3enc.c

index 61986be..9b8efaa 100644 (file)
@@ -500,15 +500,25 @@ static void compute_exp_strategy(AC3EncodeContext *s)
 
 /**
  * Set each encoded exponent in a block to the minimum of itself and the
- * exponent in the same frequency bin of a following block.
- * exp[i] = min(exp[i], exp1[i]
+ * exponents in the same frequency bin of up to 5 following blocks.
  */
-static void exponent_min(uint8_t *exp, uint8_t *exp1, int n)
+static void exponent_min(uint8_t *exp, int num_reuse_blocks, int nb_coefs)
 {
-    int i;
-    for (i = 0; i < n; i++) {
-        if (exp1[i] < exp[i])
-            exp[i] = exp1[i];
+    int blk, i;
+
+    if (!num_reuse_blocks)
+        return;
+
+    for (i = 0; i < nb_coefs; i++) {
+        uint8_t min_exp = *exp;
+        uint8_t *exp1 = exp + AC3_MAX_COEFS;
+        for (blk = 0; blk < num_reuse_blocks; blk++) {
+            uint8_t next_exp = *exp1;
+            if (next_exp < min_exp)
+                min_exp = next_exp;
+            exp1 += AC3_MAX_COEFS;
+        }
+        *exp++ = min_exp;
     }
 }
 
@@ -589,7 +599,7 @@ static void encode_exponents(AC3EncodeContext *s)
 {
     int blk, blk1, ch;
     uint8_t *exp, *exp1, *exp_strategy;
-    int nb_coefs;
+    int nb_coefs, num_reuse_blocks;
 
     for (ch = 0; ch < s->channels; ch++) {
         exp          = s->blocks[0].exp[ch];
@@ -599,13 +609,16 @@ static void encode_exponents(AC3EncodeContext *s)
         blk = 0;
         while (blk < AC3_MAX_BLOCKS) {
             blk1 = blk + 1;
-            exp1 = exp + AC3_MAX_COEFS;
-            /* for the EXP_REUSE case we select the min of the exponents */
+
+            /* count the number of EXP_REUSE blocks after the current block */
             while (blk1 < AC3_MAX_BLOCKS && exp_strategy[blk1] == EXP_REUSE) {
-                exponent_min(exp, exp1, nb_coefs);
                 blk1++;
-                exp1 += AC3_MAX_COEFS;
             }
+            num_reuse_blocks = blk1 - blk - 1;
+
+            /* for the EXP_REUSE case we select the min of the exponents */
+            exponent_min(exp, num_reuse_blocks, nb_coefs);
+
             encode_exponents_blk_ch(exp, nb_coefs,
                                     exp_strategy[blk]);
             /* copy encoded exponents for reuse case */