#define UNCHECKED_BITSTREAM_READER !CONFIG_SAFE_BITSTREAM_READER
#endif
+#ifndef CACHED_BITSTREAM_READER
+#define CACHED_BITSTREAM_READER 0
+#endif
+
typedef struct GetBitContext {
const uint8_t *buffer, *buffer_end;
-#ifdef CACHED_BITSTREAM_READER
+#if CACHED_BITSTREAM_READER
uint64_t cache;
unsigned bits_left;
#endif
* For examples see get_bits, show_bits, skip_bits, get_vlc.
*/
-#ifdef CACHED_BITSTREAM_READER
+#if CACHED_BITSTREAM_READER
# define MIN_CACHE_BITS 64
#elif defined LONG_BITSTREAM_READER
# define MIN_CACHE_BITS 32
# define MIN_CACHE_BITS 25
#endif
-#ifndef CACHED_BITSTREAM_READER
+#if !CACHED_BITSTREAM_READER
#define OPEN_READER_NOSIZE(name, gb) \
unsigned int name ## _index = (gb)->index; \
static inline int get_bits_count(const GetBitContext *s)
{
-#ifdef CACHED_BITSTREAM_READER
+#if CACHED_BITSTREAM_READER
return s->index - s->bits_left;
#else
return s->index;
#endif
}
-#ifdef CACHED_BITSTREAM_READER
-static inline void refill_32(GetBitContext *s)
+#if CACHED_BITSTREAM_READER
+static inline void refill_32(GetBitContext *s, int is_le)
{
#if !UNCHECKED_BITSTREAM_READER
if (s->index >> 3 >= s->buffer_end - s->buffer)
return;
#endif
-#ifdef BITSTREAM_READER_LE
- s->cache = (uint64_t)AV_RL32(s->buffer + (s->index >> 3)) << s->bits_left | s->cache;
-#else
- s->cache = s->cache | (uint64_t)AV_RB32(s->buffer + (s->index >> 3)) << (32 - s->bits_left);
-#endif
+ if (is_le)
+ s->cache = (uint64_t)AV_RL32(s->buffer + (s->index >> 3)) << s->bits_left | s->cache;
+ else
+ s->cache = s->cache | (uint64_t)AV_RB32(s->buffer + (s->index >> 3)) << (32 - s->bits_left);
s->index += 32;
s->bits_left += 32;
}
-static inline void refill_64(GetBitContext *s)
+static inline void refill_64(GetBitContext *s, int is_le)
{
#if !UNCHECKED_BITSTREAM_READER
if (s->index >> 3 >= s->buffer_end - s->buffer)
return;
#endif
-#ifdef BITSTREAM_READER_LE
- s->cache = AV_RL64(s->buffer + (s->index >> 3));
-#else
- s->cache = AV_RB64(s->buffer + (s->index >> 3));
-#endif
+ if (is_le)
+ s->cache = AV_RL64(s->buffer + (s->index >> 3));
+ else
+ s->cache = AV_RB64(s->buffer + (s->index >> 3));
s->index += 64;
s->bits_left = 64;
}
*/
static inline void skip_bits_long(GetBitContext *s, int n)
{
-#ifdef CACHED_BITSTREAM_READER
+#if CACHED_BITSTREAM_READER
skip_bits(s, n);
#else
#if UNCHECKED_BITSTREAM_READER
#endif
}
-#ifdef CACHED_BITSTREAM_READER
+#if CACHED_BITSTREAM_READER
static inline void skip_remaining(GetBitContext *s, unsigned n)
{
#ifdef BITSTREAM_READER_LE
*/
static inline int get_xbits(GetBitContext *s, int n)
{
-#ifdef CACHED_BITSTREAM_READER
+#if CACHED_BITSTREAM_READER
int32_t cache = show_bits(s, 32);
int sign = ~cache >> 31;
skip_remaining(s, n);
#endif
}
-#ifndef CACHED_BITSTREAM_READER
+#if !CACHED_BITSTREAM_READER
static inline int get_xbits_le(GetBitContext *s, int n)
{
register int sign;
static inline int get_sbits(GetBitContext *s, int n)
{
register int tmp;
-#ifdef CACHED_BITSTREAM_READER
+#if CACHED_BITSTREAM_READER
av_assert2(n>0 && n<=25);
tmp = sign_extend(get_bits(s, n), n);
#else
*/
static inline unsigned int get_bits(GetBitContext *s, int n)
{
- register int tmp;
-#ifdef CACHED_BITSTREAM_READER
+ register unsigned int tmp;
+#if CACHED_BITSTREAM_READER
av_assert2(n>0 && n<=32);
if (n > s->bits_left) {
- refill_32(s);
+#ifdef BITSTREAM_READER_LE
+ refill_32(s, 1);
+#else
+ refill_32(s, 0);
+#endif
if (s->bits_left < 32)
s->bits_left = n;
}
LAST_SKIP_BITS(re, s, n);
CLOSE_READER(re, s);
#endif
+ av_assert2(tmp < UINT64_C(1) << n);
return tmp;
}
static inline unsigned int get_bits_le(GetBitContext *s, int n)
{
-#ifdef CACHED_BITSTREAM_READER
+#if CACHED_BITSTREAM_READER
av_assert2(n>0 && n<=32);
if (n > s->bits_left) {
- refill_32(s);
+ refill_32(s, 1);
if (s->bits_left < 32)
s->bits_left = n;
}
*/
static inline unsigned int show_bits(GetBitContext *s, int n)
{
- register int tmp;
-#ifdef CACHED_BITSTREAM_READER
+ register unsigned int tmp;
+#if CACHED_BITSTREAM_READER
if (n > s->bits_left)
- refill_32(s);
+#ifdef BITSTREAM_READER_LE
+ refill_32(s, 1);
+#else
+ refill_32(s, 0);
+#endif
tmp = show_val(s, n);
#else
static inline void skip_bits(GetBitContext *s, int n)
{
-#ifdef CACHED_BITSTREAM_READER
+#if CACHED_BITSTREAM_READER
if (n < s->bits_left)
skip_remaining(s, n);
else {
n -= skip;
s->index += skip;
}
- refill_64(s);
+#ifdef BITSTREAM_READER_LE
+ refill_64(s, 1);
+#else
+ refill_64(s, 0);
+#endif
if (n)
skip_remaining(s, n);
}
static inline unsigned int get_bits1(GetBitContext *s)
{
-#ifdef CACHED_BITSTREAM_READER
+#if CACHED_BITSTREAM_READER
if (!s->bits_left)
- refill_64(s);
+#ifdef BITSTREAM_READER_LE
+ refill_64(s, 1);
+#else
+ refill_64(s, 0);
+#endif
#ifdef BITSTREAM_READER_LE
return get_val(s, 1, 1);
av_assert2(n>=0 && n<=32);
if (!n) {
return 0;
-#ifdef CACHED_BITSTREAM_READER
+#if CACHED_BITSTREAM_READER
}
return get_bits(s, n);
#else
return bit;
}
-/**
- * Initialize GetBitContext.
- * @param buffer bitstream buffer, must be AV_INPUT_BUFFER_PADDING_SIZE bytes
- * larger than the actual read bits because some optimized bitstream
- * readers read 32 or 64 bit at once and could read over the end
- * @param bit_size the size of the buffer in bits
- * @return 0 on success, AVERROR_INVALIDDATA if the buffer_size would overflow.
- */
-static inline int init_get_bits(GetBitContext *s, const uint8_t *buffer,
- int bit_size)
+static inline int init_get_bits_xe(GetBitContext *s, const uint8_t *buffer,
+ int bit_size, int is_le)
{
int buffer_size;
int ret = 0;
s->buffer_end = buffer + buffer_size;
s->index = 0;
-#ifdef CACHED_BITSTREAM_READER
- refill_64(s);
+#if CACHED_BITSTREAM_READER
+ s->cache = 0;
+ s->bits_left = 0;
+ refill_64(s, is_le);
#endif
return ret;
}
+/**
+ * Initialize GetBitContext.
+ * @param buffer bitstream buffer, must be AV_INPUT_BUFFER_PADDING_SIZE bytes
+ * larger than the actual read bits because some optimized bitstream
+ * readers read 32 or 64 bit at once and could read over the end
+ * @param bit_size the size of the buffer in bits
+ * @return 0 on success, AVERROR_INVALIDDATA if the buffer_size would overflow.
+ */
+static inline int init_get_bits(GetBitContext *s, const uint8_t *buffer,
+ int bit_size)
+{
+#ifdef BITSTREAM_READER_LE
+ return init_get_bits_xe(s, buffer, bit_size, 1);
+#else
+ return init_get_bits_xe(s, buffer, bit_size, 0);
+#endif
+}
+
/**
* Initialize GetBitContext.
* @param buffer bitstream buffer, must be AV_INPUT_BUFFER_PADDING_SIZE bytes
return init_get_bits(s, buffer, byte_size * 8);
}
+static inline int init_get_bits8_le(GetBitContext *s, const uint8_t *buffer,
+ int byte_size)
+{
+ if (byte_size > INT_MAX / 8 || byte_size < 0)
+ byte_size = -1;
+ return init_get_bits_xe(s, buffer, byte_size * 8, 1);
+}
+
static inline const uint8_t *align_get_bits(GetBitContext *s)
{
int n = -get_bits_count(s) & 7;
static av_always_inline int get_vlc2(GetBitContext *s, VLC_TYPE (*table)[2],
int bits, int max_depth)
{
-#ifdef CACHED_BITSTREAM_READER
+#if CACHED_BITSTREAM_READER
int nb_bits;
unsigned idx = show_bits(s, bits);
int code = table[idx][0];