aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason Garrett-Glaser <darkshikari@gmail.com>2010-08-03 11:10:58 +0000
committerJason Garrett-Glaser <darkshikari@gmail.com>2010-08-03 11:10:58 +0000
commit0908f1b945962f767a1b4963f9b62d8b00ffcfeb (patch)
tree4b9485de5d256b7309072db9e98514a8d9c3845a
parentc5dec7f137280c7cdf770027e87630b9dcf6bd4e (diff)
downloadffmpeg-0908f1b945962f767a1b4963f9b62d8b00ffcfeb.tar.gz
VP8: unroll partition type decoding tree
~34% faster partition type decoding. Originally committed as revision 24681 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r--libavcodec/vp8.c23
-rw-r--r--libavcodec/vp8data.h6
2 files changed, 18 insertions, 11 deletions
diff --git a/libavcodec/vp8.c b/libavcodec/vp8.c
index d21ed5eb72..a151dc99fa 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 43b74ca2b6..ce64262758 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 };