[Mplayer-cvslog] CVS: main/liba52 bitstream.h,1.5,1.6
Michael Niedermayer CVS
michael at mplayerhq.hu
Thu May 8 01:25:51 CEST 2003
Update of /cvsroot/mplayer/main/liba52
In directory mail:/var/tmp.root/cvs-serv19408
Modified Files:
bitstream.h
Log Message:
fixed alignment bug
Index: bitstream.h
===================================================================
RCS file: /cvsroot/mplayer/main/liba52/bitstream.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- bitstream.h 5 May 2003 01:22:21 -0000 1.5
+++ bitstream.h 7 May 2003 23:25:25 -0000 1.6
@@ -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;
More information about the MPlayer-cvslog
mailing list