aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec
diff options
context:
space:
mode:
authorJason Garrett-Glaser <darkshikari@gmail.com>2010-07-22 05:49:09 +0000
committerJason Garrett-Glaser <darkshikari@gmail.com>2010-07-22 05:49:09 +0000
commitc0498b3031fe0d2a293b55c705c7c14601b69e9d (patch)
tree9f2fcdb21d472555d950652e75a1695095c7b8ab /libavcodec
parent702e8d3376f3280d156af2c506b48a80e32b4ded (diff)
downloadffmpeg-c0498b3031fe0d2a293b55c705c7c14601b69e9d.tar.gz
Take shortcuts for mv0 case in VP8 MC
Avoid edge emulation -- it isn't needed if there isn't any subpel. Originally committed as revision 24413 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/vp8.c38
1 files changed, 20 insertions, 18 deletions
diff --git a/libavcodec/vp8.c b/libavcodec/vp8.c
index bc95fb0c2f..6db101d1a7 100644
--- a/libavcodec/vp8.c
+++ b/libavcodec/vp8.c
@@ -1008,24 +1008,26 @@ static inline void vp8_mc(VP8Context *s, int luma,
int width, int height, int linesize,
vp8_mc_func mc_func[3][3])
{
- static const uint8_t idx[8] = { 0, 1, 2, 1, 2, 1, 2, 1 };
- int mx = (mv->x << luma)&7, mx_idx = idx[mx];
- int my = (mv->y << luma)&7, my_idx = idx[my];
-
- x_off += mv->x >> (3 - luma);
- y_off += mv->y >> (3 - luma);
-
- // edge emulation
- src += y_off * linesize + x_off;
- if (x_off < 2 || x_off >= width - block_w - 3 ||
- y_off < 2 || y_off >= height - block_h - 3) {
- ff_emulated_edge_mc(s->edge_emu_buffer, src - 2 * linesize - 2, linesize,
- block_w + 5, block_h + 5,
- x_off - 2, y_off - 2, width, height);
- src = s->edge_emu_buffer + 2 + linesize * 2;
- }
-
- mc_func[my_idx][mx_idx](dst, linesize, src, linesize, block_h, mx, my);
+ if (AV_RN32A(mv)) {
+ static const uint8_t idx[8] = { 0, 1, 2, 1, 2, 1, 2, 1 };
+ int mx = (mv->x << luma)&7, mx_idx = idx[mx];
+ int my = (mv->y << luma)&7, my_idx = idx[my];
+
+ x_off += mv->x >> (3 - luma);
+ y_off += mv->y >> (3 - luma);
+
+ // edge emulation
+ src += y_off * linesize + x_off;
+ if (x_off < 2 || x_off >= width - block_w - 3 ||
+ y_off < 2 || y_off >= height - block_h - 3) {
+ ff_emulated_edge_mc(s->edge_emu_buffer, src - 2 * linesize - 2, linesize,
+ block_w + 5, block_h + 5,
+ x_off - 2, y_off - 2, width, height);
+ src = s->edge_emu_buffer + 2 + linesize * 2;
+ }
+ mc_func[my_idx][mx_idx](dst, linesize, src, linesize, block_h, mx, my);
+ } else
+ mc_func[0][0](dst, linesize, src + y_off * linesize + x_off, linesize, block_h, 0, 0);
}
static inline void vp8_mc_part(VP8Context *s, uint8_t *dst[3],