📄 cabac.c
字号:
0, 0, 1, 2, 2, 4, 4, 5, 6, 7, 8, 9, 9,11,11,12, 13,13,15,15,16,16,18,18,19,19,21,21,22,22,23,24, 24,25,26,26,27,27,28,29,29,30,30,30,31,32,32,33, 33,33,34,34,35,35,35,36,36,36,37,37,37,38,38,63};static const int x264_transition_mps[64] ={ 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16, 17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32, 33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48, 49,50,51,52,53,54,55,56,57,58,59,60,61,62,62,63,};#define FIX8(f) ((int)(f*(1<<8)))static int x264_cabac_probability[128] ={ FIX8(0.9812), FIX8(0.9802), FIX8(0.9792), FIX8(0.9781), FIX8(0.9769), FIX8(0.9757), FIX8(0.9744), FIX8(0.9730), FIX8(0.9716), FIX8(0.9700), FIX8(0.9684), FIX8(0.9667), FIX8(0.9650), FIX8(0.9631), FIX8(0.9611), FIX8(0.9590), FIX8(0.9568), FIX8(0.9545), FIX8(0.9521), FIX8(0.9495), FIX8(0.9468), FIX8(0.9440), FIX8(0.9410), FIX8(0.9378), FIX8(0.9345), FIX8(0.9310), FIX8(0.9273), FIX8(0.9234), FIX8(0.9193), FIX8(0.9150), FIX8(0.9105), FIX8(0.9057), FIX8(0.9006), FIX8(0.8953), FIX8(0.8897), FIX8(0.8838), FIX8(0.8776), FIX8(0.8710), FIX8(0.8641), FIX8(0.8569), FIX8(0.8492), FIX8(0.8411), FIX8(0.8326), FIX8(0.8237), FIX8(0.8143), FIX8(0.8043), FIX8(0.7938), FIX8(0.7828), FIX8(0.7712), FIX8(0.7590), FIX8(0.7461), FIX8(0.7325), FIX8(0.7182), FIX8(0.7031), FIX8(0.6872), FIX8(0.6705), FIX8(0.6528), FIX8(0.6343), FIX8(0.6147), FIX8(0.5941), FIX8(0.5724), FIX8(0.5495), FIX8(0.5254), FIX8(0.5000), FIX8(0.5000), FIX8(0.4746), FIX8(0.4505), FIX8(0.4276), FIX8(0.4059), FIX8(0.3853), FIX8(0.3657), FIX8(0.3472), FIX8(0.3295), FIX8(0.3128), FIX8(0.2969), FIX8(0.2818), FIX8(0.2675), FIX8(0.2539), FIX8(0.2410), FIX8(0.2288), FIX8(0.2172), FIX8(0.2062), FIX8(0.1957), FIX8(0.1857), FIX8(0.1763), FIX8(0.1674), FIX8(0.1589), FIX8(0.1508), FIX8(0.1431), FIX8(0.1359), FIX8(0.1290), FIX8(0.1224), FIX8(0.1162), FIX8(0.1103), FIX8(0.1047), FIX8(0.0994), FIX8(0.0943), FIX8(0.0895), FIX8(0.0850), FIX8(0.0807), FIX8(0.0766), FIX8(0.0727), FIX8(0.0690), FIX8(0.0655), FIX8(0.0622), FIX8(0.0590), FIX8(0.0560), FIX8(0.0532), FIX8(0.0505), FIX8(0.0479), FIX8(0.0455), FIX8(0.0432), FIX8(0.0410), FIX8(0.0389), FIX8(0.0369), FIX8(0.0350), FIX8(0.0333), FIX8(0.0316), FIX8(0.0300), FIX8(0.0284), FIX8(0.0270), FIX8(0.0256), FIX8(0.0243), FIX8(0.0231), FIX8(0.0219), FIX8(0.0208), FIX8(0.0198), FIX8(0.0187)};/* -ln2(probability) */static int x264_cabac_entropy[128] ={ FIX8(0.0273), FIX8(0.0288), FIX8(0.0303), FIX8(0.0320), FIX8(0.0337), FIX8(0.0355), FIX8(0.0375), FIX8(0.0395), FIX8(0.0416), FIX8(0.0439), FIX8(0.0463), FIX8(0.0488), FIX8(0.0515), FIX8(0.0543), FIX8(0.0572), FIX8(0.0604), FIX8(0.0637), FIX8(0.0671), FIX8(0.0708), FIX8(0.0747), FIX8(0.0788), FIX8(0.0832), FIX8(0.0878), FIX8(0.0926), FIX8(0.0977), FIX8(0.1032), FIX8(0.1089), FIX8(0.1149), FIX8(0.1214), FIX8(0.1282), FIX8(0.1353), FIX8(0.1429), FIX8(0.1510), FIX8(0.1596), FIX8(0.1686), FIX8(0.1782), FIX8(0.1884), FIX8(0.1992), FIX8(0.2107), FIX8(0.2229), FIX8(0.2358), FIX8(0.2496), FIX8(0.2642), FIX8(0.2798), FIX8(0.2964), FIX8(0.3142), FIX8(0.3331), FIX8(0.3532), FIX8(0.3748), FIX8(0.3979), FIX8(0.4226), FIX8(0.4491), FIX8(0.4776), FIX8(0.5082), FIX8(0.5412), FIX8(0.5768), FIX8(0.6152), FIX8(0.6568), FIX8(0.7020), FIX8(0.7513), FIX8(0.8050), FIX8(0.8638), FIX8(0.9285), FIX8(1.0000), FIX8(1.0000), FIX8(1.0752), FIX8(1.1504), FIX8(1.2256), FIX8(1.3008), FIX8(1.3759), FIX8(1.4511), FIX8(1.5263), FIX8(1.6015), FIX8(1.6767), FIX8(1.7519), FIX8(1.8271), FIX8(1.9023), FIX8(1.9775), FIX8(2.0527), FIX8(2.1278), FIX8(2.2030), FIX8(2.2782), FIX8(2.3534), FIX8(2.4286), FIX8(2.5038), FIX8(2.5790), FIX8(2.6542), FIX8(2.7294), FIX8(2.8046), FIX8(2.8797), FIX8(2.9549), FIX8(3.0301), FIX8(3.1053), FIX8(3.1805), FIX8(3.2557), FIX8(3.3309), FIX8(3.4061), FIX8(3.4813), FIX8(3.5565), FIX8(3.6316), FIX8(3.7068), FIX8(3.7820), FIX8(3.8572), FIX8(3.9324), FIX8(4.0076), FIX8(4.0828), FIX8(4.1580), FIX8(4.2332), FIX8(4.3083), FIX8(4.3836), FIX8(4.4588), FIX8(4.5339), FIX8(4.6091), FIX8(4.6843), FIX8(4.7595), FIX8(4.8347), FIX8(4.9099), FIX8(4.9851), FIX8(5.0602), FIX8(5.1354), FIX8(5.2106), FIX8(5.2859), FIX8(5.3610), FIX8(5.4362), FIX8(5.5114), FIX8(5.5866), FIX8(5.6618), FIX8(5.7370)};#undef FIX8/***************************************************************************** * *****************************************************************************/void x264_cabac_context_init( x264_cabac_t *cb, int i_slice_type, int i_qp, int i_model ){ const int (*cabac_context_init)[399][2]; int i; if( i_slice_type == SLICE_TYPE_I ) { cabac_context_init = &x264_cabac_context_init_I; } else { cabac_context_init = &x264_cabac_context_init_PB[i_model]; } for( i = 0; i < 399; i++ ) { int i_pre_state; i_pre_state = x264_clip3( (((*cabac_context_init)[i][0] * i_qp) >> 4) + (*cabac_context_init)[i][1], 1, 126 ); if( i_pre_state <= 63 ) { cb->ctxstate[i].i_state = 63 - i_pre_state; cb->ctxstate[i].i_mps = 0; } else { cb->ctxstate[i].i_state = i_pre_state - 64; cb->ctxstate[i].i_mps = 1; } cb->ctxstate[i].i_count = 0; }}/***************************************************************************** * *****************************************************************************/void x264_cabac_decode_init( x264_cabac_t *cb, bs_t *s ){ cb->i_range = 0x01fe; cb->i_low = bs_read( s, 9 ); cb->s = s;}static inline void x264_cabac_decode_renorm( x264_cabac_t *cb ){ //printf(" \nbefore renorm %d %d",*cb->s->p,cb->s->i_left); while( cb->i_range < 0x0100 ) { cb->i_range <<= 1; cb->i_low = ( cb->i_low << 1 )|bs_read( cb->s, 1 ); } //printf(" \nafter renorm %d %d",*cb->s->p,cb->s->i_left);}/*static inline void x264_cabac_decode_renorm( x264_cabac_t *cb ){ while( cb->i_range < 0x0100 ) { cb->i_range <<= 1; if (--cb->s->i_left< 0) { // get_byte(); cb->s->p = cb->s->p_start++; cb->s->i_left = 7; } cb->i_low = (cb->i_low << 1) | (((*cb->s->p)>>(cb->s->i_left)) & 0x01); }}*/int x264_cabac_decode_decision( x264_cabac_t *cb, int i_ctx ){ int i_state = cb->ctxstate[i_ctx].i_state; int i_mps = cb->ctxstate[i_ctx].i_mps; int count = cb->ctxstate[i_ctx].i_count; int i_range_lps = x264_cabac_range_lps[i_state][(cb->i_range>>6)&0x03]; int val; // printf("\n count %d", count); cb->i_range -= i_range_lps;
if( cb->i_low >= cb->i_range ) { val = 1 - i_mps; cb->i_low -= cb->i_range; cb->i_range= i_range_lps; if( i_state == 0 ) { cb->ctxstate[i_ctx].i_mps ^= 0x01; } cb->ctxstate[i_ctx].i_state = x264_transition_lps[i_state]; } else { val = i_mps; cb->ctxstate[i_ctx].i_state = x264_transition_mps[i_state]; } //printf("\n before renorm %d %d",cb->s->i_left,*cb->s->p); x264_cabac_decode_renorm( cb ); //printf("\n after renorm %d %d",cb->s->i_left,*cb->s->p); return val;}int x264_cabac_decode_bypass( x264_cabac_t *cb ){ cb->i_low = (cb->i_low << 1)|bs_read( cb->s, 1 ); if( cb->i_low >= cb->i_range ) { cb->i_low -= cb->i_range; return 1; } return 0;}int x264_cabac_decode_terminal( x264_cabac_t *cb ){ if( cb->i_low >= cb->i_range - 2 ) { return 1; } cb->i_range -= 2; x264_cabac_decode_renorm( cb ); return 0;}void x264_cabac_model_init( x264_cabac_t *cb ){ int i; for( i = 0; i < 3; i++ ) { cb->slice[i].i_model = 0; cb->slice[i].i_cost = -1; }}int x264_cabac_model_get ( x264_cabac_t *cb, int i_slice_type ){ return cb->slice[i_slice_type].i_model;}void x264_cabac_model_update( x264_cabac_t *cb, int i_slice_type, int i_qp ){ int i; if( i_slice_type == SLICE_TYPE_I ) { return; } cb->slice[i_slice_type].i_cost = -1; for( i = 0; i < 3; i++ ) { int i_ctx; int i_cost; i_cost = 0; /* fix8 */ for( i_ctx = 0; i_ctx < 399; i_ctx++ ) { int i_weight; int i_model_state; int i_ctx_state; i_weight = X264_MIN( (1<<8), (cb->ctxstate[i_ctx].i_count<<8) / 32 ); i_model_state = x264_clip3( ((x264_cabac_context_init_PB[i][i_ctx][0] * i_qp)>>4) + x264_cabac_context_init_PB[i][i_ctx][1], 0, 127 ); i_ctx_state = cb->ctxstate[i_ctx].i_mps ? 64 + cb->ctxstate[i_ctx].i_state : 63 - cb->ctxstate[i_ctx].i_state; i_cost += (i_weight * (( x264_cabac_probability[ i_ctx_state] * x264_cabac_entropy[ i_model_state] + x264_cabac_probability[127 - i_ctx_state] * x264_cabac_entropy[127 - i_model_state] ) >> 8))>>8; } if( cb->slice[i_slice_type].i_cost == -1 || cb->slice[i_slice_type].i_cost > i_cost ) { cb->slice[i_slice_type].i_model= i; cb->slice[i_slice_type].i_cost = i_cost; } }}static inline void x264_cabac_putbit( x264_cabac_t *cb, int b ){ if( cb->b_first_bit ) { cb->b_first_bit = 0; } else { bs_write1( cb->s, b ); } while( cb->i_bits_outstanding > 0 ) { bs_write1( cb->s, 1 - b ); cb->i_bits_outstanding--; }}/***************************************************************************** * *****************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -