diff options
author | Vitor Sessak <vitor1001@gmail.com> | 2010-11-12 19:55:26 +0000 |
---|---|---|
committer | Vitor Sessak <vitor1001@gmail.com> | 2010-11-12 19:55:26 +0000 |
commit | c4e8733ac1214f507e7394bca3588bf104f055d9 (patch) | |
tree | 8661f181cda3a42b675bef57fc8052aaf1d1652f /libavcodec/4xm.c | |
parent | 38b3bda18f07a1a8dd18437105a12427c5a90c1c (diff) | |
download | ffmpeg-c4e8733ac1214f507e7394bca3588bf104f055d9.tar.gz |
Fix visual artifacts in 4XM decoding on big-endian system
Originally committed as revision 25734 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/4xm.c')
-rw-r--r-- | libavcodec/4xm.c | 31 |
1 files changed, 24 insertions, 7 deletions
diff --git a/libavcodec/4xm.c b/libavcodec/4xm.c index b6a97aa187..23e8ca4420 100644 --- a/libavcodec/4xm.c +++ b/libavcodec/4xm.c @@ -260,6 +260,23 @@ static void init_mv(FourXContext *f){ } } +#if HAVE_BIGENDIAN +#define LE_CENTRIC_MUL(dst, src, scale, dc) \ + { \ + unsigned tmpval = AV_RN32(src); \ + tmpval = (tmpval << 16) | (tmpval >> 16); \ + tmpval = tmpval * (scale) + (dc); \ + tmpval = (tmpval << 16) | (tmpval >> 16); \ + AV_WN32A(dst, tmpval); \ + } +#else +#define LE_CENTRIC_MUL(dst, src, scale, dc) \ + { \ + unsigned tmpval = AV_RN32(src) * (scale) + (dc); \ + AV_WN32A(dst, tmpval); \ + } +#endif + static inline void mcdc(uint16_t *dst, uint16_t *src, int log2w, int h, int stride, int scale, int dc){ int i; dc*= 0x10001; @@ -274,25 +291,25 @@ static inline void mcdc(uint16_t *dst, uint16_t *src, int log2w, int h, int stri break; case 1: for(i=0; i<h; i++){ - ((uint32_t*)dst)[0] = scale*((uint32_t*)src)[0] + dc; + LE_CENTRIC_MUL(dst, src, scale, dc); if(scale) src += stride; dst += stride; } break; case 2: for(i=0; i<h; i++){ - ((uint32_t*)dst)[0] = scale*((uint32_t*)src)[0] + dc; - ((uint32_t*)dst)[1] = scale*((uint32_t*)src)[1] + dc; + LE_CENTRIC_MUL(dst, src, scale, dc); + LE_CENTRIC_MUL(dst + 2, src + 2, scale, dc); if(scale) src += stride; dst += stride; } break; case 3: for(i=0; i<h; i++){ - ((uint32_t*)dst)[0] = scale*((uint32_t*)src)[0] + dc; - ((uint32_t*)dst)[1] = scale*((uint32_t*)src)[1] + dc; - ((uint32_t*)dst)[2] = scale*((uint32_t*)src)[2] + dc; - ((uint32_t*)dst)[3] = scale*((uint32_t*)src)[3] + dc; + LE_CENTRIC_MUL(dst, src, scale, dc); + LE_CENTRIC_MUL(dst + 2, src + 2, scale, dc); + LE_CENTRIC_MUL(dst + 4, src + 4, scale, dc); + LE_CENTRIC_MUL(dst + 6, src + 6, scale, dc); if(scale) src += stride; dst += stride; } |