diff options
author | Bartlomiej Wolowiec <bartek.wolowiec@gmail.com> | 2008-08-25 08:53:14 +0000 |
---|---|---|
committer | Bartlomiej Wolowiec <bartek.wolowiec@gmail.com> | 2008-08-25 08:53:14 +0000 |
commit | 85803144636a177a94005c8cb2e6f574a2988a23 (patch) | |
tree | 10d81668a3dd9c1dea43a19b49d44a8a7b47165d /libavcodec/bitstream.h | |
parent | 3fc45bdcf0031be526b5c1d66a9bbd386f816841 (diff) | |
download | ffmpeg-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.h | 26 |
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; |