mirror of https://git.ffmpeg.org/ffmpeg.git
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.
This commit is contained in:
parent
c0ae5152d1
commit
44002d8323
|
@ -1218,21 +1218,26 @@ void vp8_mc(VP8Context *s, int luma,
|
||||||
vp8_mc_func mc_func[3][3])
|
vp8_mc_func mc_func[3][3])
|
||||||
{
|
{
|
||||||
if (AV_RN32A(mv)) {
|
if (AV_RN32A(mv)) {
|
||||||
static const uint8_t idx[8] = { 0, 1, 2, 1, 2, 1, 2, 1 };
|
static const uint8_t idx[3][8] = {
|
||||||
int mx = (mv->x << luma)&7, mx_idx = idx[mx];
|
{ 0, 1, 2, 1, 2, 1, 2, 1 }, // nr. of left extra pixels,
|
||||||
int my = (mv->y << luma)&7, my_idx = idx[my];
|
// 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);
|
x_off += mv->x >> (3 - luma);
|
||||||
y_off += mv->y >> (3 - luma);
|
y_off += mv->y >> (3 - luma);
|
||||||
|
|
||||||
// edge emulation
|
// edge emulation
|
||||||
src += y_off * linesize + x_off;
|
src += y_off * linesize + x_off;
|
||||||
if (x_off < 2 || x_off >= width - block_w - 3 ||
|
if (x_off < mx_idx || x_off >= width - block_w - idx[2][mx] ||
|
||||||
y_off < 2 || y_off >= height - block_h - 3) {
|
y_off < my_idx || y_off >= height - block_h - idx[2][my]) {
|
||||||
ff_emulated_edge_mc(s->edge_emu_buffer, src - 2 * linesize - 2, linesize,
|
ff_emulated_edge_mc(s->edge_emu_buffer, src - my_idx * linesize - mx_idx, linesize,
|
||||||
block_w + 5, block_h + 5,
|
block_w + idx[1][mx], block_h + idx[1][my],
|
||||||
x_off - 2, y_off - 2, width, height);
|
x_off - mx_idx, y_off - my_idx, width, height);
|
||||||
src = s->edge_emu_buffer + 2 + linesize * 2;
|
src = s->edge_emu_buffer + mx_idx + linesize * my_idx;
|
||||||
}
|
}
|
||||||
mc_func[my_idx][mx_idx](dst, linesize, src, linesize, block_h, mx, my);
|
mc_func[my_idx][mx_idx](dst, linesize, src, linesize, block_h, mx, my);
|
||||||
} else
|
} else
|
||||||
|
|
Loading…
Reference in New Issue