]> git.sesse.net Git - ffmpeg/blobdiff - libavutil/intreadwrite.h
mkvdec: Avoid divide-by-zero crash on invalid real audio tracks
[ffmpeg] / libavutil / intreadwrite.h
index ee597937b9bbe456bde6a6d5df3fcabf834c6ca9..933732c365c130dcc29ec1b91e24712a06330693 100644 (file)
 
 /*
  * Arch-specific headers can provide any combination of
- * AV_[RW][BLN](16|32|64) macros.  Preprocessor symbols must be
+ * AV_[RW][BLN](16|24|32|64) macros.  Preprocessor symbols must be
  * defined, even if these are implemented as inline functions.
  */
 
 #if   ARCH_ARM
 #   include "arm/intreadwrite.h"
+#elif ARCH_AVR32
+#   include "avr32/intreadwrite.h"
 #elif ARCH_MIPS
 #   include "mips/intreadwrite.h"
 #elif ARCH_PPC
 #   include "ppc/intreadwrite.h"
 #endif
 
+/*
+ * Map AV_RNXX <-> AV_R[BL]XX for all variants provided by per-arch headers.
+ */
+
+#if HAVE_BIGENDIAN
+
+#   if    defined(AV_RN16) && !defined(AV_RB16)
+#       define AV_RB16(p) AV_RN16(p)
+#   elif !defined(AV_RN16) &&  defined(AV_RB16)
+#       define AV_RN16(p) AV_RB16(p)
+#   endif
+
+#   if    defined(AV_WN16) && !defined(AV_WB16)
+#       define AV_WB16(p, v) AV_WN16(p, v)
+#   elif !defined(AV_WN16) &&  defined(AV_WB16)
+#       define AV_WN16(p, v) AV_WB16(p, v)
+#   endif
+
+#   if    defined(AV_RN24) && !defined(AV_RB24)
+#       define AV_RB24(p) AV_RN24(p)
+#   elif !defined(AV_RN24) &&  defined(AV_RB24)
+#       define AV_RN24(p) AV_RB24(p)
+#   endif
+
+#   if    defined(AV_WN24) && !defined(AV_WB24)
+#       define AV_WB24(p, v) AV_WN24(p, v)
+#   elif !defined(AV_WN24) &&  defined(AV_WB24)
+#       define AV_WN24(p, v) AV_WB24(p, v)
+#   endif
+
+#   if    defined(AV_RN32) && !defined(AV_RB32)
+#       define AV_RB32(p) AV_RN32(p)
+#   elif !defined(AV_RN32) &&  defined(AV_RB32)
+#       define AV_RN32(p) AV_RB32(p)
+#   endif
+
+#   if    defined(AV_WN32) && !defined(AV_WB32)
+#       define AV_WB32(p, v) AV_WN32(p, v)
+#   elif !defined(AV_WN32) &&  defined(AV_WB32)
+#       define AV_WN32(p, v) AV_WB32(p, v)
+#   endif
+
+#   if    defined(AV_RN64) && !defined(AV_RB64)
+#       define AV_RB64(p) AV_RN64(p)
+#   elif !defined(AV_RN64) &&  defined(AV_RB64)
+#       define AV_RN64(p) AV_RB64(p)
+#   endif
+
+#   if    defined(AV_WN64) && !defined(AV_WB64)
+#       define AV_WB64(p, v) AV_WN64(p, v)
+#   elif !defined(AV_WN64) &&  defined(AV_WB64)
+#       define AV_WN64(p, v) AV_WB64(p, v)
+#   endif
+
+#else /* HAVE_BIGENDIAN */
+
+#   if    defined(AV_RN16) && !defined(AV_RL16)
+#       define AV_RL16(p) AV_RN16(p)
+#   elif !defined(AV_RN16) &&  defined(AV_RL16)
+#       define AV_RN16(p) AV_RL16(p)
+#   endif
+
+#   if    defined(AV_WN16) && !defined(AV_WL16)
+#       define AV_WL16(p, v) AV_WN16(p, v)
+#   elif !defined(AV_WN16) &&  defined(AV_WL16)
+#       define AV_WN16(p, v) AV_WL16(p, v)
+#   endif
+
+#   if    defined(AV_RN24) && !defined(AV_RL24)
+#       define AV_RL24(p) AV_RN24(p)
+#   elif !defined(AV_RN24) &&  defined(AV_RL24)
+#       define AV_RN24(p) AV_RL24(p)
+#   endif
+
+#   if    defined(AV_WN24) && !defined(AV_WL24)
+#       define AV_WL24(p, v) AV_WN24(p, v)
+#   elif !defined(AV_WN24) &&  defined(AV_WL24)
+#       define AV_WN24(p, v) AV_WL24(p, v)
+#   endif
+
+#   if    defined(AV_RN32) && !defined(AV_RL32)
+#       define AV_RL32(p) AV_RN32(p)
+#   elif !defined(AV_RN32) &&  defined(AV_RL32)
+#       define AV_RN32(p) AV_RL32(p)
+#   endif
+
+#   if    defined(AV_WN32) && !defined(AV_WL32)
+#       define AV_WL32(p, v) AV_WN32(p, v)
+#   elif !defined(AV_WN32) &&  defined(AV_WL32)
+#       define AV_WN32(p, v) AV_WL32(p, v)
+#   endif
+
+#   if    defined(AV_RN64) && !defined(AV_RL64)
+#       define AV_RL64(p) AV_RN64(p)
+#   elif !defined(AV_RN64) &&  defined(AV_RL64)
+#       define AV_RN64(p) AV_RL64(p)
+#   endif
+
+#   if    defined(AV_WN64) && !defined(AV_WL64)
+#       define AV_WL64(p, v) AV_WN64(p, v)
+#   elif !defined(AV_WN64) &&  defined(AV_WL64)
+#       define AV_WN64(p, v) AV_WL64(p, v)
+#   endif
+
+#endif /* !HAVE_BIGENDIAN */
+
 /*
  * Define AV_[RW]N helper macros to simplify definitions not provided
  * by per-arch headers.
  */
 
