summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJuergen Keil <jkeil@users.sourceforge.net>2001-07-16 09:22:38 +0000
committerJuergen Keil <jkeil@users.sourceforge.net>2001-07-16 09:22:38 +0000
commit3f59230c2cab7cf67846f00b8a1f7ab3e2a450c4 (patch)
tree2dd9c99da996b50cbc33d872b80a71ab1613f104 /src
parent56a18653a182f87f872e16ab883b70e3d71034df (diff)
downloadxine-lib-3f59230c2cab7cf67846f00b8a1f7ab3e2a450c4.tar.gz
xine-lib-3f59230c2cab7cf67846f00b8a1f7ab3e2a450c4.tar.bz2
Avoid accessing unaligned 32-bit values (does not work on SPARC)
CVS patchset: 286 CVS date: 2001/07/16 09:22:38
Diffstat (limited to 'src')
-rw-r--r--src/libac3/bitstream.c18
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);
}
//