Mercurial > libavcodec.hg
changeset 12350:db60aff8eeef libavcodec
VP8: unroll MB mode decoding tree
~50% faster MB mode decoding, plus eliminate a costly switch.
author | darkshikari |
---|---|
date | Tue, 03 Aug 2010 10:24:28 +0000 |
parents | f618c62a6ddb |
children | 3e02e2306209 |
files | vp8.c vp8data.h |
diffstat | 2 files changed, 23 insertions(+), 31 deletions(-) [+] |
line wrap: on
line diff
--- a/vp8.c Tue Aug 03 08:06:08 2010 +0000 +++ b/vp8.c Tue Aug 03 10:24:28 2010 +0000 @@ -745,7 +745,6 @@ } else if (vp56_rac_get_prob_branchy(c, s->prob->intra)) { VP56mv near[2], best; uint8_t cnt[4] = { 0 }; - uint8_t p[4]; // inter MB, 16.2 if (vp56_rac_get_prob_branchy(c, s->prob->last)) @@ -757,30 +756,30 @@ // motion vectors, 16.3 find_near_mvs(s, mb, mb_x, mb_y, near, &best, cnt); - p[0] = vp8_mode_contexts[cnt[0]][0]; - p[1] = vp8_mode_contexts[cnt[1]][1]; - p[2] = vp8_mode_contexts[cnt[2]][2]; - p[3] = vp8_mode_contexts[cnt[3]][3]; - mb->mode = vp8_rac_get_tree(c, vp8_pred16x16_tree_mvinter, p); - switch (mb->mode) { - case VP8_MVMODE_SPLIT: - clamp_mv(s, &mb->mv, &mb->mv, mb_x, mb_y); - mb->mv = mb->bmv[decode_splitmvs(s, c, mb) - 1]; - break; - case VP8_MVMODE_ZERO: + if (vp56_rac_get_prob_branchy(c, vp8_mode_contexts[cnt[0]][0])) { + if (vp56_rac_get_prob_branchy(c, vp8_mode_contexts[cnt[1]][1])) { + if (vp56_rac_get_prob_branchy(c, vp8_mode_contexts[cnt[2]][2])) { + if (vp56_rac_get_prob_branchy(c, vp8_mode_contexts[cnt[3]][3])) { + mb->mode = VP8_MVMODE_SPLIT; + clamp_mv(s, &mb->mv, &mb->mv, mb_x, mb_y); + mb->mv = mb->bmv[decode_splitmvs(s, c, mb) - 1]; + } else { + mb->mode = VP8_MVMODE_NEW; + clamp_mv(s, &mb->mv, &mb->mv, mb_x, mb_y); + mb->mv.y += + read_mv_component(c, s->prob->mvc[0]); + mb->mv.x += + read_mv_component(c, s->prob->mvc[1]); + } + } else { + mb->mode = VP8_MVMODE_NEAR; + clamp_mv(s, &mb->mv, &near[1], mb_x, mb_y); + } + } else { + mb->mode = VP8_MVMODE_NEAREST; + clamp_mv(s, &mb->mv, &near[0], mb_x, mb_y); + } + } else { + mb->mode = VP8_MVMODE_ZERO; AV_ZERO32(&mb->mv); - break; - case VP8_MVMODE_NEAREST: - clamp_mv(s, &mb->mv, &near[0], mb_x, mb_y); - break; - case VP8_MVMODE_NEAR: - clamp_mv(s, &mb->mv, &near[1], mb_x, mb_y); - break; - case VP8_MVMODE_NEW: - clamp_mv(s, &mb->mv, &mb->mv, mb_x, mb_y); - mb->mv.y += + read_mv_component(c, s->prob->mvc[0]); - mb->mv.x += + read_mv_component(c, s->prob->mvc[1]); - break; } if (mb->mode != VP8_MVMODE_SPLIT) { mb->partitioning = VP8_SPLITMVMODE_NONE;
--- a/vp8data.h Tue Aug 03 08:06:08 2010 +0000 +++ b/vp8data.h Tue Aug 03 10:24:28 2010 +0000 @@ -103,13 +103,6 @@ { 234, 188, 128, 28 }, }; -static const int8_t vp8_pred16x16_tree_mvinter[4][2] = { - { -VP8_MVMODE_ZERO, 1 }, // '0' - { -VP8_MVMODE_NEAREST, 2 }, // '10' - { -VP8_MVMODE_NEAR, 3 }, // '110' - { -VP8_MVMODE_NEW, -VP8_MVMODE_SPLIT } // '1110', '1111' -}; - static const uint8_t vp8_mbsplits[5][16] = { { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1 },