summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJuergen Keil <jkeil@users.sourceforge.net>2003-08-19 16:38:19 +0000
committerJuergen Keil <jkeil@users.sourceforge.net>2003-08-19 16:38:19 +0000
commit6f0985e32284cbec07202f6ac91c23ff0bbe48cd (patch)
tree7b3fdfd113e2111588cd1db007269f48a31d7d79
parentdfcde6cb6f14757fc012936621a7eebf0e492566 (diff)
downloadxine-lib-6f0985e32284cbec07202f6ac91c23ff0bbe48cd.tar.gz
xine-lib-6f0985e32284cbec07202f6ac91c23ff0bbe48cd.tar.bz2
GCC 3.3 on SPARC produces illegal code for 32-bit types, shifted by 32 bits.
See gcc bug 11965 (<URL:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=11965>) Add a workaround, so that xine-lib can be compiled with gcc-3.3 on SPARC. CVS patchset: 5298 CVS date: 2003/08/19 16:38:19
-rw-r--r--src/libffmpeg/libavcodec/common.h15
1 files changed, 12 insertions, 3 deletions
diff --git a/src/libffmpeg/libavcodec/common.h b/src/libffmpeg/libavcodec/common.h
index 3c65c44d6..5cbda9126 100644
--- a/src/libffmpeg/libavcodec/common.h
+++ b/src/libffmpeg/libavcodec/common.h
@@ -350,14 +350,23 @@ static inline void put_bits(PutBitContext *s, int n, unsigned int value)
bit_buf = s->bit_buf;
bit_left = s->bit_left;
+ assert(bit_left >= 0 && bit_left <= 32);
+
// printf("n=%d value=%x cnt=%d buf=%x\n", n, value, bit_cnt, bit_buf);
/* XXX: optimize */
if (n < bit_left) {
- bit_buf = (bit_buf<<n) | value;
+ if (n == 32)
+ bit_buf = value;
+ else
+ bit_buf = (bit_buf<<n) | value;
bit_left-=n;
} else {
- bit_buf<<=bit_left;
- bit_buf |= value >> (n - bit_left);
+ if (bit_left == 32)
+ bit_buf=0;
+ else
+ bit_buf<<=bit_left;
+ if (n - bit_left < 32)
+ bit_buf |= value >> (n - bit_left);
#ifdef UNALIGNED_STORES_ARE_BAD
if (3 & (int) s->buf_ptr) {
s->buf_ptr[0] = bit_buf >> 24;