diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/libac3/bitstream.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/src/libac3/bitstream.c b/src/libac3/bitstream.c index 7e9bd1f66..6e2e36497 100644 --- a/src/libac3/bitstream.c +++ b/src/libac3/bitstream.c @@ -22,6 +22,7 @@ */ #include <inttypes.h> +#include <stddef.h> #include <stdlib.h> #include <stdio.h> @@ -31,22 +32,31 @@ #define BUFFER_SIZE 4096 -static uint8_t *buffer_start; +struct uint32_alignment { + char a; + uint32_t b; +}; +#define UINT32_ALIGNMENT offsetof(struct uint32_alignment, b) + + +static uint32_t *buffer_start; uint32_t bits_left; uint32_t current_word; void bitstream_set_ptr (uint8_t * buf) { - buffer_start = buf; + int align = (long)buf & (UINT32_ALIGNMENT-1); + buffer_start = (uint32_t *) (buf - align); bits_left = 0; + if (align > 0) bitstream_get(align * 8); } static inline void bitstream_fill_current() { - current_word = *((uint32_t*)buffer_start)++; - current_word = swab32(current_word); + uint32_t tmp_word = *buffer_start++; + current_word = swab32(tmp_word); } // |