-#if   defined(__GNUC__)
+#if   HAVE_ATTRIBUTE_PACKED
 
 struct unaligned_64 { uint64_t l; } __attribute__((packed));
 struct unaligned_32 { uint32_t l; } __attribute__((packed));
@@ -64,98 +172,110 @@ struct unaligned_16 { uint16_t l; } __attribute__((packed));
 #else
 
 #ifndef AV_RB16
-#define AV_RB16(x)  ((((const uint8_t*)(x))[0] << 8) | \
-                      ((const uint8_t*)(x))[1])
+#   define AV_RB16(x)                           \
+    ((((const uint8_t*)(x))[0] << 8) |          \
+      ((const uint8_t*)(x))[1])
 #endif
 #ifndef AV_WB16
-#define AV_WB16(p, d) do { \
-                    ((uint8_t*)(p))[1] = (d); \
-                    ((uint8_t*)(p))[0] = (d)>>8; } while(0)
+#   define AV_WB16(p, d) do {                   \
+        ((uint8_t*)(p))[1] = (d);               \
+        ((uint8_t*)(p))[0] = (d)>>8;            \
+    } while(0)
 #endif
 
 #ifndef AV_RL16
-#define AV_RL16(x)  ((((const uint8_t*)(x))[1] << 8) | \
-                      ((const uint8_t*)(x))[0])
+#   define AV_RL16(x)                           \
+    ((((const uint8_t*)(x))[1] << 8) |          \
+      ((const uint8_t*)(x))[0])
 #endif
 #ifndef AV_WL16
-#define AV_WL16(p, d) do { \
-                    ((uint8_t*)(p))[0] = (d); \
-                    ((uint8_t*)(p))[1] = (d)>>8; } while(0)
+#   define AV_WL16(p, d) do {                   \
+        ((uint8_t*)(p))[0] = (d);               \
+        ((uint8_t*)(p))[1] = (d)>>8;            \
+    } while(0)
 #endif
 
 #ifndef AV_RB32
-#define AV_RB32(x)  ((((const uint8_t*)(x))[0] << 24) | \
-                     (((const uint8_t*)(x))[1] << 16) | \
-                     (((const uint8_t*)(x))[2] <<  8) | \
-                      ((const uint8_t*)(x))[3])
+#   define AV_RB32(x)                           \
+    ((((const uint8_t*)(x))[0] << 24) |         \
+     (((const uint8_t*)(x))[1] << 16) |         \
+     (((const uint8_t*)(x))[2] <<  8) |         \
+      ((const uint8_t*)(x))[3])
 #endif
 #ifndef AV_WB32
