avcodec/get_bits: unbreak get_bits_le() with cached reader

This commit is contained in:
Paul B Mahol 2019-03-26 11:10:54 +01:00
parent dd06f022b0
commit 78c8a76536
2 changed files with 60 additions and 26 deletions

View File

@ -226,34 +226,32 @@ static inline int get_bits_count(const GetBitContext *s)
}
#if CACHED_BITSTREAM_READER
static inline void refill_32(GetBitContext *s)
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
if (is_le)
s->cache = (uint64_t)AV_RL32(s->buffer + (s->index >> 3)) << s->bits_left | s->cache;
#else
else
s->cache = s->cache | (uint64_t)AV_RB32(s->buffer + (s->index >> 3)) << (32 - s->bits_left);
#endif
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
if (is_le)
s->cache = AV_RL64(s->buffer + (s->index >> 3));
#else
else
s->cache = AV_RB64(s->buffer + (s->index >> 3));
#endif
s->index += 64;
s->bits_left = 64;
}
@ -385,7 +383,11 @@ static inline unsigned int get_bits(GetBitContext *s, int n)
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;
}
@ -420,7 +422,7 @@ static inline unsigned int get_bits_le(GetBitContext *s, int n)
#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;
}
@ -446,7 +448,11 @@ static inline unsigned int show_bits(GetBitContext *s, int n)
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
@ -474,7 +480,11 @@ static inline void skip_bits(GetBitContext *s, int n)
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);
}
@ -489,7 +499,11 @@ static inline unsigned int get_bits1(GetBitContext *s)
{
#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);
@ -605,16 +619,8 @@ static inline int check_marker(void *logctx, GetBitContext *s, const char *msg)
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;
@ -634,12 +640,32 @@ static inline int init_get_bits(GetBitContext *s, const uint8_t *buffer,
s->index = 0;
#if CACHED_BITSTREAM_READER
refill_64(s);
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
@ -656,6 +682,14 @@ static inline int init_get_bits8(GetBitContext *s, const uint8_t *buffer,
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;

View File

@ -258,11 +258,11 @@ static int decode_plane(UtvideoContext *c, int plane_no,
GetBitContext cbit, pbit;
uint8_t *dest, *p;
ret = init_get_bits8(&cbit, c->control_stream[plane_no][slice], c->control_stream_size[plane_no][slice]);
ret = init_get_bits8_le(&cbit, c->control_stream[plane_no][slice], c->control_stream_size[plane_no][slice]);
if (ret < 0)
return ret;
ret = init_get_bits8(&pbit, c->packed_stream[plane_no][slice], c->packed_stream_size[plane_no][slice]);
ret = init_get_bits8_le(&pbit, c->packed_stream[plane_no][slice], c->packed_stream_size[plane_no][slice]);
if (ret < 0)
return ret;