31 #include "config-adpcm.h"
32 #include "intreadwrite.h"
35 namespace adpcm_ffmpeg {
40 typedef uint64_t BitBuf;
41 #define AV_WBBUF AV_WB64
42 #define AV_WLBUF AV_WL64
44 typedef uint32_t BitBuf;
45 #define AV_WBBUF AV_WB32
46 #define AV_WLBUF AV_WL32
49 static const int BUF_BITS = 8 *
sizeof(BitBuf);
54 uint8_t *buf, *buf_ptr, *buf_end;
63 static inline void init_put_bits(
PutBitContext *s, uint8_t *buffer,
66 if (buffer_size < 0) {
72 s->buf_end = s->buf + buffer_size;
74 s->bit_left = BUF_BITS;
81 static inline int put_bits_count(PutBitContext *s)
83 return (s->buf_ptr - s->buf) * 8 + BUF_BITS - s->bit_left;
90 static inline int put_bytes_output(
const PutBitContext *s)
92 av_assert(s->bit_left == BUF_BITS);
93 return s->buf_ptr - s->buf;
101 static inline int put_bytes_count(
const PutBitContext *s,
int round_up)
103 return s->buf_ptr - s->buf + ((BUF_BITS - s->bit_left + (round_up ? 7 : 0)) >> 3);
113 static inline void rebase_put_bits(PutBitContext *s, uint8_t *buffer,
116 av_assert(8*buffer_size >= put_bits_count(s));
118 s->buf_end = buffer + buffer_size;
119 s->buf_ptr = buffer + (s->buf_ptr - s->buf);
126 static inline int put_bits_left(PutBitContext* s)
128 return (s->buf_end - s->buf_ptr) * 8 - BUF_BITS + s->bit_left;
136 static inline int put_bytes_left(
const PutBitContext *s,
int round_up)
138 return s->buf_end - s->buf_ptr - ((BUF_BITS - s->bit_left + (round_up ? 7 : 0)) >> 3);
144 static inline void flush_put_bits(PutBitContext *s)
146 #ifndef BITSTREAM_WRITER_LE
147 if (s->bit_left < BUF_BITS)
148 s->bit_buf <<= s->bit_left;
150 while (s->bit_left < BUF_BITS) {
151 av_assert(s->buf_ptr < s->buf_end);
152 #ifdef BITSTREAM_WRITER_LE
153 *s->buf_ptr++ = s->bit_buf;
156 *s->buf_ptr++ = s->bit_buf >> (BUF_BITS - 8);
161 s->bit_left = BUF_BITS;
165 static inline void flush_put_bits_le(PutBitContext *s)
167 while (s->bit_left < BUF_BITS) {
168 av_assert(s->buf_ptr < s->buf_end);
169 *s->buf_ptr++ = s->bit_buf;
173 s->bit_left = BUF_BITS;
177 #ifdef BITSTREAM_WRITER_LE
178 #define ff_put_string ff_put_string_unsupported_here
179 #define ff_copy_bits ff_copy_bits_unsupported_here
187 void ff_put_string(PutBitContext *pb,
const char *
string,
188 int terminate_string);
195 void ff_copy_bits(PutBitContext *pb,
const uint8_t *src,
int length);
198 static inline void put_bits_no_assert(PutBitContext *s,
int n, BitBuf value)
203 bit_buf = s->bit_buf;
204 bit_left = s->bit_left;
207 #ifdef BITSTREAM_WRITER_LE
208 bit_buf |= value << (BUF_BITS - bit_left);
210 if (s->buf_end - s->buf_ptr >=
sizeof(BitBuf)) {
211 AV_WLBUF(s->buf_ptr, bit_buf);
212 s->buf_ptr +=
sizeof(BitBuf);
214 av_log(NULL, AV_LOG_ERROR,
"Internal error, put_bits buffer too small\n");
217 bit_buf = value >> bit_left;
218 bit_left += BUF_BITS;
223 bit_buf = (bit_buf << n) | value;
226 bit_buf <<= bit_left;
227 bit_buf |= value >> (n - bit_left);
228 if (s->buf_end - s->buf_ptr >=
sizeof(BitBuf)) {
229 AV_WBBUF(s->buf_ptr, bit_buf);
230 s->buf_ptr +=
sizeof(BitBuf);
232 av_log(NULL, AV_LOG_ERROR,
"Internal error, put_bits buffer too small\n");
235 bit_left += BUF_BITS - n;
240 s->bit_buf = bit_buf;
241 s->bit_left = bit_left;
248 static inline void put_bits(PutBitContext *s,
int n, BitBuf value)
250 av_assert(n <= 31 && value < (1UL << n));
251 put_bits_no_assert(s, n, value);
254 static inline void put_bits_le(PutBitContext *s,
int n, BitBuf value)
259 av_assert(n <= 31 && value < (1UL << n));
261 bit_buf = s->bit_buf;
262 bit_left = s->bit_left;
264 bit_buf |= value << (BUF_BITS - bit_left);
266 if (s->buf_end - s->buf_ptr >=
sizeof(BitBuf)) {
267 AV_WLBUF(s->buf_ptr, bit_buf);
268 s->buf_ptr +=
sizeof(BitBuf);
270 av_log(NULL, AV_LOG_ERROR,
"Internal error, put_bits buffer too small\n");
273 bit_buf = value >> bit_left;
274 bit_left += BUF_BITS;
278 s->bit_buf = bit_buf;
279 s->bit_left = bit_left;
282 static inline void put_sbits(PutBitContext *pb,
int n, int32_t value)
284 av_assert(n >= 0 && n <= 31);
286 put_bits(pb, n, av_mod_uintp2(value, n));
292 static void av_unused put_bits32(PutBitContext *s, uint32_t value)
298 put_bits_no_assert(s, 32, value);
302 bit_buf = s->bit_buf;
303 bit_left = s->bit_left;
305 #ifdef BITSTREAM_WRITER_LE
306 bit_buf |= (BitBuf)value << (BUF_BITS - bit_left);
307 if (s->buf_end - s->buf_ptr >=
sizeof(BitBuf)) {
308 AV_WLBUF(s->buf_ptr, bit_buf);
309 s->buf_ptr +=
sizeof(BitBuf);
311 av_log(NULL, AV_LOG_ERROR,
"Internal error, put_bits buffer too small\n");
314 bit_buf = (uint64_t)value >> bit_left;
316 bit_buf = (uint64_t)bit_buf << bit_left;
317 bit_buf |= (BitBuf)value >> (BUF_BITS - bit_left);
318 if (s->buf_end - s->buf_ptr >=
sizeof(BitBuf)) {
319 AV_WBBUF(s->buf_ptr, bit_buf);
320 s->buf_ptr +=
sizeof(BitBuf);
322 av_log(NULL, AV_LOG_ERROR,
"Internal error, put_bits buffer too small\n");
328 s->bit_buf = bit_buf;
329 s->bit_left = bit_left;
335 static inline void put_bits64(PutBitContext *s,
int n, uint64_t value)
337 av_assert((n == 64) || (n < 64 && value < (UINT64_C(1) << n)));
340 put_bits(s, n, value);
342 put_bits32(s, value);
344 uint32_t lo = value & 0xffffffff;
345 uint32_t hi = value >> 32;
346 #ifdef BITSTREAM_WRITER_LE
348 put_bits(s, n - 32, hi);
350 put_bits(s, n - 32, hi);
354 uint32_t lo = value & 0xffffffff;
355 uint32_t hi = value >> 32;
356 #ifdef BITSTREAM_WRITER_LE
367 static inline void put_sbits63(PutBitContext *pb,
int n, int64_t value)
369 av_assert(n >= 0 && n < 64);
371 put_bits64(pb, n, (uint64_t)(value) & (~(UINT64_MAX << n)));
378 static inline uint8_t *put_bits_ptr(PutBitContext *s)
387 static inline void skip_put_bytes(PutBitContext *s,
int n)
389 av_assert((put_bits_count(s) & 7) == 0);
390 av_assert(s->bit_left == BUF_BITS);
391 av_assert(n <= s->buf_end - s->buf_ptr);
400 static inline void skip_put_bits(PutBitContext *s,
int n)
402 unsigned bits = BUF_BITS - s->bit_left + n;
403 s->buf_ptr +=
sizeof(BitBuf) * (bits / BUF_BITS);
404 s->bit_left = BUF_BITS - (bits & (BUF_BITS - 1));
412 static inline void set_put_bits_buffer_size(PutBitContext *s,
int size)
414 av_assert(size <= INT_MAX/8 - BUF_BITS);
415 s->buf_end = s->buf + size;
421 static inline void align_put_bits(PutBitContext *s)
423 put_bits(s, s->bit_left & 7, 0);
Definition: put_bits.h:51