-#define AV_WB32(p, d) do { \
-                    ((uint8_t*)(p))[3] = (d); \
-                    ((uint8_t*)(p))[2] = (d)>>8; \
-                    ((uint8_t*)(p))[1] = (d)>>16; \
-                    ((uint8_t*)(p))[0] = (d)>>24; } while(0)
+#   define AV_WB32(p, d) do {                   \
+        ((uint8_t*)(p))[3] = (d);               \
+        ((uint8_t*)(p))[2] = (d)>>8;            \
+        ((uint8_t*)(p))[1] = (d)>>16;           \
+        ((uint8_t*)(p))[0] = (d)>>24;           \
+    } while(0)
 #endif
 
 #ifndef AV_RL32
-#define AV_RL32(x) ((((const uint8_t*)(x))[3] << 24) | \
-                    (((const uint8_t*)(x))[2] << 16) | \
-                    (((const uint8_t*)(x))[1] <<  8) | \
-                     ((const uint8_t*)(x))[0])
+#   define AV_RL32(x)                           \
+    ((((const uint8_t*)(x))[3] << 24) |         \
+     (((const uint8_t*)(x))[2] << 16) |         \
+     (((const uint8_t*)(x))[1] <<  8) |         \
+      ((const uint8_t*)(x))[0])
 #endif
 #ifndef AV_WL32
-#define AV_WL32(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; } while(0)
+#   define AV_WL32(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;           \
+    } while(0)
 #endif
 
 #ifndef AV_RB64
-#define AV_RB64(x)  (((uint64_t)((const uint8_t*)(x))[0] << 56) | \
-                     ((uint64_t)((const uint8_t*)(x))[1] << 48) | \
-                     ((uint64_t)((const uint8_t*)(x))[2] << 40) | \
-                     ((uint64_t)((const uint8_t*)(x))[3] << 32) | \
-                     ((uint64_t)((const uint8_t*)(x))[4] << 24) | \
-                     ((uint64_t)((const uint8_t*)(x))[5] << 16) | \
-                     ((uint64_t)((const uint8_t*)(x))[6] <<  8) | \
-                      (uint64_t)((const uint8_t*)(x))[7])
+#   define AV_RB64(x)                                   \
+    (((uint64_t)((const uint8_t*)(x))[0] << 56) |       \
+     ((uint64_t)((const uint8_t*)(x))[1] << 48) |       \
+     ((uint64_t)((const uint8_t*)(x))[2] << 40) |       \
+     ((uint64_t)((const uint8_t*)(x))[3] << 32) |       \
+     ((uint64_t)((const uint8_t*)(x))[4] << 24) |       \
+     ((uint64_t)((const uint8_t*)(x))[5] << 16) |       \
+     ((uint64_t)((const uint8_t*)(x))[6] <<  8) |       \
+      (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; } while(0)
+#   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;           \
+    } while(0)
 #endif
 
 #ifndef AV_RL64
-#define AV_RL64(x)  (((uint64_t)((const uint8_t*)(x))[7] << 56) | \
-                     ((uint64_t)((const uint8_t*)(x))[6] << 48) | \
-                     ((uint64_t)((const uint8_t*)(x))[5] << 40) | \
-                     ((uint64_t)((const uint8_t*)(x))[4] << 32) | \
-                     ((uint64_t)((const uint8_t*)(x))[3] << 24) | \
-                     ((uint64_t)((const uint8_t*)(x))[2] << 16) | \
-                     ((uint64_t)((const uint8_t*)(x))[1] <<  8) | \
-                      (uint64_t)((const uint8_t*)(x))[0])
+#   define AV_RL64(x)                                   \
+    (((uint64_t)((const uint8_t*)(x))[7] << 56) |       \
+     ((uint64_t)((const uint8_t*)(x))[6] << 48) |       \
+     ((uint64_t)((const uint8_t*)(x))[5] << 40) |       \
+     ((uint64_t)((const uint8_t*)(x))[4] << 32) |       \
+     ((uint64_t)((const uint8_t*)(x))[3] << 24) |       \
+     ((uint64_t)((const uint8_t*)(x))[2] << 16) |       \
+     ((uint64_t)((const uint8_t*)(x))[1] <<  8) |       \
+      (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; } while(0)
-#endif
-
-#ifdef WORDS_BIGENDIAN
+#   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;           \
+    } while(0)
+#endif
+
+#if HAVE_BIGENDIAN
 #   define AV_RN(s, p)    AV_RB##s(p)
 #   define AV_WN(s, p, v) AV_WB##s(p, v)
 #else
