From: Jason Garrett-Glaser Date: Tue, 3 Aug 2010 10:37:14 +0000 (+0000) Subject: VP8: unroll splitmv decoding tree X-Git-Tag: v0.7b1~2699 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c5dec7f137280c7cdf770027e87630b9dcf6bd4e;p=platform%2Fupstream%2Flibav.git VP8: unroll splitmv decoding tree Much faster splitmv mode decoding. Originally committed as revision 24680 to svn://svn.ffmpeg.org/ffmpeg/trunk --- diff --git a/libavcodec/vp8.c b/libavcodec/vp8.c index af18b0d..d21ed5e 100644 --- a/libavcodec/vp8.c +++ b/libavcodec/vp8.c @@ -673,20 +673,19 @@ int decode_splitmvs(VP8Context *s, VP56RangeCoder *c, VP8Macroblock *mb) submv_prob = get_submv_prob(left, above); - switch (vp8_rac_get_tree(c, vp8_submv_ref_tree, submv_prob)) { - case VP8_SUBMVMODE_NEW4X4: - mb->bmv[n].y = mb->mv.y + read_mv_component(c, s->prob->mvc[0]); - mb->bmv[n].x = mb->mv.x + read_mv_component(c, s->prob->mvc[1]); - break; - case VP8_SUBMVMODE_ZERO4X4: - AV_ZERO32(&mb->bmv[n]); - break; - case VP8_SUBMVMODE_LEFT4X4: + if (vp56_rac_get_prob_branchy(c, submv_prob[0])) { + if (vp56_rac_get_prob_branchy(c, submv_prob[1])) { + if (vp56_rac_get_prob_branchy(c, submv_prob[2])) { + mb->bmv[n].y = mb->mv.y + read_mv_component(c, s->prob->mvc[0]); + mb->bmv[n].x = mb->mv.x + read_mv_component(c, s->prob->mvc[1]); + } else { + AV_ZERO32(&mb->bmv[n]); + } + } else { + AV_WN32A(&mb->bmv[n], above); + } + } else { AV_WN32A(&mb->bmv[n], left); - break; - case VP8_SUBMVMODE_TOP4X4: - AV_WN32A(&mb->bmv[n], above); - break; } } diff --git a/libavcodec/vp8data.h b/libavcodec/vp8data.h index d3a47fc..43b74ca 100644 --- a/libavcodec/vp8data.h +++ b/libavcodec/vp8data.h @@ -55,13 +55,6 @@ enum inter_mvmode { VP8_MVMODE_SPLIT }; -enum inter_submvmode { - VP8_SUBMVMODE_LEFT4X4, - VP8_SUBMVMODE_TOP4X4, - VP8_SUBMVMODE_ZERO4X4, - VP8_SUBMVMODE_NEW4X4 -}; - enum inter_splitmvmode { VP8_SPLITMVMODE_16x8 = 0, ///< 2 16x8 blocks (vertical) VP8_SPLITMVMODE_8x16, ///< 2 8x16 blocks (horizontal) @@ -139,12 +132,6 @@ static const uint8_t vp8_submv_prob[5][3] = { { 208, 1, 1 } }; -static const int8_t vp8_submv_ref_tree[3][2] = { - { -VP8_SUBMVMODE_LEFT4X4, 1 }, // '0' - { -VP8_SUBMVMODE_TOP4X4, 2 }, // '10' - { -VP8_SUBMVMODE_ZERO4X4, -VP8_SUBMVMODE_NEW4X4 } // '110', '111' -}; - static const uint8_t vp8_pred16x16_prob_intra[4] = { 145, 156, 163, 128 }; static const uint8_t vp8_pred16x16_prob_inter[4] = { 112, 86, 140, 37 };