Mercurial > mplayer.hg
changeset 10082:1c95e3d5888a
fixed alignment bug
author | michael |
---|---|
date | Wed, 07 May 2003 23:25:25 +0000 |
parents | 0181d5fc8474 |
children | 6d46331e2d57 |
files | liba52/bitstream.h |
diffstat | 1 files changed, 26 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/liba52/bitstream.h Tue May 06 20:40:24 2003 +0000 +++ b/liba52/bitstream.h Wed May 07 23:25:25 2003 +0000 @@ -30,6 +30,30 @@ #else // alternative (faster) bitstram reader (reades upto 3 bytes over the end of the input) #define ALT_BITSTREAM_READER + +/* used to avoid missaligned exceptions on some archs (alpha, ...) */ +#ifdef ARCH_X86 +# define unaligned32(a) (*(uint32_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; +} +# elif defined(__DECC) +static inline uint32_t unaligned32(const void *v) { + return *(const __unaligned uint32_t *) v; +} +# else +static inline uint32_t unaligned32(const void *v) { + return *(const uint32_t *) v; +} +# endif +#endif //!ARCH_X86 + #endif /* (stolen from the kernel) */ @@ -74,7 +98,7 @@ bitstream_get(uint32_t num_bits) // note num_bits is practically a constant due to inlineing { #ifdef ALT_BITSTREAM_READER - uint32_t result= swab32( *(uint32_t *)(((uint8_t *)buffer_start)+(indx>>3)) ); + uint32_t result= swab32( unaligned32(((uint8_t *)buffer_start)+(indx>>3)) ); result<<= (indx&0x07); result>>= 32 - num_bits; @@ -107,7 +131,7 @@ bitstream_get_2(uint32_t num_bits) { #ifdef ALT_BITSTREAM_READER - int32_t result= swab32( *(uint32_t *)(((uint8_t *)buffer_start)+(indx>>3)) ); + int32_t result= swab32( unaligned32(((uint8_t *)buffer_start)+(indx>>3)) ); result<<= (indx&0x07); result>>= 32 - num_bits;