@@ -189,16 +309,16 @@ struct unaligned_16 { uint16_t l; } __attribute__((packed));
 #   define AV_WN64(p, v) AV_WN(64, p, v)
 #endif
 
-#ifdef WORDS_BIGENDIAN
-#   define AV_RB(s, p)    AV_RN(s, p)
-#   define AV_WB(s, p, v) AV_WN(s, p, v)
-#   define AV_RL(s, p)    bswap_##s(AV_RN(s, p))
-#   define AV_WL(s, p, v) AV_WN(s, p, bswap_##s(v))
+#if HAVE_BIGENDIAN
+#   define AV_RB(s, p)    AV_RN##s(p)
+#   define AV_WB(s, p, v) AV_WN##s(p, v)
+#   define AV_RL(s, p)    bswap_##s(AV_RN##s(p))
+#   define AV_WL(s, p, v) AV_WN##s(p, bswap_##s(v))
 #else
-#   define AV_RB(s, p)    bswap_##s(AV_RN(s, p))
-#   define AV_WB(s, p, v) AV_WN(s, p, bswap_##s(v))
-#   define AV_RL(s, p)    AV_RN(s, p)
-#   define AV_WL(s, p, v) AV_WN(s, p, v)
+#   define AV_RB(s, p)    bswap_##s(AV_RN##s(p))
+#   define AV_WB(s, p, v) AV_WN##s(p, bswap_##s(v))
+#   define AV_RL(s, p)    AV_RN##s(p)
+#   define AV_WL(s, p, v) AV_WN##s(p, v)
 #endif
 
 #define AV_RB8(x)     (((const uint8_t*)(x))[0])
@@ -249,20 +369,32 @@ struct unaligned_16 { uint16_t l; } __attribute__((packed));
 #   define AV_WL64(p, v) AV_WL(64, p, v)
 #endif
 
-#define AV_RB24(x)  ((((const uint8_t*)(x))[0] << 16) | \
-                     (((const uint8_t*)(x))[1] <<  8) | \
-                      ((const uint8_t*)(x))[2])
-#define AV_WB24(p, d) do { \
-                    ((uint8_t*)(p))[2] = (d); \
-                    ((uint8_t*)(p))[1] = (d)>>8; \
-                    ((uint8_t*)(p))[0] = (d)>>16; } while(0)
-
-#define AV_RL24(x)  ((((const uint8_t*)(x))[2] << 16) | \
-                     (((const uint8_t*)(x))[1] <<  8) | \
-                      ((const uint8_t*)(x))[0])
-#define AV_WL24(p, d) do { \
-                    ((uint8_t*)(p))[0] = (d); \
-                    ((uint8_t*)(p))[1] = (d)>>8; \
-                    ((uint8_t*)(p))[2] = (d)>>16; } while(0)
+#ifndef AV_RB24
+#   define AV_RB24(x)                           \
+    ((((const uint8_t*)(x))[0] << 16) |         \
+     (((const uint8_t*)(x))[1] <<  8) |         \
+      ((const uint8_t*)(x))[2])
+#endif
+#ifndef AV_WB24
+#   define AV_WB24(p, d) do {                   \
+        ((uint8_t*)(p))[2] = (d);               \
+        ((uint8_t*)(p))[1] = (d)>>8;            \
+        ((uint8_t*)(p))[0] = (d)>>16;           \
+    } while(0)
+#endif
+
+#ifndef AV_RL24
+#   define AV_RL24(x)                           \
+    ((((const uint8_t*)(x))[2] << 16) |         \
+     (((const uint8_t*)(x))[1] <<  8) |         \
+      ((const uint8_t*)(x))[0])
+#endif
+#ifndef AV_WL24
+#   define AV_WL24(p, d) do {                   \
+        ((uint8_t*)(p))[0] = (d);               \
+        ((uint8_t*)(p))[1] = (d)>>8;            \
+        ((uint8_t*)(p))[2] = (d)>>16;           \
+    } while(0)
+#endif
 
 #endif /* AVUTIL_INTREADWRITE_H */