summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Almer <jamrial@gmail.com>2023-11-25 11:07:16 -0300
committerJames Almer <jamrial@gmail.com>2023-12-18 15:19:36 -0300
commit0cc0d8c0b579f0e47052a717568dc2faa09d4e60 (patch)
treed495b1fea12dbb46fc82f8217f163d878588b770
parent12eac2363774d8b844ba8a3f82f8dff065d5c84e (diff)
avcodec/get_bits: add get_leb()
Signed-off-by: James Almer <jamrial@gmail.com>
-rw-r--r--libavcodec/bitstream.h2
-rw-r--r--libavcodec/bitstream_template.h23
-rw-r--r--libavcodec/get_bits.h24
3 files changed, 49 insertions, 0 deletions
diff --git a/libavcodec/bitstream.h b/libavcodec/bitstream.h
index 35b7873b9c..17f8a5da83 100644
--- a/libavcodec/bitstream.h
+++ b/libavcodec/bitstream.h
@@ -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
diff --git a/libavcodec/bitstream_template.h b/libavcodec/bitstream_template.h
index 4f3d07275f..4c7101632f 100644
--- a/libavcodec/bitstream_template.h
+++ b/libavcodec/bitstream_template.h
@@ -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
diff --git a/libavcodec/get_bits.h b/libavcodec/get_bits.h
index cfcf97c021..9e19d2a439 100644
--- a/libavcodec/get_bits.h
+++ b/libavcodec/get_bits.h
@@ -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 */