]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/get_bits.h
avcodec: Move all AVCodecParser.split functions to remove_extradata_bsf
[ffmpeg] / libavcodec / get_bits.h
index 58ebb64656ca123e6daa2836f3ad428f5eb194b1..66fb8775994b3a9fee3fac9125981bccfce7aa68 100644 (file)
 #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
@@ -116,7 +120,7 @@ static inline unsigned int show_bits(GetBitContext *s, int n);
  * 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
@@ -124,7 +128,7 @@ static inline unsigned int show_bits(GetBitContext *s, int n);
 #   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;  \
@@ -214,42 +218,40 @@ static inline unsigned int show_bits(GetBitContext *s, int n);
 
 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;
 }
@@ -288,7 +290,7 @@ static inline unsigned show_val(const GetBitContext *s, unsigned n)
  */
 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
@@ -299,7 +301,7 @@ static inline void skip_bits_long(GetBitContext *s, int n)
 #endif
 }
 
-#ifdef CACHED_BITSTREAM_READER
+#if CACHED_BITSTREAM_READER
 static inline void skip_remaining(GetBitContext *s, unsigned n)
 {
 #ifdef BITSTREAM_READER_LE
@@ -318,7 +320,7 @@ static inline void skip_remaining(GetBitContext *s, unsigned n)
  */
 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);
@@ -338,7 +340,7 @@ static inline int get_xbits(GetBitContext *s, int n)
 #endif
 }
 
-#ifndef CACHED_BITSTREAM_READER
+#if !CACHED_BITSTREAM_READER
 static inline int get_xbits_le(GetBitContext *s, int n)
 {
     register int sign;
@@ -357,7 +359,7 @@ static inline int get_xbits_le(GetBitContext *s, int n)
 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
@@ -376,12 +378,16 @@ static inline int get_sbits(GetBitContext *s, int n)
  */
 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;
     }
@@ -399,6 +405,7 @@ static inline unsigned int get_bits(GetBitContext *s, int n)
     LAST_SKIP_BITS(re, s, n);
     CLOSE_READER(re, s);
 #endif
+    av_assert2(tmp < UINT64_C(1) << n);
     return tmp;
 }
 
@@ -412,10 +419,10 @@ static av_always_inline int get_bitsz(GetBitContext *s, int n)
 
 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;
     }
@@ -438,10 +445,14 @@ static inline unsigned int get_bits_le(GetBitContext *s, int 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
@@ -455,7 +466,7 @@ static inline unsigned int show_bits(GetBitContext *s, int n)
 
 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 {
@@ -469,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);
     }
@@ -482,9 +497,13 @@ static inline void skip_bits(GetBitContext *s, int 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);
@@ -529,7 +548,7 @@ static inline unsigned int get_bits_long(GetBitContext *s, int n)
     av_assert2(n>=0 && n<=32);
     if (!n) {
         return 0;
-#ifdef CACHED_BITSTREAM_READER
+#if CACHED_BITSTREAM_READER
     }
     return get_bits(s, n);
 #else
@@ -600,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;
@@ -628,13 +639,33 @@ static inline int init_get_bits(GetBitContext *s, const uint8_t *buffer,
     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
@@ -651,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;
@@ -758,7 +797,7 @@ static inline int set_idx(GetBitContext *s, int code, int *n, int *nb_bits,
 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];