Mercurial > libavcodec.hg
comparison put_bits.h @ 10344:2b8a327189cd libavcodec
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.
author | reimar |
---|---|
date | Thu, 01 Oct 2009 15:40:29 +0000 |
parents | 2887f410011f |
children | 784409693f16 |
comparison
equal
deleted
inserted
replaced
10343:b1218e0b0f2b | 10344:2b8a327189cd |
---|---|
134 * | 134 * |
135 * @param length the number of bits of src to copy | 135 * @param length the number of bits of src to copy |
136 */ | 136 */ |
137 void ff_copy_bits(PutBitContext *pb, const uint8_t *src, int length); | 137 void ff_copy_bits(PutBitContext *pb, const uint8_t *src, int length); |
138 | 138 |
139 /** | |
140 * Write up to 31 bits into a bitstream. | |
141 * Use put_bits32 to write 32 bits. | |
142 */ | |
139 static inline void put_bits(PutBitContext *s, int n, unsigned int value) | 143 static inline void put_bits(PutBitContext *s, int n, unsigned int value) |
140 #ifndef ALT_BITSTREAM_WRITER | 144 #ifndef ALT_BITSTREAM_WRITER |
141 { | 145 { |
142 unsigned int bit_buf; | 146 unsigned int bit_buf; |
143 int bit_left; | 147 int bit_left; |
144 | 148 |
145 // printf("put_bits=%d %x\n", n, value); | 149 // printf("put_bits=%d %x\n", n, value); |
146 assert(n == 32 || value < (1U << n)); | 150 assert(n <= 31 && value < (1U << n)); |
147 | 151 |
148 bit_buf = s->bit_buf; | 152 bit_buf = s->bit_buf; |
149 bit_left = s->bit_left; | 153 bit_left = s->bit_left; |
150 | 154 |
151 // printf("n=%d value=%x cnt=%d buf=%x\n", n, value, bit_cnt, bit_buf); | 155 // printf("n=%d value=%x cnt=%d buf=%x\n", n, value, bit_cnt, bit_buf); |
258 | 262 |
259 put_bits(pb, bits, val & ((1<<bits)-1)); | 263 put_bits(pb, bits, val & ((1<<bits)-1)); |
260 } | 264 } |
261 | 265 |
262 /** | 266 /** |
267 * Write exactly 32 bits into a bitstream | |
268 */ | |
269 static void av_unused put_bits32(PutBitContext *s, uint32_t value) | |
270 { | |
271 int lo = value & 0xffff; | |
272 int hi = value >> 16; | |
273 #ifdef ALT_BITSTREAM_WRITER_LE | |
274 put_bits(s, 16, lo); | |
275 put_bits(s, 16, hi); | |
276 #else | |
277 put_bits(s, 16, hi); | |
278 put_bits(s, 16, lo); | |
279 #endif | |
280 } | |
281 | |
282 /** | |
263 * Returns the pointer to the byte where the bitstream writer will put | 283 * Returns the pointer to the byte where the bitstream writer will put |
264 * the next bit. | 284 * the next bit. |
265 */ | 285 */ |
266 static inline uint8_t* put_bits_ptr(PutBitContext *s) | 286 static inline uint8_t* put_bits_ptr(PutBitContext *s) |
267 { | 287 { |