If the value is a 32 bit value (e.g. a constant like 0), the larger
shifts are undefined, and e.g. clang end up only writing 32 bits
for an AV_WN64(ptr, 0);

This fixes the VP8 decoder in build configurations with clang, with
fast unaligned support and the gcc version of AV_WN macro disabled.
---
 libavutil/intreadwrite.h | 36 ++++++++++++++++++------------------
 1 file changed, 18 insertions(+), 18 deletions(-)

diff --git a/libavutil/intreadwrite.h b/libavutil/intreadwrite.h
index cdf1ef4..2307e77 100644
--- a/libavutil/intreadwrite.h
+++ b/libavutil/intreadwrite.h
@@ -272,15 +272,15 @@ union unaligned_16 { uint16_t l; } 
__attribute__((packed)) av_alias;
       (uint64_t)((const uint8_t*)(x))[7])
 #endif
 #ifndef AV_WB64
-#   define AV_WB64(p, d) do {                   \
-        ((uint8_t*)(p))[7] = (d);               \
-        ((uint8_t*)(p))[6] = (d)>>8;            \
-        ((uint8_t*)(p))[5] = (d)>>16;           \
-        ((uint8_t*)(p))[4] = (d)>>24;           \
-        ((uint8_t*)(p))[3] = (d)>>32;           \
-        ((uint8_t*)(p))[2] = (d)>>40;           \
-        ((uint8_t*)(p))[1] = (d)>>48;           \
-        ((uint8_t*)(p))[0] = (d)>>56;           \
+#   define AV_WB64(p, d) do {                           \
+        ((uint8_t*)(p))[7] = (d);                       \
+        ((uint8_t*)(p))[6] = (d)>>8;                    \
+        ((uint8_t*)(p))[5] = (d)>>16;                   \
+        ((uint8_t*)(p))[4] = (d)>>24;                   \
+        ((uint8_t*)(p))[3] = (uint64_t)(d)>>32;         \
+        ((uint8_t*)(p))[2] = (uint64_t)(d)>>40;         \
+        ((uint8_t*)(p))[1] = (uint64_t)(d)>>48;         \
+        ((uint8_t*)(p))[0] = (uint64_t)(d)>>56;         \
     } while(0)
 #endif
 
@@ -296,15 +296,15 @@ union unaligned_16 { uint16_t l; } 
__attribute__((packed)) av_alias;
       (uint64_t)((const uint8_t*)(x))[0])
 #endif
 #ifndef AV_WL64
-#   define AV_WL64(p, d) do {                   \
-        ((uint8_t*)(p))[0] = (d);               \
-        ((uint8_t*)(p))[1] = (d)>>8;            \
-        ((uint8_t*)(p))[2] = (d)>>16;           \
-        ((uint8_t*)(p))[3] = (d)>>24;           \
-        ((uint8_t*)(p))[4] = (d)>>32;           \
-        ((uint8_t*)(p))[5] = (d)>>40;           \
-        ((uint8_t*)(p))[6] = (d)>>48;           \
-        ((uint8_t*)(p))[7] = (d)>>56;           \
+#   define AV_WL64(p, d) do {                           \
+        ((uint8_t*)(p))[0] = (d);                       \
+        ((uint8_t*)(p))[1] = (d)>>8;                    \
+        ((uint8_t*)(p))[2] = (d)>>16;                   \
+        ((uint8_t*)(p))[3] = (d)>>24;                   \
+        ((uint8_t*)(p))[4] = (uint64_t)(d)>>32;         \
+        ((uint8_t*)(p))[5] = (uint64_t)(d)>>40;         \
+        ((uint8_t*)(p))[6] = (uint64_t)(d)>>48;         \
+        ((uint8_t*)(p))[7] = (uint64_t)(d)>>56;         \
     } while(0)
 #endif
 
-- 
2.7.4 (Apple Git-66)

_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to