# HG changeset patch # User mru # Date 1272552080 0 # Node ID 66b39cb91dde8f0bfea8d28e4b6ab24e755b94fc # Parent de7b577403bcf88e55601eac4bbfc1de5c97b088 bswap: add macros to byteswap constants The normal byteswap functions might use inline asm which is suboptimal with constants (and cannot be used in static initialisers), so special macros for constants only is needed. We should not rely on the gcc __builtin_constant_p() test since it is not always available. diff -r de7b577403bc -r 66b39cb91dde bswap.h --- a/bswap.h Wed Apr 28 20:08:02 2010 +0000 +++ b/bswap.h Thu Apr 29 14:41:20 2010 +0000 @@ -42,6 +42,12 @@ # include "x86/bswap.h" #endif +#define AV_BSWAP16C(x) (((x) << 8 & 0xff00) | ((x) >> 8 & 0x00ff)) +#define AV_BSWAP32C(x) (AV_BSWAP16C(x) << 16 | AV_BSWAP16C(x >> 16)) +#define AV_BSWAP64C(x) (AV_BSWAP32C(x) << 32 | AV_BSWAP32C(x >> 32)) + +#define AV_BSWAPC(s, x) AV_BSWAP##s##C(x) + #ifndef bswap_16 static av_always_inline av_const uint16_t bswap_16(uint16_t x) { @@ -89,6 +95,8 @@ #define le2me_16(x) bswap_16(x) #define le2me_32(x) bswap_32(x) #define le2me_64(x) bswap_64(x) +#define AV_BE2MEC(s, x) (x) +#define AV_LE2MEC(s, x) AV_BSWAPC(s, x) #else #define be2me_16(x) bswap_16(x) #define be2me_32(x) bswap_32(x) @@ -96,6 +104,15 @@ #define le2me_16(x) (x) #define le2me_32(x) (x) #define le2me_64(x) (x) +#define AV_BE2MEC(s, x) AV_BSWAPC(s, x) +#define AV_LE2MEC(s, x) (x) #endif +#define AV_BE2ME16C(x) AV_BE2MEC(16, x) +#define AV_BE2ME32C(x) AV_BE2MEC(32, x) +#define AV_BE2ME64C(x) AV_BE2MEC(64, x) +#define AV_LE2ME16C(x) AV_LE2MEC(16, x) +#define AV_LE2ME32C(x) AV_LE2MEC(32, x) +#define AV_LE2ME64C(x) AV_LE2MEC(64, x) + #endif /* AVUTIL_BSWAP_H */