aboutsummaryrefslogtreecommitdiffhomepage
path: root/liba52
diff options
context:
space:
mode:
authorGravatar michael <michael@b3059339-0415-0410-9bf9-f77b7e298cf2>2003-05-07 23:25:25 +0000
committerGravatar michael <michael@b3059339-0415-0410-9bf9-f77b7e298cf2>2003-05-07 23:25:25 +0000
commit9109cc8d20a18fef2304808c5600c62a6414b1c4 (patch)
tree7fb953b875fb288690e873fd63fcc05a96ff7cd5 /liba52
parent3f5313a9e542d60fae69775b29cdf4929cbf7f40 (diff)
fixed alignment bug
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@10083 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'liba52')
-rw-r--r--liba52/bitstream.h28
1 files changed, 26 insertions, 2 deletions
diff --git a/liba52/bitstream.h b/liba52/bitstream.h
index e59e4e9dcd..a62fbbf09e 100644
--- a/liba52/bitstream.h
+++ b/liba52/bitstream.h
@@ -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 @@ static inline uint32_t
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 @@ static inline int32_t
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;