add unaligned16() and unaligned64()

Originally committed as revision 5366 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Måns Rullgård 2006-05-11 23:17:23 +00:00
parent e1203ac098
commit b8d10977f4
1 changed files with 19 additions and 10 deletions

View File

@ -141,25 +141,34 @@ typedef struct RL_VLC_ELEM {
/* used to avoid missaligned exceptions on some archs (alpha, ...) */
#if defined(ARCH_X86) || defined(ARCH_X86_64)
# define unaligned16(a) (*(const uint16_t*)(a))
# define unaligned32(a) (*(const uint32_t*)(a))
# define unaligned64(a) (*(const uint64_t*)(a))
#else
# ifdef __GNUC__
static inline uint32_t unaligned32(const void *v) {
struct Unaligned {
uint32_t i;
} __attribute__((packed));
return ((const struct Unaligned *) v)->i;
# define unaligned(x) \
static inline uint##x##_t unaligned##x(const void *v) { \
struct Unaligned { \
uint##x##_t i; \
} __attribute__((packed)); \
\
return ((const struct Unaligned *) v)->i; \
}
# elif defined(__DECC)
static inline uint32_t unaligned32(const void *v) {
return *(const __unaligned uint32_t *) v;
# define unaligned(x) \
static inline uint##x##_t unaligned##x##(const void *v) { \
return *(const __unaligned uint##x##_t *) v; \
}
# else
static inline uint32_t unaligned32(const void *v) {
return *(const uint32_t *) v;
# define unaligned(x) \
static inline uint##x##_t unaligned##x##(const void *v) { \
return *(const uint##x##_t *) v; \
}
# endif
unaligned(16)
unaligned(32)
unaligned(64)
#undef unaligned
#endif //!ARCH_X86
#ifndef ALT_BITSTREAM_WRITER