summaryrefslogtreecommitdiff
path: root/libavcodec/bitstream.h
diff options
context:
space:
mode:
authorBartlomiej Wolowiec <bartek.wolowiec@gmail.com>2008-08-25 08:53:14 +0000
committerBartlomiej Wolowiec <bartek.wolowiec@gmail.com>2008-08-25 08:53:14 +0000
commit85803144636a177a94005c8cb2e6f574a2988a23 (patch)
tree10d81668a3dd9c1dea43a19b49d44a8a7b47165d /libavcodec/bitstream.h
parent3fc45bdcf0031be526b5c1d66a9bbd386f816841 (diff)
downloadffmpeg-85803144636a177a94005c8cb2e6f574a2988a23.tar.gz
Little-endian bitstream writer
Originally committed as revision 14965 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/bitstream.h')
-rw-r--r--libavcodec/bitstream.h26
1 files changed, 26 insertions, 0 deletions
diff --git a/libavcodec/bitstream.h b/libavcodec/bitstream.h
index f48f1ee944..ae89b5e77b 100644
--- a/libavcodec/bitstream.h
+++ b/libavcodec/bitstream.h
@@ -123,11 +123,18 @@ static inline void flush_put_bits(PutBitContext *s)
#ifdef ALT_BITSTREAM_WRITER
align_put_bits(s);
#else
+#ifndef BITSTREAM_WRITER_LE
s->bit_buf<<= s->bit_left;
+#endif
while (s->bit_left < 32) {
/* XXX: should test end of buffer */
+#ifdef BITSTREAM_WRITER_LE
+ *s->buf_ptr++=s->bit_buf;
+ s->bit_buf>>=8;
+#else
*s->buf_ptr++=s->bit_buf >> 24;
s->bit_buf<<=8;
+#endif
s->bit_left+=8;
}
s->bit_left=32;
@@ -190,6 +197,24 @@ static inline void put_bits(PutBitContext *s, int n, unsigned int value)
// printf("n=%d value=%x cnt=%d buf=%x\n", n, value, bit_cnt, bit_buf);
/* XXX: optimize */
+#ifdef BITSTREAM_WRITER_LE
+ bit_buf |= value << (32 - bit_left);
+ if (n >= bit_left) {
+#ifdef UNALIGNED_STORES_ARE_BAD
+ if (3 & (intptr_t) s->buf_ptr) {
+ s->buf_ptr[0] = bit_buf ;
+ s->buf_ptr[1] = bit_buf >> 8;
+ s->buf_ptr[2] = bit_buf >> 16;
+ s->buf_ptr[3] = bit_buf >> 24;
+ } else
+#endif
+ *(uint32_t *)s->buf_ptr = le2me_32(bit_buf);
+ s->buf_ptr+=4;
+ bit_buf = (bit_left==32)?0:value >> bit_left;
+ bit_left+=32;
+ }
+ bit_left-=n;
+#else
if (n < bit_left) {
bit_buf = (bit_buf<<n) | value;
bit_left-=n;
@@ -210,6 +235,7 @@ static inline void put_bits(PutBitContext *s, int n, unsigned int value)
bit_left+=32 - n;
bit_buf = value;
}
+#endif
s->bit_buf = bit_buf;
s->bit_left = bit_left;