Mercurial > libavcodec.hg
changeset 7690:9445f9c69004 libavcodec
Little-endian bitstream writer
author | bwolowiec |
---|---|
date | Mon, 25 Aug 2008 08:53:14 +0000 |
parents | 3c57663cdafd |
children | 8313d5901c5c |
files | bitstream.h |
diffstat | 1 files changed, 26 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/bitstream.h Mon Aug 25 06:28:52 2008 +0000 +++ b/bitstream.h Mon Aug 25 08:53:14 2008 +0000 @@ -123,11 +123,18 @@ #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 @@ // 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 @@ bit_left+=32 - n; bit_buf = value; } +#endif s->bit_buf = bit_buf; s->bit_left = bit_left;