⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cabac.c

📁 另一个版本的x264的decoder
💻 C
📖 第 1 页 / 共 3 页
字号:
     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 + -