From 44002d8323023c35f51d523a7d305e45103ba7a1 Mon Sep 17 00:00:00 2001 From: "Ronald S. Bultje" Date: Tue, 25 Jan 2011 12:25:07 -0500 Subject: [PATCH] Don't do edge emulation unless the edge pixels will be used in MC. Do not emulate larger edges than we will actually use for this round of MC. Decoding goes from avg+SE 29.972+/-0.023sec to 29.856+/-0.023, i.e. 0.12sec or ~0.4% faster. --- libavcodec/vp8.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/libavcodec/vp8.c b/libavcodec/vp8.c index 80d30e8046c..52a3f90ba0b 100644 --- a/libavcodec/vp8.c +++ b/libavcodec/vp8.c @@ -1218,21 +1218,26 @@ void vp8_mc(VP8Context *s, int luma, vp8_mc_func mc_func[3][3]) { 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]; + static const uint8_t idx[3][8] = { + { 0, 1, 2, 1, 2, 1, 2, 1 }, // nr. of left extra pixels, + // also function pointer index + { 0, 3, 5, 3, 5, 3, 5, 3 }, // nr. of extra pixels required + { 0, 2, 3, 2, 3, 2, 3, 2 }, // nr. of right extra pixels + }; + int mx = (mv->x << luma)&7, mx_idx = idx[0][mx]; + int my = (mv->y << luma)&7, my_idx = idx[0][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; + if (x_off < mx_idx || x_off >= width - block_w - idx[2][mx] || + y_off < my_idx || y_off >= height - block_h - idx[2][my]) { + ff_emulated_edge_mc(s->edge_emu_buffer, src - my_idx * linesize - mx_idx, linesize, + block_w + idx[1][mx], block_h + idx[1][my], + x_off - mx_idx, y_off - my_idx, width, height); + src = s->edge_emu_buffer + mx_idx + linesize * my_idx; } mc_func[my_idx][mx_idx](dst, linesize, src, linesize, block_h, mx, my); } else -- 2.39.2