diff options
author | Reimar Döffinger <Reimar.Doeffinger@gmx.de> | 2009-10-01 15:40:29 +0000 |
---|---|---|
committer | Reimar Döffinger <Reimar.Doeffinger@gmx.de> | 2009-10-01 15:40:29 +0000 |
commit | 43d7c6118d64a8b2772e2d9e0c13413968e776f1 (patch) | |
tree | f5e7d4b37da6f22275c2cad19b404ee0e5dba362 /libavcodec/put_bits.h | |
parent | ec656755044d29e8f0b0a50ad1c9fd297bcae484 (diff) | |
download | ffmpeg-43d7c6118d64a8b2772e2d9e0c13413968e776f1.tar.gz |
put_bits can only reliably write up to 31 bit bits, above it relies on
undefined shift behaviour.
Document this, fix the assert and add a put_bits32 to handle writing 32
bits and use that where necessary.
Originally committed as revision 20124 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/put_bits.h')
-rw-r--r-- | libavcodec/put_bits.h | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/libavcodec/put_bits.h b/libavcodec/put_bits.h index 4b4b3a873a..b081c26842 100644 --- a/libavcodec/put_bits.h +++ b/libavcodec/put_bits.h @@ -136,6 +136,10 @@ void ff_put_string(PutBitContext * pbc, const char *s, int terminate_string); */ void ff_copy_bits(PutBitContext *pb, const uint8_t *src, int length); +/** + * Write up to 31 bits into a bitstream. + * Use put_bits32 to write 32 bits. + */ static inline void put_bits(PutBitContext *s, int n, unsigned int value) #ifndef ALT_BITSTREAM_WRITER { @@ -143,7 +147,7 @@ static inline void put_bits(PutBitContext *s, int n, unsigned int value) int bit_left; // printf("put_bits=%d %x\n", n, value); - assert(n == 32 || value < (1U << n)); + assert(n <= 31 && value < (1U << n)); bit_buf = s->bit_buf; bit_left = s->bit_left; @@ -260,6 +264,22 @@ static inline void put_sbits(PutBitContext *pb, int bits, int32_t val) } /** + * Write exactly 32 bits into a bitstream + */ +static void av_unused put_bits32(PutBitContext *s, uint32_t value) +{ + int lo = value & 0xffff; + int hi = value >> 16; +#ifdef ALT_BITSTREAM_WRITER_LE + put_bits(s, 16, lo); + put_bits(s, 16, hi); +#else + put_bits(s, 16, hi); + put_bits(s, 16, lo); +#endif +} + +/** * Returns the pointer to the byte where the bitstream writer will put * the next bit. */ |