1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2024-12-23 12:43:46 +02:00

avcodec/get_bits: add get_leb()

Signed-off-by: James Almer <jamrial@gmail.com>
This commit is contained in:
James Almer 2023-11-25 11:07:16 -03:00
parent 12eac23637
commit 0cc0d8c0b5
3 changed files with 49 additions and 0 deletions

View File

@ -103,6 +103,7 @@
# define bits_apply_sign bits_apply_sign_le
# define bits_read_vlc bits_read_vlc_le
# define bits_read_vlc_multi bits_read_vlc_multi_le
# define bits_read_leb bits_read_leb_le
#elif defined(BITS_DEFAULT_BE)
@ -132,6 +133,7 @@
# define bits_apply_sign bits_apply_sign_be
# define bits_read_vlc bits_read_vlc_be
# define bits_read_vlc_multi bits_read_vlc_multi_be
# define bits_read_leb bits_read_leb_be
#endif

View File

@ -562,6 +562,29 @@ static inline int BS_FUNC(read_vlc_multi)(BSCTX *bc, uint8_t dst[8],
return ret;
}
/**
* Read a unsigned integer coded as a variable number of up to eight
* little-endian bytes, where the MSB in a byte signals another byte
* must be read.
* Values > UINT_MAX are truncated, but all coded bits are read.
*/
static inline unsigned BS_FUNC(read_leb)(BSCTX *bc) {
int more, i = 0;
unsigned leb = 0;
do {
int byte = BS_FUNC(read)(bc, 8);
unsigned bits = byte & 0x7f;
more = byte & 0x80;
if (i <= 4)
leb |= bits << (i * 7);
if (++i == 8)
break;
} while (more);
return leb;
}
#undef BSCTX
#undef BS_FUNC
#undef BS_JOIN3

View File

@ -94,6 +94,7 @@ typedef BitstreamContext GetBitContext;
#define align_get_bits bits_align
#define get_vlc2 bits_read_vlc
#define get_vlc_multi bits_read_vlc_multi
#define get_leb bits_read_leb
#define init_get_bits8_le(s, buffer, byte_size) bits_init8_le((BitstreamContextLE*)s, buffer, byte_size)
#define get_bits_le(s, n) bits_read_le((BitstreamContextLE*)s, n)
@ -710,6 +711,29 @@ static inline int skip_1stop_8data_bits(GetBitContext *gb)
return 0;
}
/**
* Read a unsigned integer coded as a variable number of up to eight
* little-endian bytes, where the MSB in a byte signals another byte
* must be read.
* All coded bits are read, but values > UINT_MAX are truncated.
*/
static inline unsigned get_leb(GetBitContext *s) {
int more, i = 0;
unsigned leb = 0;
do {
int byte = get_bits(s, 8);
unsigned bits = byte & 0x7f;
more = byte & 0x80;
if (i <= 4)
leb |= bits << (i * 7);
if (++i == 8)
break;
} while (more);
return leb;
}
#endif // CACHED_BITSTREAM_READER
#endif /* AVCODEC_GET_BITS_H */