[SCM] libav/experimental: VP8: simplify token_prob handling ~1.5% faster decode_block_coeffs

siretart at users.alioth.debian.org siretart at users.alioth.debian.org
Sun Jun 30 17:13:22 UTC 2013


The following commit has been merged in the experimental branch:
commit 10bf2eebbe285ca7d8a2a28dda76f44f6f77efb7
Author: Jason Garrett-Glaser <darkshikari at gmail.com>
Date:   Mon Aug 2 05:20:38 2010 +0000

    VP8: simplify token_prob handling
    ~1.5% faster decode_block_coeffs
    
    Originally committed as revision 24659 to svn://svn.ffmpeg.org/ffmpeg/trunk

diff --git a/libavcodec/vp8.c b/libavcodec/vp8.c
index c82c36b..9af92d5 100644
--- a/libavcodec/vp8.c
+++ b/libavcodec/vp8.c
@@ -810,13 +810,11 @@ static int decode_block_coeffs(VP56RangeCoder *c, DCTELEM block[16],
                                uint8_t probs[8][3][NUM_DCT_TOKENS-1],
                                int i, int zero_nhood, int16_t qmul[2])
 {
-    uint8_t *token_prob;
+    uint8_t *token_prob = probs[vp8_coeff_band[i]][zero_nhood];
     int nonzero = 0;
     int coeff;
 
     do {
-        token_prob = probs[vp8_coeff_band[i]][zero_nhood];
-
         if (!vp56_rac_get_prob_branchy(c, token_prob[0]))   // DCT_EOB
             return nonzero;
 
@@ -824,17 +822,14 @@ skip_eob:
         if (!vp56_rac_get_prob_branchy(c, token_prob[1])) { // DCT_0
             if (++i == 16)
                 return nonzero; // invalid input; blocks should end with EOB
-            zero_nhood = 0;
             token_prob = probs[vp8_coeff_band[i]][0];
             goto skip_eob;
         }
 
         if (!vp56_rac_get_prob_branchy(c, token_prob[2])) { // DCT_1
             coeff = 1;
-            zero_nhood = 1;
+            token_prob = probs[vp8_coeff_band[i+1]][1];
         } else {
-            zero_nhood = 2;
-
             if (!vp56_rac_get_prob_branchy(c, token_prob[3])) { // DCT 2,3,4
                 coeff = vp56_rac_get_prob(c, token_prob[4]);
                 if (coeff)
@@ -858,6 +853,7 @@ skip_eob:
                     coeff += vp8_rac_get_coeff(c, vp8_dct_cat_prob[cat]);
                 }
             }
+            token_prob = probs[vp8_coeff_band[i+1]][2];
         }
 
         // todo: full [16] qmat? load into register?
diff --git a/libavcodec/vp8data.h b/libavcodec/vp8data.h
index 28cc0b3..67e8ef3 100644
--- a/libavcodec/vp8data.h
+++ b/libavcodec/vp8data.h
@@ -314,9 +314,10 @@ static const int8_t vp8_segmentid_tree[][2] =
      { -2, -3 },    // '10', '11'
 };
 
-static const uint8_t vp8_coeff_band[16] =
+/* Padded by one byte to allow overreads */
+static const uint8_t vp8_coeff_band[17] =
 {
-    0, 1, 2, 3, 6, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7
+    0, 1, 2, 3, 6, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 0
 };
 
 static const uint8_t vp8_dct_cat1_prob[] = { 159, 0 };

-- 
Libav/FFmpeg packaging



More information about the pkg-multimedia-commits mailing list