|
|
@@ -187,21 +187,28 @@ static inline unsigned int show_bits(GetBitContext *s, int n);
|
|
|
|
|
|
#define CLOSE_READER(name, gb) (gb)->index = name ## _index
|
|
|
|
|
|
+#define UPDATE_CACHE_BE_EXT(name, gb, bits, dst_bits) name ## _cache = \
|
|
|
+ AV_RB ## bits((gb)->buffer + (name ## _index >> 3)) << (name ## _index & 7) >> (bits - dst_bits)
|
|
|
+
|
|
|
+#define UPDATE_CACHE_LE_EXT(name, gb, bits, dst_bits) name ## _cache = \
|
|
|
+ (uint ## dst_bits ## _t)(AV_RL ## bits((gb)->buffer + (name ## _index >> 3)) >> (name ## _index & 7))
|
|
|
+
|
|
|
+/* Using these two macros ensures that 32 bits are available. */
|
|
|
+# define UPDATE_CACHE_LE_32(name, gb) UPDATE_CACHE_LE_EXT(name, (gb), 64, 32)
|
|
|
+
|
|
|
+# define UPDATE_CACHE_BE_32(name, gb) UPDATE_CACHE_BE_EXT(name, (gb), 64, 32)
|
|
|
+
|
|
|
# ifdef LONG_BITSTREAM_READER
|
|
|
|
|
|
-# define UPDATE_CACHE_LE(name, gb) name ## _cache = \
|
|
|
- AV_RL64((gb)->buffer + (name ## _index >> 3)) >> (name ## _index & 7)
|
|
|
+# define UPDATE_CACHE_LE(name, gb) UPDATE_CACHE_LE_32(name, (gb))
|
|
|
|
|
|
-# define UPDATE_CACHE_BE(name, gb) name ## _cache = \
|
|
|
- AV_RB64((gb)->buffer + (name ## _index >> 3)) >> (32 - (name ## _index & 7))
|
|
|
+# define UPDATE_CACHE_BE(name, gb) UPDATE_CACHE_BE_32(name, (gb))
|
|
|
|
|
|
#else
|
|
|
|
|
|
-# define UPDATE_CACHE_LE(name, gb) name ## _cache = \
|
|
|
- AV_RL32((gb)->buffer + (name ## _index >> 3)) >> (name ## _index & 7)
|
|
|
+# define UPDATE_CACHE_LE(name, gb) UPDATE_CACHE_LE_EXT(name, (gb), 32, 32)
|
|
|
|
|
|
-# define UPDATE_CACHE_BE(name, gb) name ## _cache = \
|
|
|
- AV_RB32((gb)->buffer + (name ## _index >> 3)) << (name ## _index & 7)
|
|
|
+# define UPDATE_CACHE_BE(name, gb) UPDATE_CACHE_BE_EXT(name, (gb), 32, 32)
|
|
|
|
|
|
#endif
|
|
|
|
|
|
@@ -209,12 +216,14 @@ static inline unsigned int show_bits(GetBitContext *s, int n);
|
|
|
#ifdef BITSTREAM_READER_LE
|
|
|
|
|
|
# define UPDATE_CACHE(name, gb) UPDATE_CACHE_LE(name, gb)
|
|
|
+# define UPDATE_CACHE_32(name, gb) UPDATE_CACHE_LE_32(name, (gb))
|
|
|
|
|
|
# define SKIP_CACHE(name, gb, num) name ## _cache >>= (num)
|
|
|
|
|
|
#else
|
|
|
|
|
|
# define UPDATE_CACHE(name, gb) UPDATE_CACHE_BE(name, gb)
|
|
|
+# define UPDATE_CACHE_32(name, gb) UPDATE_CACHE_BE_32(name, (gb))
|
|
|
|
|
|
# define SKIP_CACHE(name, gb, num) name ## _cache <<= (num)
|
|
|
|
|
|
@@ -414,15 +423,26 @@ static inline unsigned int get_bits_long(GetBitContext *s, int n)
|
|
|
av_assert2(n>=0 && n<=32);
|
|
|
if (!n) {
|
|
|
return 0;
|
|
|
- } else if (n <= MIN_CACHE_BITS) {
|
|
|
+ } else if ((!HAVE_FAST_64BIT || av_builtin_constant_p(n <= MIN_CACHE_BITS))
|
|
|
+ && n <= MIN_CACHE_BITS) {
|
|
|
return get_bits(s, n);
|
|
|
} else {
|
|
|
+#if HAVE_FAST_64BIT
|
|
|
+ unsigned tmp;
|
|
|
+ OPEN_READER(re, s);
|
|
|
+ UPDATE_CACHE_32(re, s);
|
|
|
+ tmp = SHOW_UBITS(re, s, n);
|
|
|
+ LAST_SKIP_BITS(re, s, n);
|
|
|
+ CLOSE_READER(re, s);
|
|
|
+ return tmp;
|
|
|
+#else
|
|
|
#ifdef BITSTREAM_READER_LE
|
|
|
unsigned ret = get_bits(s, 16);
|
|
|
return ret | (get_bits(s, n - 16) << 16);
|
|
|
#else
|
|
|
unsigned ret = get_bits(s, 16) << (n - 16);
|
|
|
return ret | get_bits(s, n - 16);
|
|
|
+#endif
|
|
|
#endif
|
|
|
}
|
|
|
}
|