mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2025-04-23 07:26:43 +00:00
gmc_mmx: enable also for large pictures when emu edge isnt needed.
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
parent
e063ffbf4b
commit
19a4e10360
@ -1961,12 +1961,15 @@ static av_always_inline void gmc(uint8_t *dst, uint8_t *src,
|
|||||||
const int dyh = (dyy - (1 << (16 + shift))) * (h - 1);
|
const int dyh = (dyy - (1 << (16 + shift))) * (h - 1);
|
||||||
const int dxh = dxy * (h - 1);
|
const int dxh = dxy * (h - 1);
|
||||||
const int dyw = dyx * (w - 1);
|
const int dyw = dyx * (w - 1);
|
||||||
|
int need_emu = (unsigned)ix >= width - w ||
|
||||||
|
(unsigned)iy >= height - h;
|
||||||
|
|
||||||
if ( // non-constant fullpel offset (3% of blocks)
|
if ( // non-constant fullpel offset (3% of blocks)
|
||||||
((ox ^ (ox + dxw)) | (ox ^ (ox + dxh)) | (ox ^ (ox + dxw + dxh)) |
|
((ox ^ (ox + dxw)) | (ox ^ (ox + dxh)) | (ox ^ (ox + dxw + dxh)) |
|
||||||
(oy ^ (oy + dyw)) | (oy ^ (oy + dyh)) | (oy ^ (oy + dyw + dyh))) >> (16 + shift)
|
(oy ^ (oy + dyw)) | (oy ^ (oy + dyh)) | (oy ^ (oy + dyw + dyh))) >> (16 + shift)
|
||||||
// uses more than 16 bits of subpel mv (only at huge resolution)
|
// uses more than 16 bits of subpel mv (only at huge resolution)
|
||||||
|| (dxx | dxy | dyx | dyy) & 15
|
|| (dxx | dxy | dyx | dyy) & 15
|
||||||
|| h > MAX_H || stride > MAX_STRIDE) {
|
|| (need_emu && (h > MAX_H || stride > MAX_STRIDE))) {
|
||||||
// FIXME could still use mmx for some of the rows
|
// FIXME could still use mmx for some of the rows
|
||||||
ff_gmc_c(dst, src, stride, h, ox, oy, dxx, dxy, dyx, dyy,
|
ff_gmc_c(dst, src, stride, h, ox, oy, dxx, dxy, dyx, dyy,
|
||||||
shift, r, width, height);
|
shift, r, width, height);
|
||||||
@ -1974,8 +1977,7 @@ static av_always_inline void gmc(uint8_t *dst, uint8_t *src,
|
|||||||
}
|
}
|
||||||
|
|
||||||
src += ix + iy * stride;
|
src += ix + iy * stride;
|
||||||
if ((unsigned)ix >= width - w ||
|
if (need_emu) {
|
||||||
(unsigned)iy >= height - h) {
|
|
||||||
emu_edge_fn(edge_buf, src, stride, w + 1, h + 1, ix, iy, width, height);
|
emu_edge_fn(edge_buf, src, stride, w + 1, h + 1, ix, iy, width, height);
|
||||||
src = edge_buf;
|
src = edge_buf;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user