Mercurial > libavcodec.hg
diff common.h @ 238:99a9f903f0e3 libavcodec
optimized the normal bitstream writer, its faster than the alternative one on p3 now ... lets hope its at least not slower on p4 & k7
author | michaelni |
---|---|
date | Fri, 15 Feb 2002 00:14:01 +0000 |
parents | 41f0ef2cd942 |
children | 28c5c62b1c4c |
line wrap: on
line diff
--- a/common.h Wed Feb 13 15:26:28 2002 +0000 +++ b/common.h Fri Feb 15 00:14:01 2002 +0000 @@ -168,10 +168,8 @@ int index; #else UINT32 bit_buf; - int bit_cnt; + int bit_left; UINT8 *buf, *buf_ptr, *buf_end; - void *opaque; - WriteDataFunc write_data; #endif INT64 data_out_size; /* in bytes */ } PutBitContext; @@ -181,18 +179,11 @@ void *opaque, void (*write_data)(void *, UINT8 *, int)); -#ifndef ALT_BITSTREAM_WRITER -void put_bits(PutBitContext *s, int n, unsigned int value); -#endif - INT64 get_bit_count(PutBitContext *s); /* XXX: change function name */ void align_put_bits(PutBitContext *s); void flush_put_bits(PutBitContext *s); /* jpeg specific put_bits */ -#ifndef ALT_BITSTREAM_WRITER -void jput_bits(PutBitContext *s, int n, unsigned int value); -#endif void jflush_put_bits(PutBitContext *s); /* bit input */ @@ -238,6 +229,42 @@ #endif #endif //!ARCH_X86 +#ifndef ALT_BITSTREAM_WRITER +static inline void put_bits(PutBitContext *s, int n, unsigned int value) +{ + unsigned int bit_buf; + int bit_left; + +#ifdef STATS + st_out_bit_counts[st_current_index] += n; +#endif + // printf("put_bits=%d %x\n", n, value); + assert(n == 32 || value < (1U << n)); + + bit_buf = s->bit_buf; + bit_left = s->bit_left; + + // 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; + bit_left-=n; + } else { + bit_buf<<=bit_left; + bit_buf |= value >> (n - bit_left); + *(UINT32 *)s->buf_ptr = be2me_32(bit_buf); + //printf("bitbuf = %08x\n", bit_buf); + s->buf_ptr+=4; + bit_left+=32 - n; + bit_buf = value; + } + + s->bit_buf = bit_buf; + s->bit_left = bit_left; +} +#endif + + #ifdef ALT_BITSTREAM_WRITER static inline void put_bits(PutBitContext *s, int n, unsigned int value) { @@ -304,6 +331,45 @@ } #endif +#ifndef ALT_BITSTREAM_WRITER +/* for jpeg : escape 0xff with 0x00 after it */ +static inline void jput_bits(PutBitContext *s, int n, unsigned int value) +{ + unsigned int bit_buf, b; + int bit_left, i; + + assert(n == 32 || value < (1U << n)); + + bit_buf = s->bit_buf; + bit_left = s->bit_left; + + //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; + bit_left-=n; + } else { + bit_buf<<=bit_left; + bit_buf |= value >> (n - bit_left); + /* handle escape */ + for(i=0;i<4;i++) { + b = (bit_buf >> 24); + *(s->buf_ptr++) = b; + if (b == 0xff) + *(s->buf_ptr++) = 0; + bit_buf <<= 8; + } + + bit_left+= 32 - n; + bit_buf = value; + } + + s->bit_buf = bit_buf; + s->bit_left = bit_left; +} +#endif + + #ifdef ALT_BITSTREAM_WRITER static inline void jput_bits(PutBitContext *s, int n, int value) {