26 #ifndef AVCODEC_GET_BITS_H 27 #define AVCODEC_GET_BITS_H 32 #include "libavutil/intreadwrite.h" 33 #include "libavutil/log.h" 52 #ifndef UNCHECKED_BITSTREAM_READER 53 #define UNCHECKED_BITSTREAM_READER !CONFIG_SAFE_BITSTREAM_READER 57 const uint8_t *buffer, *buffer_end;
60 int size_in_bits_plus8;
110 #ifdef LONG_BITSTREAM_READER 111 # define MIN_CACHE_BITS 32 113 # define MIN_CACHE_BITS 25 116 #define OPEN_READER_NOSIZE(name, gb) \ 117 unsigned int name ## _index = (gb)->index; \ 118 unsigned int av_unused name ## _cache 120 #if UNCHECKED_BITSTREAM_READER 121 #define OPEN_READER(name, gb) OPEN_READER_NOSIZE(name, gb) 123 #define BITS_AVAILABLE(name, gb) 1 125 #define OPEN_READER(name, gb) \ 126 OPEN_READER_NOSIZE(name, gb); \ 127 unsigned int name ## _size_plus8 = (gb)->size_in_bits_plus8 129 #define BITS_AVAILABLE(name, gb) name ## _index < name ## _size_plus8 132 #define CLOSE_READER(name, gb) (gb)->index = name ## _index 134 # ifdef LONG_BITSTREAM_READER 136 # define UPDATE_CACHE_LE(name, gb) name ## _cache = \ 137 AV_RL64((gb)->buffer + (name ## _index >> 3)) >> (name ## _index & 7) 139 # define UPDATE_CACHE_BE(name, gb) name ## _cache = \ 140 AV_RB64((gb)->buffer + (name ## _index >> 3)) >> (32 - (name ## _index & 7)) 144 # define UPDATE_CACHE_LE(name, gb) name ## _cache = \ 145 AV_RL32((gb)->buffer + (name ## _index >> 3)) >> (name ## _index & 7) 147 # define UPDATE_CACHE_BE(name, gb) name ## _cache = \ 148 AV_RB32((gb)->buffer + (name ## _index >> 3)) << (name ## _index & 7) 153 #ifdef BITSTREAM_READER_LE 155 # define UPDATE_CACHE(name, gb) UPDATE_CACHE_LE(name, gb) 157 # define SKIP_CACHE(name, gb, num) name ## _cache >>= (num) 161 # define UPDATE_CACHE(name, gb) UPDATE_CACHE_BE(name, gb) 163 # define SKIP_CACHE(name, gb, num) name ## _cache <<= (num) 167 #if UNCHECKED_BITSTREAM_READER 168 # define SKIP_COUNTER(name, gb, num) name ## _index += (num) 170 # define SKIP_COUNTER(name, gb, num) \ 171 name ## _index = FFMIN(name ## _size_plus8, name ## _index + (num)) 174 #define BITS_LEFT(name, gb) ((int)((gb)->size_in_bits - name ## _index)) 176 #define SKIP_BITS(name, gb, num) \ 178 SKIP_CACHE(name, gb, num); \ 179 SKIP_COUNTER(name, gb, num); \ 182 #define LAST_SKIP_BITS(name, gb, num) SKIP_COUNTER(name, gb, num) 184 #define SHOW_UBITS_LE(name, gb, num) zero_extend(name ## _cache, num) 185 #define SHOW_SBITS_LE(name, gb, num) sign_extend(name ## _cache, num) 187 #define SHOW_UBITS_BE(name, gb, num) NEG_USR32(name ## _cache, num) 188 #define SHOW_SBITS_BE(name, gb, num) NEG_SSR32(name ## _cache, num) 190 #ifdef BITSTREAM_READER_LE 191 # define SHOW_UBITS(name, gb, num) SHOW_UBITS_LE(name, gb, num) 192 # define SHOW_SBITS(name, gb, num) SHOW_SBITS_LE(name, gb, num) 194 # define SHOW_UBITS(name, gb, num) SHOW_UBITS_BE(name, gb, num) 195 # define SHOW_SBITS(name, gb, num) SHOW_SBITS_BE(name, gb, num) 198 #define GET_CACHE(name, gb) ((uint32_t) name ## _cache) 214 #if UNCHECKED_BITSTREAM_READER 217 s->index += av_clip(n, -s->index, s->size_in_bits_plus8 - s->index);
229 register int32_t cache;
233 cache = GET_CACHE(re, s);
235 LAST_SKIP_BITS(re, s, n);
237 return (NEG_USR32(sign ^ cache, n) ^ sign) - sign;
243 register int32_t cache;
246 UPDATE_CACHE_LE(re, s);
247 cache = GET_CACHE(re, s);
248 sign = sign_extend(~cache, n) >> 31;
249 LAST_SKIP_BITS(re, s, n);
251 return (zero_extend(sign ^ cache, n) ^ sign) - sign;
260 tmp = SHOW_SBITS(re, s, n);
261 LAST_SKIP_BITS(re, s, n);
275 tmp = SHOW_UBITS(re, s, n);
276 LAST_SKIP_BITS(re, s, n);
284 static av_always_inline
int get_bitsz(
GetBitContext *s,
int n)
286 return n ? get_bits(s, n) : 0;
289 static inline unsigned int get_bits_le(
GetBitContext *s,
int n)
294 UPDATE_CACHE_LE(re, s);
295 tmp = SHOW_UBITS_LE(re, s, n);
296 LAST_SKIP_BITS(re, s, n);
304 static inline unsigned int show_bits(
GetBitContext *s,
int n)
307 OPEN_READER_NOSIZE(re, s);
310 tmp = SHOW_UBITS(re, s, n);
317 LAST_SKIP_BITS(re, s, n);
323 unsigned int index = s->index;
324 uint8_t result = s->buffer[index >> 3];
325 #ifdef BITSTREAM_READER_LE 326 result >>= index & 7;
329 result <<= index & 7;
332 #if !UNCHECKED_BITSTREAM_READER 333 if (s->index < s->size_in_bits_plus8)
343 return show_bits(s, 1);
354 static inline unsigned int get_bits_long(
GetBitContext *s,
int n)
359 }
else if (n <= MIN_CACHE_BITS) {
360 return get_bits(s, n);
362 #ifdef BITSTREAM_READER_LE 363 unsigned ret = get_bits(s, 16);
364 return ret | (get_bits(s, n - 16) << 16);
366 unsigned ret = get_bits(s, 16) << (n - 16);
367 return ret | get_bits(s, n - 16);
378 return get_bits_long(s, n);
380 #ifdef BITSTREAM_READER_LE 381 uint64_t ret = get_bits_long(s, 32);
382 return ret | (uint64_t) get_bits_long(s, n - 32) << 32;
384 uint64_t ret = (uint64_t) get_bits_long(s, n - 32) << 32;
385 return ret | get_bits_long(s, 32);
399 return sign_extend(get_bits_long(s, n), n);
405 static inline unsigned int show_bits_long(
GetBitContext *s,
int n)
407 if (n <= MIN_CACHE_BITS) {
408 return show_bits(s, n);
411 return get_bits_long(&gb, n);
415 static inline int check_marker(
void *logctx,
GetBitContext *s,
const char *msg)
417 int bit = get_bits1(s);
420 get_bits_count(s) - 1, s->size_in_bits, msg);
433 static inline int init_get_bits(
GetBitContext *s,
const uint8_t *buffer,
445 buffer_size = (bit_size + 7) >> 3;
448 s->size_in_bits = bit_size;
449 s->size_in_bits_plus8 = bit_size + 8;
450 s->buffer_end = buffer + buffer_size;
464 static inline int init_get_bits8(
GetBitContext *s,
const uint8_t *buffer,
467 if (byte_size > INT_MAX / 8 || byte_size < 0)
469 return init_get_bits(s, buffer, byte_size * 8);
472 static inline const uint8_t *align_get_bits(
GetBitContext *s)
474 int n = -get_bits_count(s) & 7;
477 return s->buffer + (s->index >> 3);
485 #define GET_VLC(code, name, gb, table, bits, max_depth) \ 488 unsigned int index; \ 490 index = SHOW_UBITS(name, gb, bits); \ 491 code = table[index][0]; \ 492 n = table[index][1]; \ 494 if (max_depth > 1 && n < 0) { \ 495 LAST_SKIP_BITS(name, gb, bits); \ 496 UPDATE_CACHE(name, gb); \ 500 index = SHOW_UBITS(name, gb, nb_bits) + code; \ 501 code = table[index][0]; \ 502 n = table[index][1]; \ 503 if (max_depth > 2 && n < 0) { \ 504 LAST_SKIP_BITS(name, gb, nb_bits); \ 505 UPDATE_CACHE(name, gb); \ 509 index = SHOW_UBITS(name, gb, nb_bits) + code; \ 510 code = table[index][0]; \ 511 n = table[index][1]; \ 514 SKIP_BITS(name, gb, n); \ 517 #define GET_RL_VLC(level, run, name, gb, table, bits, \ 518 max_depth, need_update) \ 521 unsigned int index; \ 523 index = SHOW_UBITS(name, gb, bits); \ 524 level = table[index].level; \ 525 n = table[index].len; \ 527 if (max_depth > 1 && n < 0) { \ 528 SKIP_BITS(name, gb, bits); \ 530 UPDATE_CACHE(name, gb); \ 535 index = SHOW_UBITS(name, gb, nb_bits) + level; \ 536 level = table[index].level; \ 537 n = table[index].len; \ 538 if (max_depth > 2 && n < 0) { \ 539 LAST_SKIP_BITS(name, gb, nb_bits); \ 541 UPDATE_CACHE(name, gb); \ 545 index = SHOW_UBITS(name, gb, nb_bits) + level; \ 546 level = table[index].level; \ 547 n = table[index].len; \ 550 run = table[index].run; \ 551 SKIP_BITS(name, gb, n); \ 563 static av_always_inline
int get_vlc2(
GetBitContext *s, VLC_TYPE (*table)[2],
564 int bits,
int max_depth)
571 GET_VLC(code, re, s, table, bits, max_depth);
585 return get_bits1(gb) + 1;
593 return 2 - get_bits1(gb);
598 return gb->size_in_bits - get_bits_count(gb);
603 if (get_bits_left(gb) <= 0)
606 while (get_bits1(gb)) {
608 if (get_bits_left(gb) <= 0)
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
void av_log(void *avcl, int level, const char *fmt,...) av_printf_format(3
Send the specified message to the log if the level is less than or equal to the current av_log_level...
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
Definition: avassert.h:64
simple assert() macros that are a bit more flexible than ISO C assert().
#define GET_VLC(code, name, gb, table, bits, max_depth)
If the vlc code is invalid and max_depth=1, then no bits will be removed.
Definition: get_bits.h:485
#define AV_LOG_INFO
Standard information.
Definition: log.h:187
Libavcodec external API header.
Definition: get_bits.h:56
common internal and external API header
#define AV_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding...
Definition: avcodec.h:773