diff options
author | Jason Garrett-Glaser <darkshikari@gmail.com> | 2010-07-22 06:29:26 +0000 |
---|---|---|
committer | Jason Garrett-Glaser <darkshikari@gmail.com> | 2010-07-22 06:29:26 +0000 |
commit | 7bf254c41d2d4ec937ec2a472b8adbea660fd2d2 (patch) | |
tree | 164e3656101b48014cab80dfb544889f62d80f14 | |
parent | c0498b3031fe0d2a293b55c705c7c14601b69e9d (diff) | |
download | ffmpeg-7bf254c41d2d4ec937ec2a472b8adbea660fd2d2.tar.gz |
Optimize partition mv decoding in VP8
Originally committed as revision 24414 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r-- | libavcodec/vp8.c | 50 |
1 files changed, 25 insertions, 25 deletions
diff --git a/libavcodec/vp8.c b/libavcodec/vp8.c index 6db101d1a7..9407698802 100644 --- a/libavcodec/vp8.c +++ b/libavcodec/vp8.c @@ -602,17 +602,13 @@ static int read_mv_component(VP56RangeCoder *c, const uint8_t *p) return (x && vp56_rac_get_prob(c, p[1])) ? -x : x; } -static const uint8_t *get_submv_prob(const VP56mv *left, const VP56mv *top) +static const uint8_t *get_submv_prob(uint32_t left, uint32_t top) { - int l_is_zero = !(left->x | left->y); - int t_is_zero = !(top->x | top->y); - int equal = !((left->x ^ top->x) | (left->y ^ top->y)); - - if (equal) - return l_is_zero ? vp8_submv_prob[4] : vp8_submv_prob[3]; - if (t_is_zero) + if (left == top) + return vp8_submv_prob[4-!!left]; + if (!top) return vp8_submv_prob[2]; - return l_is_zero ? vp8_submv_prob[1] : vp8_submv_prob[0]; + return vp8_submv_prob[1-!!left]; } /** @@ -625,24 +621,29 @@ static int decode_splitmvs(VP8Context *s, VP56RangeCoder *c, int part_idx = mb->partitioning = vp8_rac_get_tree(c, vp8_mbsplit_tree, vp8_mbsplit_prob); int n, num = vp8_mbsplit_count[part_idx]; - const uint8_t *mbsplits = vp8_mbsplits[part_idx], + VP8Macroblock *top_mb = &mb[-s->mb_stride]; + 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]; + VP56mv *top_mv = top_mb->bmv; + VP56mv *left_mv = left_mb->bmv; + VP56mv *cur_mv = mb->bmv; for (n = 0; n < num; n++) { int k = firstidx[n]; - const VP56mv *left, *above; + uint32_t left, above; const uint8_t *submv_prob; - if (!(k & 3)) { - VP8Macroblock *left_mb = &mb[-1]; - left = &left_mb->bmv[vp8_mbsplits[left_mb->partitioning][k + 3]]; - } else - left = &mb->bmv[mbsplits[k - 1]]; - if (k <= 3) { - VP8Macroblock *above_mb = &mb[-s->mb_stride]; - above = &above_mb->bmv[vp8_mbsplits[above_mb->partitioning][k + 12]]; - } else - above = &mb->bmv[mbsplits[k - 4]]; + if (!(k & 3)) + left = AV_RN32A(&left_mv[mbsplits_left[k + 3]]); + else + left = AV_RN32A(&cur_mv[mbsplits_cur[k - 1]]); + if (k <= 3) + above = AV_RN32A(&top_mv[mbsplits_top[k + 12]]); + else + above = AV_RN32A(&cur_mv[mbsplits_cur[k - 4]]); submv_prob = get_submv_prob(left, above); @@ -652,14 +653,13 @@ static int decode_splitmvs(VP8Context *s, VP56RangeCoder *c, mb->bmv[n].x = base_mv->x + read_mv_component(c, s->prob->mvc[1]); break; case VP8_SUBMVMODE_ZERO4X4: - mb->bmv[n].x = 0; - mb->bmv[n].y = 0; + AV_WN32A(&mb->bmv[n], 0); break; case VP8_SUBMVMODE_LEFT4X4: - mb->bmv[n] = *left; + AV_WN32A(&mb->bmv[n], left); break; case VP8_SUBMVMODE_TOP4X4: - mb->bmv[n] = *above; + AV_WN32A(&mb->bmv[n], above); break; } } |