|
|
|
@@ -125,33 +125,37 @@ for examples see get_bits, show_bits, skip_bits, get_vlc |
|
|
|
# define MIN_CACHE_BITS 25 |
|
|
|
#endif |
|
|
|
|
|
|
|
# define OPEN_READER(name, gb) \ |
|
|
|
#define OPEN_READER(name, gb) \ |
|
|
|
unsigned int name##_index = (gb)->index; \ |
|
|
|
unsigned int av_unused name##_cache = 0 |
|
|
|
|
|
|
|
# define CLOSE_READER(name, gb) (gb)->index = name##_index |
|
|
|
#define CLOSE_READER(name, gb) (gb)->index = name##_index |
|
|
|
|
|
|
|
#ifdef ALT_BITSTREAM_READER_LE |
|
|
|
|
|
|
|
# ifdef ALT_BITSTREAM_READER_LE |
|
|
|
# ifdef LONG_BITSTREAM_READER |
|
|
|
# define UPDATE_CACHE(name, gb) \ |
|
|
|
name##_cache = AV_RL64((gb)->buffer+(name##_index>>3)) >> (name##_index&0x07) |
|
|
|
# define UPDATE_CACHE(name, gb) name##_cache = \ |
|
|
|
AV_RL64((gb)->buffer + (name##_index >> 3)) >> (name##_index & 7) |
|
|
|
# else |
|
|
|
# define UPDATE_CACHE(name, gb) \ |
|
|
|
name##_cache = AV_RL32((gb)->buffer+(name##_index>>3)) >> (name##_index&0x07) |
|
|
|
# define UPDATE_CACHE(name, gb) name##_cache = \ |
|
|
|
AV_RL32((gb)->buffer + (name##_index >> 3)) >> (name##_index & 7) |
|
|
|
# endif |
|
|
|
|
|
|
|
# define SKIP_CACHE(name, gb, num) name##_cache >>= (num) |
|
|
|
# else |
|
|
|
# define SKIP_CACHE(name, gb, num) name##_cache >>= (num) |
|
|
|
|
|
|
|
#else |
|
|
|
|
|
|
|
# ifdef LONG_BITSTREAM_READER |
|
|
|
# define UPDATE_CACHE(name, gb) \ |
|
|
|
name##_cache = AV_RB64((gb)->buffer+(name##_index >> 3)) >> (32 - (name##_index & 0x07)) |
|
|
|
# define UPDATE_CACHE(name, gb) name##_cache = \ |
|
|
|
AV_RB64((gb)->buffer + (name##_index >> 3)) >> (32 - (name##_index & 7)) |
|
|
|
# else |
|
|
|
# define UPDATE_CACHE(name, gb) \ |
|
|
|
name##_cache = AV_RB32((gb)->buffer+(name##_index>>3)) << (name##_index&0x07) |
|
|
|
# define UPDATE_CACHE(name, gb) name##_cache = \ |
|
|
|
AV_RB32((gb)->buffer + (name##_index >> 3)) << (name##_index & 7) |
|
|
|
# endif |
|
|
|
|
|
|
|
# define SKIP_CACHE(name, gb, num) name##_cache <<= (num) |
|
|
|
# endif |
|
|
|
# define SKIP_CACHE(name, gb, num) name##_cache <<= (num) |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
// FIXME name? |
|
|
|
#if UNCHECKED_BITSTREAM_READER |
|
|
|
@@ -161,27 +165,26 @@ for examples see get_bits, show_bits, skip_bits, get_vlc |
|
|
|
name##_index = FFMIN((gb)->size_in_bits_plus8, name##_index + (num)) |
|
|
|
#endif |
|
|
|
|
|
|
|
# define SKIP_BITS(name, gb, num) do { \ |
|
|
|
#define SKIP_BITS(name, gb, num) do { \ |
|
|
|
SKIP_CACHE(name, gb, num); \ |
|
|
|
SKIP_COUNTER(name, gb, num); \ |
|
|
|
} while (0) |
|
|
|
|
|
|
|
# define LAST_SKIP_BITS(name, gb, num) SKIP_COUNTER(name, gb, num) |
|
|
|
# define LAST_SKIP_CACHE(name, gb, num) |
|
|
|
#define LAST_SKIP_BITS(name, gb, num) SKIP_COUNTER(name, gb, num) |
|
|
|
#define LAST_SKIP_CACHE(name, gb, num) |
|
|
|
|
|
|
|
# ifdef ALT_BITSTREAM_READER_LE |
|
|
|
#ifdef ALT_BITSTREAM_READER_LE |
|
|
|
# define SHOW_UBITS(name, gb, num) zero_extend(name##_cache, num) |
|
|
|
|
|
|
|
# define SHOW_SBITS(name, gb, num) sign_extend(name##_cache, num) |
|
|
|
# else |
|
|
|
#else |
|
|
|
# define SHOW_UBITS(name, gb, num) NEG_USR32(name##_cache, num) |
|
|
|
|
|
|
|
# define SHOW_SBITS(name, gb, num) NEG_SSR32(name##_cache, num) |
|
|
|
# endif |
|
|
|
#endif |
|
|
|
|
|
|
|
# define GET_CACHE(name, gb) ((uint32_t)name##_cache) |
|
|
|
#define GET_CACHE(name, gb) ((uint32_t)name##_cache) |
|
|
|
|
|
|
|
static inline int get_bits_count(const GetBitContext *s){ |
|
|
|
static inline int get_bits_count(const GetBitContext *s) |
|
|
|
{ |
|
|
|
return s->index; |
|
|
|
} |
|
|
|
|
|
|
|
@@ -199,7 +202,8 @@ static inline void skip_bits_long(GetBitContext *s, int n){ |
|
|
|
* @param n length in bits |
|
|
|
* @author BERO |
|
|
|
*/ |
|
|
|
static inline int get_xbits(GetBitContext *s, int n){ |
|
|
|
static inline int get_xbits(GetBitContext *s, int n) |
|
|
|
{ |
|
|
|
register int sign; |
|
|
|
register int32_t cache; |
|
|
|
OPEN_READER(re, s); |
|
|
|
@@ -211,7 +215,8 @@ static inline int get_xbits(GetBitContext *s, int n){ |
|
|
|
return (NEG_USR32(sign ^ cache, n) ^ sign) - sign; |
|
|
|
} |
|
|
|
|
|
|
|
static inline int get_sbits(GetBitContext *s, int n){ |
|
|
|
static inline int get_sbits(GetBitContext *s, int n) |
|
|
|
{ |
|
|
|
register int tmp; |
|
|
|
OPEN_READER(re, s); |
|
|
|
UPDATE_CACHE(re, s); |
|
|
|
@@ -224,7 +229,8 @@ static inline int get_sbits(GetBitContext *s, int n){ |
|
|
|
/** |
|
|
|
* Read 1-25 bits. |
|
|
|
*/ |
|
|
|
static inline unsigned int get_bits(GetBitContext *s, int n){ |
|
|
|
static inline unsigned int get_bits(GetBitContext *s, int n) |
|
|
|
{ |
|
|
|
register int tmp; |
|
|
|
OPEN_READER(re, s); |
|
|
|
UPDATE_CACHE(re, s); |
|
|
|
@@ -237,7 +243,8 @@ static inline unsigned int get_bits(GetBitContext *s, int n){ |
|
|
|
/** |
|
|
|
* Show 1-25 bits. |
|
|
|
*/ |
|
|
|
static inline unsigned int show_bits(GetBitContext *s, int n){ |
|
|
|
static inline unsigned int show_bits(GetBitContext *s, int n) |
|
|
|
{ |
|
|
|
register int tmp; |
|
|
|
OPEN_READER(re, s); |
|
|
|
UPDATE_CACHE(re, s); |
|
|
|
@@ -245,7 +252,8 @@ static inline unsigned int show_bits(GetBitContext *s, int n){ |
|
|
|
return tmp; |
|
|
|
} |
|
|
|
|
|
|
|
static inline void skip_bits(GetBitContext *s, int n){ |
|
|
|
static inline void skip_bits(GetBitContext *s, int n) |
|
|
|
{ |
|
|
|
//Note gcc seems to optimize this to s->index+=n for the ALT_READER :)) |
|
|
|
OPEN_READER(re, s); |
|
|
|
UPDATE_CACHE(re, s); |
|
|
|
@@ -253,7 +261,8 @@ static inline void skip_bits(GetBitContext *s, int n){ |
|
|
|
CLOSE_READER(re, s); |
|
|
|
} |
|
|
|
|
|
|
|
static inline unsigned int get_bits1(GetBitContext *s){ |
|
|
|
static inline unsigned int get_bits1(GetBitContext *s) |
|
|
|
{ |
|
|
|
unsigned int index = s->index; |
|
|
|
uint8_t result = s->buffer[index>>3]; |
|
|
|
#ifdef ALT_BITSTREAM_READER_LE |
|
|
|
@@ -272,19 +281,23 @@ static inline unsigned int get_bits1(GetBitContext *s){ |
|
|
|
return result; |
|
|
|
} |
|
|
|
|
|
|
|
static inline unsigned int show_bits1(GetBitContext *s){ |
|
|
|
static inline unsigned int show_bits1(GetBitContext *s) |
|
|
|
{ |
|
|
|
return show_bits(s, 1); |
|
|
|
} |
|
|
|
|
|
|
|
static inline void skip_bits1(GetBitContext *s){ |
|
|
|
static inline void skip_bits1(GetBitContext *s) |
|
|
|
{ |
|
|
|
skip_bits(s, 1); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Read 0-32 bits. |
|
|
|
*/ |
|
|
|
static inline unsigned int get_bits_long(GetBitContext *s, int n){ |
|
|
|
if (n <= MIN_CACHE_BITS) return get_bits(s, n); |
|
|
|
static inline unsigned int get_bits_long(GetBitContext *s, int n) |
|
|
|
{ |
|
|
|
if (n <= MIN_CACHE_BITS) |
|
|
|
return get_bits(s, n); |
|
|
|
else { |
|
|
|
#ifdef ALT_BITSTREAM_READER_LE |
|
|
|
int ret = get_bits(s, 16); |
|
|
|
@@ -299,15 +312,18 @@ static inline unsigned int get_bits_long(GetBitContext *s, int n){ |
|
|
|
/** |
|
|
|
* Read 0-32 bits as a signed integer. |
|
|
|
*/ |
|
|
|
static inline int get_sbits_long(GetBitContext *s, int n) { |
|
|
|
static inline int get_sbits_long(GetBitContext *s, int n) |
|
|
|
{ |
|
|
|
return sign_extend(get_bits_long(s, n), n); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Show 0-32 bits. |
|
|
|
*/ |
|
|
|
static inline unsigned int show_bits_long(GetBitContext *s, int n){ |
|
|
|
if (n <= MIN_CACHE_BITS) return show_bits(s, n); |
|
|
|
static inline unsigned int show_bits_long(GetBitContext *s, int n) |
|
|
|
{ |
|
|
|
if (n <= MIN_CACHE_BITS) |
|
|
|
return show_bits(s, n); |
|
|
|
else { |
|
|
|
GetBitContext gb = *s; |
|
|
|
return get_bits_long(&gb, n); |
|
|
|
@@ -332,8 +348,8 @@ static inline int check_marker(GetBitContext *s, const char *msg) |
|
|
|
* While GetBitContext stores the buffer size, for performance reasons you are |
|
|
|
* responsible for checking for the buffer end yourself (take advantage of the padding)! |
|
|
|
*/ |
|
|
|
static inline void init_get_bits(GetBitContext *s, |
|
|
|
const uint8_t *buffer, int bit_size) |
|
|
|
static inline void init_get_bits(GetBitContext *s, const uint8_t *buffer, |
|
|
|
int bit_size) |
|
|
|
{ |
|
|
|
int buffer_size = (bit_size+7)>>3; |
|
|
|
if (buffer_size < 0 || bit_size < 0) { |
|
|
|
@@ -387,7 +403,8 @@ void free_vlc(VLC *vlc); |
|
|
|
* If the vlc code is invalid and max_depth>1, then the number of bits removed |
|
|
|
* is undefined. |
|
|
|
*/ |
|
|
|
#define GET_VLC(code, name, gb, table, bits, max_depth) do { \ |
|
|
|
#define GET_VLC(code, name, gb, table, bits, max_depth) \ |
|
|
|
do { \ |
|
|
|
int n, nb_bits; \ |
|
|
|
unsigned int index; \ |
|
|
|
\ |
|
|
|
@@ -418,7 +435,8 @@ void free_vlc(VLC *vlc); |
|
|
|
SKIP_BITS(name, gb, n); \ |
|
|
|
} while (0) |
|
|
|
|
|
|
|
#define GET_RL_VLC(level, run, name, gb, table, bits, max_depth, need_update) do { \ |
|
|
|
#define GET_RL_VLC(level, run, name, gb, table, bits, max_depth, need_update) \ |
|
|
|
do { \ |
|
|
|
int n, nb_bits; \ |
|
|
|
unsigned int index; \ |
|
|
|
\ |
|
|
|
@@ -452,7 +470,7 @@ void free_vlc(VLC *vlc); |
|
|
|
* = (max_vlc_length + bits - 1) / bits |
|
|
|
*/ |
|
|
|
static av_always_inline int get_vlc2(GetBitContext *s, VLC_TYPE (*table)[2], |
|
|
|
int bits, int max_depth) |
|
|
|
int bits, int max_depth) |
|
|
|
{ |
|
|
|
int code; |
|
|
|
|
|
|
|
@@ -465,7 +483,8 @@ static av_always_inline int get_vlc2(GetBitContext *s, VLC_TYPE (*table)[2], |
|
|
|
return code; |
|
|
|
} |
|
|
|
|
|
|
|
static inline int decode012(GetBitContext *gb){ |
|
|
|
static inline int decode012(GetBitContext *gb) |
|
|
|
{ |
|
|
|
int n; |
|
|
|
n = get_bits1(gb); |
|
|
|
if (n == 0) |
|
|
|
@@ -474,7 +493,8 @@ static inline int decode012(GetBitContext *gb){ |
|
|
|
return get_bits1(gb) + 1; |
|
|
|
} |
|
|
|
|
|
|
|
static inline int decode210(GetBitContext *gb){ |
|
|
|
static inline int decode210(GetBitContext *gb) |
|
|
|
{ |
|
|
|
if (get_bits1(gb)) |
|
|
|
return 0; |
|
|
|
else |
|
|
|
@@ -489,7 +509,8 @@ static inline int get_bits_left(GetBitContext *gb) |
|
|
|
//#define TRACE |
|
|
|
|
|
|
|
#ifdef TRACE |
|
|
|
static inline void print_bin(int bits, int n){ |
|
|
|
static inline void print_bin(int bits, int n) |
|
|
|
{ |
|
|
|
int i; |
|
|
|
|
|
|
|
for (i = n-1; i >= 0; i--) { |
|
|
|
@@ -500,7 +521,8 @@ static inline void print_bin(int bits, int n){ |
|
|
|
} |
|
|
|
|
|
|
|
static inline int get_bits_trace(GetBitContext *s, int n, char *file, |
|
|
|
const char *func, int line){ |
|
|
|
const char *func, int line) |
|
|
|
{ |
|
|
|
int r = get_bits(s, n); |
|
|
|
|
|
|
|
print_bin(r, n); |
|
|
|
@@ -510,7 +532,8 @@ static inline int get_bits_trace(GetBitContext *s, int n, char *file, |
|
|
|
} |
|
|
|
static inline int get_vlc_trace(GetBitContext *s, VLC_TYPE (*table)[2], |
|
|
|
int bits, int max_depth, char *file, |
|
|
|
const char *func, int line){ |
|
|
|
const char *func, int line) |
|
|
|
{ |
|
|
|
int show = show_bits(s, 24); |
|
|
|
int pos = get_bits_count(s); |
|
|
|
int r = get_vlc2(s, table, bits, max_depth); |
|
|
|
@@ -524,7 +547,8 @@ static inline int get_vlc_trace(GetBitContext *s, VLC_TYPE (*table)[2], |
|
|
|
return r; |
|
|
|
} |
|
|
|
static inline int get_xbits_trace(GetBitContext *s, int n, char *file, |
|
|
|
const char *func, int line){ |
|
|
|
const char *func, int line) |
|
|
|
{ |
|
|
|
int show = show_bits(s, n); |
|
|
|
int r = get_xbits(s, n); |
|
|
|
|
|
|
|
|