Browse Source

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.
(cherry picked from commit 44002d8323)
tags/n0.8
Ronald S. Bultje Michael Niedermayer 14 years ago
parent
commit
ac3c04e4d6
1 changed files with 14 additions and 9 deletions
  1. +14
    -9
      libavcodec/vp8.c

+ 14
- 9
libavcodec/vp8.c View File

@@ -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


Loading…
Cancel
Save