Little-endian bitstream writer

Originally committed as revision 14965 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Bartlomiej Wolowiec 2008-08-25 08:53:14 +00:00
parent 3fc45bdcf0
commit 8580314463

View File

@ -123,11 +123,18 @@ static inline void flush_put_bits(PutBitContext *s)
#ifdef ALT_BITSTREAM_WRITER #ifdef ALT_BITSTREAM_WRITER
align_put_bits(s); align_put_bits(s);
#else #else
#ifndef BITSTREAM_WRITER_LE
s->bit_buf<<= s->bit_left; s->bit_buf<<= s->bit_left;
#endif
while (s->bit_left < 32) { while (s->bit_left < 32) {
/* XXX: should test end of buffer */ /* 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->buf_ptr++=s->bit_buf >> 24;
s->bit_buf<<=8; s->bit_buf<<=8;
#endif
s->bit_left+=8; s->bit_left+=8;
} }
s->bit_left=32; 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); // printf("n=%d value=%x cnt=%d buf=%x\n", n, value, bit_cnt, bit_buf);
/* XXX: optimize */ /* 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) { if (n < bit_left) {
bit_buf = (bit_buf<<n) | value; bit_buf = (bit_buf<<n) | value;
bit_left-=n; bit_left-=n;
@ -210,6 +235,7 @@ static inline void put_bits(PutBitContext *s, int n, unsigned int value)
bit_left+=32 - n; bit_left+=32 - n;
bit_buf = value; bit_buf = value;
} }
#endif
s->bit_buf = bit_buf; s->bit_buf = bit_buf;
s->bit_left = bit_left; s->bit_left = bit_left;