diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2012-10-06 23:12:57 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2012-10-06 23:12:57 +0200 |
commit | 19a4e103601919d5a385dba9e4a05e1834850259 (patch) | |
tree | ddb6d5e5248f3578ae2f741760f6990fd066ae1d /libavcodec/x86/dsputil_mmx.c | |
parent | e063ffbf4ba98255cfe721afe48877b32590ed2c (diff) | |
download | ffmpeg-19a4e103601919d5a385dba9e4a05e1834850259.tar.gz |
gmc_mmx: enable also for large pictures when emu edge isnt needed.
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/x86/dsputil_mmx.c')
-rw-r--r-- | libavcodec/x86/dsputil_mmx.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/libavcodec/x86/dsputil_mmx.c b/libavcodec/x86/dsputil_mmx.c index 27e732f5da..29faf1e07e 100644 --- a/libavcodec/x86/dsputil_mmx.c +++ b/libavcodec/x86/dsputil_mmx.c @@ -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 dxh = dxy * (h - 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) ((ox ^ (ox + dxw)) | (ox ^ (ox + dxh)) | (ox ^ (ox + dxw + dxh)) | (oy ^ (oy + dyw)) | (oy ^ (oy + dyh)) | (oy ^ (oy + dyw + dyh))) >> (16 + shift) // uses more than 16 bits of subpel mv (only at huge resolution) || (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 ff_gmc_c(dst, src, stride, h, ox, oy, dxx, dxy, dyx, dyy, shift, r, width, height); @@ -1974,8 +1977,7 @@ static av_always_inline void gmc(uint8_t *dst, uint8_t *src, } src += ix + iy * stride; - if ((unsigned)ix >= width - w || - (unsigned)iy >= height - h) { + if (need_emu) { emu_edge_fn(edge_buf, src, stride, w + 1, h + 1, ix, iy, width, height); src = edge_buf; } |