27 #ifndef AVCODEC_CABAC_FUNCTIONS_H 28 #define AVCODEC_CABAC_FUNCTIONS_H 35 #ifndef UNCHECKED_BITSTREAM_READER 36 #define UNCHECKED_BITSTREAM_READER !CONFIG_SAFE_BITSTREAM_READER 40 # include "aarch64/cabac.h" 43 # include "arm/cabac.h" 46 # include "x86/cabac.h" 49 static const uint8_t *
const ff_h264_norm_shift = ff_h264_cabac_tables + H264_NORM_SHIFT_OFFSET;
50 static const uint8_t *
const ff_h264_lps_range = ff_h264_cabac_tables + H264_LPS_RANGE_OFFSET;
51 static const uint8_t *
const ff_h264_mlps_state = ff_h264_cabac_tables + H264_MLPS_STATE_OFFSET;
52 static const uint8_t *
const ff_h264_last_coeff_flag_offset_8x8 = ff_h264_cabac_tables + H264_LAST_COEFF_FLAG_OFFSET_8x8_OFFSET;
54 #if !defined(get_cabac_bypass) || !defined(get_cabac_terminate) 57 c->low+= (c->bytestream[0]<<9) + (c->bytestream[1]<<1);
59 c->low+= c->bytestream[0]<<1;
62 #if !UNCHECKED_BITSTREAM_READER 63 if (c->bytestream < c->bytestream_end)
65 c->bytestream += CABAC_BITS / 8;
69 #ifndef get_cabac_terminate 70 static inline void renorm_cabac_decoder_once(
CABACContext *c){
71 int shift= (uint32_t)(c->range - 0x100)>>31;
74 if(!(c->low & CABAC_MASK))
79 #ifndef get_cabac_inline 84 x= c->low ^ (c->low-1);
85 i= 7 - ff_h264_norm_shift[x>>(CABAC_BITS-1)];
87 i = ff_ctz(c->low) - CABAC_BITS;
93 x+= (c->bytestream[0]<<9) + (c->bytestream[1]<<1);
95 x+= c->bytestream[0]<<1;
99 #if !UNCHECKED_BITSTREAM_READER 100 if (c->bytestream < c->bytestream_end)
102 c->bytestream += CABAC_BITS/8;
106 #ifndef get_cabac_inline 107 static av_always_inline
int get_cabac_inline(
CABACContext *c, uint8_t *
const state){
109 int RangeLPS= ff_h264_lps_range[2*(c->range&0xC0) + s];
112 c->range -= RangeLPS;
113 lps_mask= ((c->range<<(CABAC_BITS+1)) - c->low)>>31;
115 c->low -= (c->range<<(CABAC_BITS+1)) & lps_mask;
116 c->range += (RangeLPS - c->range) & lps_mask;
119 *state= (ff_h264_mlps_state+128)[s];
122 lps_mask= ff_h264_norm_shift[c->range];
123 c->range<<= lps_mask;
125 if(!(c->low & CABAC_MASK))
131 static int av_noinline av_unused get_cabac_noinline(
CABACContext *c, uint8_t *
const state){
132 return get_cabac_inline(c,state);
135 static int av_unused get_cabac(
CABACContext *c, uint8_t *
const state){
136 return get_cabac_inline(c,state);
139 #ifndef get_cabac_bypass 144 if(!(c->low & CABAC_MASK))
147 range= c->range<<(CABAC_BITS+1);
157 #ifndef get_cabac_bypass_sign 158 static av_always_inline
int get_cabac_bypass_sign(
CABACContext *c,
int val){
162 if(!(c->low & CABAC_MASK))
165 range= c->range<<(CABAC_BITS+1);
170 return (val^mask)-mask;
177 #ifndef get_cabac_terminate 178 static int av_unused get_cabac_terminate(
CABACContext *c){
180 if(c->low < c->range<<(CABAC_BITS+1)){
181 renorm_cabac_decoder_once(c);
184 return c->bytestream - c->bytestream_start;
194 static av_unused
const uint8_t* skip_bytes(
CABACContext *c,
int n) {
195 const uint8_t *ptr = c->bytestream;
203 if ((
int) (c->bytestream_end - ptr) < n)
int ff_init_cabac_decoder(CABACContext *c, const uint8_t *buf, int buf_size)
Definition: cabac.c:177