[SCM] libav/experimental: Fix visual artifacts in 4XM decoding on big-endian system

siretart at users.alioth.debian.org siretart at users.alioth.debian.org
Sun Jun 30 17:18:57 UTC 2013


The following commit has been merged in the experimental branch:
commit c4e8733ac1214f507e7394bca3588bf104f055d9
Author: Vitor Sessak <vitor1001 at gmail.com>
Date:   Fri Nov 12 19:55:26 2010 +0000

    Fix visual artifacts in 4XM decoding on big-endian system
    
    Originally committed as revision 25734 to svn://svn.ffmpeg.org/ffmpeg/trunk

diff --git a/libavcodec/4xm.c b/libavcodec/4xm.c
index b6a97aa..23e8ca4 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;
         }

-- 
Libav/FFmpeg packaging



More information about the pkg-multimedia-commits mailing list