summaryrefslogtreecommitdiff
path: root/src/libac3/bitstream.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/libac3/bitstream.h')
-rw-r--r--src/libac3/bitstream.h52
1 files changed, 37 insertions, 15 deletions
diff --git a/src/libac3/bitstream.h b/src/libac3/bitstream.h
index 392c7401c..84f3287c8 100644
--- a/src/libac3/bitstream.h
+++ b/src/libac3/bitstream.h
@@ -21,26 +21,48 @@
*
*/
+//My new and improved vego-matic endian swapping routine
+//(stolen from the kernel)
+#ifdef WORDS_BIGENDIAN
-#include <inttypes.h>
+# define swab32(x) (x)
-extern uint32_t ac3bits_left;
-extern uint64_t ac3current_word;
+#else
-void bitstream_init(uint8_t *start);
-inline uint32_t bitstream_get_bh(uint32_t num_bits);
+# if defined (__i386__)
-static inline uint32_t bitstream_get (uint32_t num_bits)
-{
- uint32_t result;
-
- if (num_bits < ac3bits_left) {
- result = (ac3current_word << (64 - ac3bits_left)) >> (64 - num_bits);
- ac3bits_left -= num_bits;
- return result;
+# define swab32(x) __i386_swab32(x)
+ static inline const uint32_t __i386_swab32(uint32_t x)
+ {
+ __asm__("bswap %0" : "=r" (x) : "0" (x));
+ return x;
}
- return bitstream_get_bh (num_bits);
-}
+# else
+
+# define swab32(x)\
+((((uint8_t*)&x)[0] << 24) | (((uint8_t*)&x)[1] << 16) | \
+ (((uint8_t*)&x)[2] << 8) | (((uint8_t*)&x)[3]))
+
+# endif
+#endif
+extern uint32_t bits_left;
+extern uint32_t current_word;
+void bitstream_set_ptr (uint8_t * buf);
+uint32_t bitstream_get_bh(uint32_t num_bits);
+
+static inline uint32_t
+bitstream_get(uint32_t num_bits)
+{
+ uint32_t result;
+
+ if(num_bits < bits_left) {
+ result = (current_word << (32 - bits_left)) >> (32 - num_bits);
+ bits_left -= num_bits;
+ return result;
+ }
+
+ return bitstream_get_bh(num_bits);
+}