26 #ifndef AVCODEC_GET_BITS_H 
   27 #define AVCODEC_GET_BITS_H 
   50 #ifndef UNCHECKED_BITSTREAM_READER 
   51 #define UNCHECKED_BITSTREAM_READER !CONFIG_SAFE_BITSTREAM_READER 
   61 #define VLC_TYPE int16_t 
  122 #ifdef LONG_BITSTREAM_READER 
  123 #   define MIN_CACHE_BITS 32 
  125 #   define MIN_CACHE_BITS 25 
  128 #define OPEN_READER_NOSIZE(name, gb)            \ 
  129     unsigned int name ## _index = (gb)->index;  \ 
  130     unsigned int av_unused name ## _cache 
  132 #if UNCHECKED_BITSTREAM_READER 
  133 #define OPEN_READER(name, gb) OPEN_READER_NOSIZE(name, gb) 
  135 #define BITS_AVAILABLE(name, gb) 1 
  137 #define OPEN_READER(name, gb)                   \ 
  138     OPEN_READER_NOSIZE(name, gb);               \ 
  139     unsigned int name ## _size_plus8 = (gb)->size_in_bits_plus8 
  141 #define BITS_AVAILABLE(name, gb) name ## _index < name ## _size_plus8 
  144 #define CLOSE_READER(name, gb) (gb)->index = name ## _index 
  146 # ifdef LONG_BITSTREAM_READER 
  148 # define UPDATE_CACHE_LE(name, gb) name ## _cache = \ 
  149       AV_RL64((gb)->buffer + (name ## _index >> 3)) >> (name ## _index & 7) 
  151 # define UPDATE_CACHE_BE(name, gb) name ## _cache = \ 
  152       AV_RB64((gb)->buffer + (name ## _index >> 3)) >> (32 - (name ## _index & 7)) 
  156 # define UPDATE_CACHE_LE(name, gb) name ## _cache = \ 
  157       AV_RL32((gb)->buffer + (name ## _index >> 3)) >> (name ## _index & 7) 
  159 # define UPDATE_CACHE_BE(name, gb) name ## _cache = \ 
  160       AV_RB32((gb)->buffer + (name ## _index >> 3)) << (name ## _index & 7) 
  165 #ifdef BITSTREAM_READER_LE 
  167 # define UPDATE_CACHE(name, gb) UPDATE_CACHE_LE(name, gb) 
  169 # define SKIP_CACHE(name, gb, num) name ## _cache >>= (num) 
  173 # define UPDATE_CACHE(name, gb) UPDATE_CACHE_BE(name, gb) 
  175 # define SKIP_CACHE(name, gb, num) name ## _cache <<= (num) 
  179 #if UNCHECKED_BITSTREAM_READER 
  180 #   define SKIP_COUNTER(name, gb, num) name ## _index += (num) 
  182 #   define SKIP_COUNTER(name, gb, num) \ 
  183     name ## _index = FFMIN(name ## _size_plus8, name ## _index + (num)) 
  186 #define BITS_LEFT(name, gb) ((int)((gb)->size_in_bits - name ## _index)) 
  188 #define SKIP_BITS(name, gb, num)                \ 
  190         SKIP_CACHE(name, gb, num);              \ 
  191         SKIP_COUNTER(name, gb, num);            \ 
  194 #define LAST_SKIP_BITS(name, gb, num) SKIP_COUNTER(name, gb, num) 
  196 #define SHOW_UBITS_LE(name, gb, num) zero_extend(name ## _cache, num) 
  197 #define SHOW_SBITS_LE(name, gb, num) sign_extend(name ## _cache, num) 
  199 #define SHOW_UBITS_BE(name, gb, num) NEG_USR32(name ## _cache, num) 
  200 #define SHOW_SBITS_BE(name, gb, num) NEG_SSR32(name ## _cache, num) 
  202 #ifdef BITSTREAM_READER_LE 
  203 #   define SHOW_UBITS(name, gb, num) SHOW_UBITS_LE(name, gb, num) 
  204 #   define SHOW_SBITS(name, gb, num) SHOW_SBITS_LE(name, gb, num) 
  206 #   define SHOW_UBITS(name, gb, num) SHOW_UBITS_BE(name, gb, num) 
  207 #   define SHOW_SBITS(name, gb, num) SHOW_SBITS_BE(name, gb, num) 
  210 #define GET_CACHE(name, gb) ((uint32_t) name ## _cache) 
  219 #if UNCHECKED_BITSTREAM_READER 
  242     return (
NEG_USR32(sign ^ cache, n) ^ sign) - sign;
 
  308 #ifdef BITSTREAM_READER_LE 
  309     result >>= index & 7;
 
  312     result <<= index & 7;
 
  315 #if !UNCHECKED_BITSTREAM_READER 
  344 #ifdef BITSTREAM_READER_LE 
  346         return ret | (
get_bits(s, n - 16) << 16);
 
  348         unsigned ret = 
get_bits(s, 16) << (n - 16);
 
  362 #ifdef BITSTREAM_READER_LE 
  416     if (bit_size >= INT_MAX - 7 || bit_size < 0 || !buffer) {
 
  422     buffer_size = (bit_size + 7) >> 3;
 
  444     if (byte_size > INT_MAX / 8 || byte_size < 0)
 
  457 #define init_vlc(vlc, nb_bits, nb_codes,                \ 
  458                  bits, bits_wrap, bits_size,            \ 
  459                  codes, codes_wrap, codes_size,         \ 
  461     ff_init_vlc_sparse(vlc, nb_bits, nb_codes,          \ 
  462                        bits, bits_wrap, bits_size,      \ 
  463                        codes, codes_wrap, codes_size,   \ 
  467                        const void *
bits, 
int bits_wrap, 
int bits_size,
 
  468                        const void *codes, 
int codes_wrap, 
int codes_size,
 
  469                        const void *symbols, 
int symbols_wrap, 
int symbols_size,
 
  473 #define INIT_VLC_LE             2 
  474 #define INIT_VLC_USE_NEW_STATIC 4 
  476 #define INIT_VLC_STATIC(vlc, bits, a, b, c, d, e, f, g, static_size)       \ 
  478         static VLC_TYPE table[static_size][2];                             \ 
  479         (vlc)->table           = table;                                    \ 
  480         (vlc)->table_allocated = static_size;                              \ 
  481         init_vlc(vlc, bits, a, b, c, d, e, f, g, INIT_VLC_USE_NEW_STATIC); \ 
  489 #define GET_VLC(code, name, gb, table, bits, max_depth)         \ 
  492         unsigned int index;                                     \ 
  494         index = SHOW_UBITS(name, gb, bits);                     \ 
  495         code  = table[index][0];                                \ 
  496         n     = table[index][1];                                \ 
  498         if (max_depth > 1 && n < 0) {                           \ 
  499             LAST_SKIP_BITS(name, gb, bits);                     \ 
  500             UPDATE_CACHE(name, gb);                             \ 
  504             index = SHOW_UBITS(name, gb, nb_bits) + code;       \ 
  505             code  = table[index][0];                            \ 
  506             n     = table[index][1];                            \ 
  507             if (max_depth > 2 && n < 0) {                       \ 
  508                 LAST_SKIP_BITS(name, gb, nb_bits);              \ 
  509                 UPDATE_CACHE(name, gb);                         \ 
  513                 index = SHOW_UBITS(name, gb, nb_bits) + code;   \ 
  514                 code  = table[index][0];                        \ 
  515                 n     = table[index][1];                        \ 
  518         SKIP_BITS(name, gb, n);                                 \ 
  521 #define GET_RL_VLC_INTERNAL(level, run, name, gb, table, bits,  \ 
  522                    max_depth, need_update)                      \ 
  525         unsigned int index;                                     \ 
  527         index = SHOW_UBITS(name, gb, bits);                     \ 
  528         level = table[index].level;                             \ 
  529         n     = table[index].len;                               \ 
  531         if (max_depth > 1 && n < 0) {                           \ 
  532             SKIP_BITS(name, gb, bits);                          \ 
  534                 UPDATE_CACHE(name, gb);                         \ 
  539             index = SHOW_UBITS(name, gb, nb_bits) + level;      \ 
  540             level = table[index].level;                         \ 
  541             n     = table[index].len;                           \ 
  543         run = table[index].run;                                 \ 
  544         SKIP_BITS(name, gb, n);                                 \ 
  556                                      int bits, 
int max_depth)
 
  610 static inline void print_bin(
int bits, 
int n)
 
  614     for (i = n - 1; i >= 0; i--)
 
  616     for (i = n; i < 24; i++)
 
  620 static inline int get_bits_trace(
GetBitContext *s, 
int n, 
const char *file,
 
  633                                 int bits, 
int max_depth, 
const char *file,
 
  634                                 const char *func, 
int line)
 
  642     print_bin(bits2, len);
 
  645            bits2, len, r, pos, file, func, line);
 
  650 #define GET_RL_VLC(level, run, name, gb, table, bits,           \ 
  651                    max_depth, need_update)                      \ 
  653         int show  = SHOW_UBITS(name, gb, 24);                   \ 
  655         int pos = name ## _index;                               \ 
  657         GET_RL_VLC_INTERNAL(level, run, name, gb, table, bits,max_depth, need_update); \ 
  659         len = name ## _index - pos + 1;                         \ 
  660         show = show >> (24 - len);                              \ 
  662         print_bin(show, len);                                   \ 
  664         av_log(NULL, AV_LOG_DEBUG, "%5d %2d %3d/%-3d rlv @%5d in %s %s:%d\n",\ 
  665                show, len, run-1, level, pos, __FILE__, __PRETTY_FUNCTION__, __LINE__);\ 
  669 static inline int get_xbits_trace(
GetBitContext *s, 
int n, 
const char *file,
 
  670                                   const char *func, 
int line)
 
  682 #define get_bits(s, n)  get_bits_trace(s , n, __FILE__, __PRETTY_FUNCTION__, __LINE__) 
  683 #define get_bits1(s)    get_bits_trace(s,  1, __FILE__, __PRETTY_FUNCTION__, __LINE__) 
  684 #define get_xbits(s, n) get_xbits_trace(s, n, __FILE__, __PRETTY_FUNCTION__, __LINE__) 
  686 #define get_vlc(s, vlc)             get_vlc_trace(s, (vlc)->table, (vlc)->bits,   3, __FILE__, __PRETTY_FUNCTION__, __LINE__) 
  687 #define get_vlc2(s, tab, bits, max) get_vlc_trace(s,          tab,        bits, max, __FILE__, __PRETTY_FUNCTION__, __LINE__) 
  689 #define tprintf(p, ...) av_log(p, AV_LOG_DEBUG, __VA_ARGS__) 
  692 #define tprintf(p, ...) { } 
  693 #define GET_RL_VLC GET_RL_VLC_INTERNAL