[SCM] libav/experimental: VP8: unroll partition type decoding tree ~34% faster partition type decoding.

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


The following commit has been merged in the experimental branch:
commit 0908f1b945962f767a1b4963f9b62d8b00ffcfeb
Author: Jason Garrett-Glaser <darkshikari at gmail.com>
Date:   Tue Aug 3 11:10:58 2010 +0000

    VP8: unroll partition type decoding tree
    ~34% faster partition type decoding.
    
    Originally committed as revision 24681 to svn://svn.ffmpeg.org/ffmpeg/trunk

diff --git a/libavcodec/vp8.c b/libavcodec/vp8.c
index d21ed5e..a151dc9 100644
--- a/libavcodec/vp8.c
+++ b/libavcodec/vp8.c
@@ -644,19 +644,32 @@ const uint8_t *get_submv_prob(uint32_t left, uint32_t top)
 static av_always_inline
 int decode_splitmvs(VP8Context *s, VP56RangeCoder *c, VP8Macroblock *mb)
 {
-    int part_idx = mb->partitioning =
-        vp8_rac_get_tree(c, vp8_mbsplit_tree, vp8_mbsplit_prob);
-    int n, num = vp8_mbsplit_count[part_idx];
+    int part_idx;
+    int n, num;
     VP8Macroblock *top_mb  = &mb[2];
     VP8Macroblock *left_mb = &mb[-1];
     const uint8_t *mbsplits_left = vp8_mbsplits[left_mb->partitioning],
                   *mbsplits_top = vp8_mbsplits[top_mb->partitioning],
-                  *mbsplits_cur = vp8_mbsplits[part_idx],
-                  *firstidx = vp8_mbfirstidx[part_idx];
+                  *mbsplits_cur, *firstidx;
     VP56mv *top_mv  = top_mb->bmv;
     VP56mv *left_mv = left_mb->bmv;
     VP56mv *cur_mv  = mb->bmv;
 
+    if (vp56_rac_get_prob_branchy(c, vp8_mbsplit_prob[0])) {
+        if (vp56_rac_get_prob_branchy(c, vp8_mbsplit_prob[1])) {
+            part_idx = VP8_SPLITMVMODE_16x8 + vp56_rac_get_prob(c, vp8_mbsplit_prob[2]);
+        } else {
+            part_idx = VP8_SPLITMVMODE_8x8;
+        }
+    } else {
+        part_idx = VP8_SPLITMVMODE_4x4;
+    }
+
+    num = vp8_mbsplit_count[part_idx];
+    mbsplits_cur = vp8_mbsplits[part_idx],
+    firstidx = vp8_mbfirstidx[part_idx];
+    mb->partitioning = part_idx;
+
     for (n = 0; n < num; n++) {
         int k = firstidx[n];
         uint32_t left, above;
diff --git a/libavcodec/vp8data.h b/libavcodec/vp8data.h
index 43b74ca..ce64262 100644
--- a/libavcodec/vp8data.h
+++ b/libavcodec/vp8data.h
@@ -115,12 +115,6 @@ static const uint8_t vp8_mbfirstidx[4][16] = {
        8,  9, 10, 11, 12, 13, 14, 15 }
 };
 
-static const int8_t vp8_mbsplit_tree[3][2] = {
-    { -VP8_SPLITMVMODE_4x4,  1 },           // '0' - 16 individual MVs
-     { -VP8_SPLITMVMODE_8x8,  2 },          // '10' - quarter-based MVs
-      { -VP8_SPLITMVMODE_16x8,              // '110' - top/bottom MVs
-        -VP8_SPLITMVMODE_8x16 }             // '111' - left/right MVs
-};
 static const uint8_t vp8_mbsplit_count[4] = {   2,   2,   4,  16 };
 static const uint8_t vp8_mbsplit_prob[3]  = { 110, 111, 150 };
 

-- 
Libav/FFmpeg packaging



More information about the pkg-multimedia-commits mailing list