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

📄 cabac.c

📁 Linux环境下做的x264的全部源码
💻 C
📖 第 1 页 / 共 3 页
字号:
        {  -6,  68 }, { -10,  79 },        /* 436 -> 459 */        {  -3,  78 }, {  -8,  74 }, {  -9,  72 }, { -10,  72 },        { -18,  75 }, { -12,  71 }, { -11,  63 }, {  -5,  70 },        { -17,  75 }, { -14,  72 }, { -16,  67 }, {  -8,  53 },        { -14,  59 }, {  -9,  52 }, { -11,  68 }, {   9,  -2 },        {  30, -10 }, {  31,  -4 }, {  33,  -1 }, {  33,   7 },        {  31,  12 }, {  37,  23 }, {  31,  38 }, {  20,  64 },    }};/* FIXME could avoid this duplication by reversing the order of states * with MPS=0, but that would uglify the other tables */static const uint8_t x264_cabac_range_lps[128][4] ={    {   2,   2,   2,   2 },    {   6,   7,   8,   9 }, {   6,   7,   9,  10 }, {   6,   8,   9,  11 },    {   7,   8,  10,  11 }, {   7,   9,  10,  12 }, {   7,   9,  11,  12 },    {   8,   9,  11,  13 }, {   8,  10,  12,  14 }, {   9,  11,  12,  14 },    {   9,  11,  13,  15 }, {  10,  12,  14,  16 }, {  10,  12,  15,  17 },    {  11,  13,  15,  18 }, {  11,  14,  16,  19 }, {  12,  14,  17,  20 },    {  12,  15,  18,  21 }, {  13,  16,  19,  22 }, {  14,  17,  20,  23 },    {  14,  18,  21,  24 }, {  15,  19,  22,  25 }, {  16,  20,  23,  27 },    {  17,  21,  25,  28 }, {  18,  22,  26,  30 }, {  19,  23,  27,  31 },    {  20,  24,  29,  33 }, {  21,  26,  30,  35 }, {  22,  27,  32,  37 },    {  23,  28,  33,  39 }, {  24,  30,  35,  41 }, {  26,  31,  37,  43 },    {  27,  33,  39,  45 }, {  29,  35,  41,  48 }, {  30,  37,  43,  50 },    {  32,  39,  46,  53 }, {  33,  41,  48,  56 }, {  35,  43,  51,  59 },    {  37,  45,  54,  62 }, {  39,  48,  56,  65 }, {  41,  50,  59,  69 },    {  43,  53,  63,  72 }, {  46,  56,  66,  76 }, {  48,  59,  69,  80 },    {  51,  62,  73,  85 }, {  53,  65,  77,  89 }, {  56,  69,  81,  94 },    {  59,  72,  86,  99 }, {  62,  76,  90, 104 }, {  66,  80,  95, 110 },    {  69,  85, 100, 116 }, {  73,  89, 105, 122 }, {  77,  94, 111, 128 },    {  81,  99, 117, 135 }, {  85, 104, 123, 142 }, {  90, 110, 130, 150 },    {  95, 116, 137, 158 }, { 100, 122, 144, 166 }, { 105, 128, 152, 175 },    { 111, 135, 160, 185 }, { 116, 142, 169, 195 }, { 123, 150, 178, 205 },    { 128, 158, 187, 216 }, { 128, 167, 197, 227 }, { 128, 176, 208, 240 },    { 128, 176, 208, 240 }, { 128, 167, 197, 227 }, { 128, 158, 187, 216 },    { 123, 150, 178, 205 }, { 116, 142, 169, 195 }, { 111, 135, 160, 185 },    { 105, 128, 152, 175 }, { 100, 122, 144, 166 }, {  95, 116, 137, 158 },    {  90, 110, 130, 150 }, {  85, 104, 123, 142 }, {  81,  99, 117, 135 },    {  77,  94, 111, 128 }, {  73,  89, 105, 122 }, {  69,  85, 100, 116 },    {  66,  80,  95, 110 }, {  62,  76,  90, 104 }, {  59,  72,  86,  99 },    {  56,  69,  81,  94 }, {  53,  65,  77,  89 }, {  51,  62,  73,  85 },    {  48,  59,  69,  80 }, {  46,  56,  66,  76 }, {  43,  53,  63,  72 },    {  41,  50,  59,  69 }, {  39,  48,  56,  65 }, {  37,  45,  54,  62 },    {  35,  43,  51,  59 }, {  33,  41,  48,  56 }, {  32,  39,  46,  53 },    {  30,  37,  43,  50 }, {  29,  35,  41,  48 }, {  27,  33,  39,  45 },    {  26,  31,  37,  43 }, {  24,  30,  35,  41 }, {  23,  28,  33,  39 },    {  22,  27,  32,  37 }, {  21,  26,  30,  35 }, {  20,  24,  29,  33 },    {  19,  23,  27,  31 }, {  18,  22,  26,  30 }, {  17,  21,  25,  28 },    {  16,  20,  23,  27 }, {  15,  19,  22,  25 }, {  14,  18,  21,  24 },    {  14,  17,  20,  23 }, {  13,  16,  19,  22 }, {  12,  15,  18,  21 },    {  12,  14,  17,  20 }, {  11,  14,  16,  19 }, {  11,  13,  15,  18 },    {  10,  12,  15,  17 }, {  10,  12,  14,  16 }, {   9,  11,  13,  15 },    {   9,  11,  12,  14 }, {   8,  10,  12,  14 }, {   8,   9,  11,  13 },    {   7,   9,  11,  12 }, {   7,   9,  10,  12 }, {   7,   8,  10,  11 },    {   6,   8,   9,  11 }, {   6,   7,   9,  10 }, {   6,   7,   8,   9 },    {   2,   2,   2,   2 },};static const uint8_t x264_cabac_transition[2][128] ={{      0,  1,  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,     63, 64, 65, 66, 66, 68, 68, 69, 70, 71, 72, 73, 73, 75, 75, 76,     77, 77, 79, 79, 80, 80, 82, 82, 83, 83, 85, 85, 86, 86, 87, 88,     88, 89, 90, 90, 91, 91, 92, 93, 93, 94, 94, 94, 95, 96, 96, 97,     97, 97, 98, 98, 99, 99, 99,100,100,100,101,101,101,102,102,127,},{      0, 25, 25, 26, 26, 26, 27, 27, 27, 28, 28, 28, 29, 29, 30, 30,     30, 31, 31, 32, 33, 33, 33, 34, 34, 35, 36, 36, 37, 37, 38, 39,     39, 40, 41, 41, 42, 42, 44, 44, 45, 45, 47, 47, 48, 48, 50, 50,     51, 52, 52, 54, 54, 55, 56, 57, 58, 59, 59, 61, 61, 62, 63, 64,     65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,     81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96,     97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,112,    113,114,115,116,117,118,119,120,121,122,123,124,125,126,126,127,}};static const uint8_t renorm_shift[64]= { 6,5,4,4,3,3,3,3,2,2,2,2,2,2,2,2, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,};static const uint8_t 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 const uint16_t 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)};/***************************************************************************** * *****************************************************************************/void x264_cabac_context_init( x264_cabac_t *cb, int i_slice_type, int i_qp, int i_model ){    const int8_t (*cabac_context_init)[460][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 < 460; i++ )    {        cb->state[i] = x264_clip3( (((*cabac_context_init)[i][0] * i_qp) >> 4) + (*cabac_context_init)[i][1], 1, 126 );    }}void x264_cabac_encode_init( x264_cabac_t *cb, uint8_t *p_data, uint8_t *p_end ){    cb->i_low   = 0;    cb->i_range = 0x01FE;    cb->i_queue = -1; // the first bit will be shifted away and not written    cb->i_bytes_outstanding = 0;    cb->p_start = p_data;    cb->p       = p_data;    cb->p_end   = p_end;}static inline void x264_cabac_putbyte( x264_cabac_t *cb ){    if( cb->i_queue >= 8 )    {        int out = cb->i_low >> (cb->i_queue+2);        cb->i_low &= (4<<cb->i_queue)-1;        cb->i_queue -= 8;        if( (out & 0xff) == 0xff )        {            cb->i_bytes_outstanding++;        }        else        {            int carry = out & 0x100;            if( cb->p + cb->i_bytes_outstanding + 1 >= cb->p_end )                return;            if( carry )            {                // this can't happen on the first byte (buffer underrun),                // because that would correspond to a probability > 1.                // this can't carry beyond the one byte, because any 0xff bytes                // are in bytes_outstanding and thus not written yet.                cb->p[-1]++;            }            while( cb->i_bytes_outstanding > 0 )            {                *(cb->p++) = carry ? 0 : 0xff;                cb->i_bytes_outstanding--;            }            *(cb->p++) = out;        }    }}static inline void x264_cabac_encode_renorm( x264_cabac_t *cb ){    int shift = renorm_shift[cb->i_range>>3];    cb->i_range <<= shift;    cb->i_low   <<= shift;    cb->i_queue  += shift;    x264_cabac_putbyte( cb );}void x264_cabac_encode_decision( x264_cabac_t *cb, int i_ctx, int b ){    int i_state = cb->state[i_ctx];    int i_range_lps = x264_cabac_range_lps[i_state][(cb->i_range>>6)&0x03];    cb->i_range -= i_range_lps;    if( b != (i_state >> 6) )    {        cb->i_low += cb->i_range;        cb->i_range = i_range_lps;    }    cb->state[i_ctx] = x264_cabac_transition[b][i_state];    x264_cabac_encode_renorm( cb );}void x264_cabac_encode_bypass( x264_cabac_t *cb, int b ){    cb->i_low <<= 1;    cb->i_low += (((int32_t)b<<31)>>31) & cb->i_range;    cb->i_queue += 1;    x264_cabac_putbyte( cb );}void x264_cabac_encode_terminal( x264_cabac_t *cb, int b ){    cb->i_range -= 2;    if( b )    {        cb->i_low += cb->i_range;        cb->i_range  = 2<<7;        cb->i_low  <<= 7;        cb->i_queue += 7;        x264_cabac_putbyte( cb );    }    else    {        x264_cabac_encode_renorm( cb );    }}void x264_cabac_encode_flush( x264_cabac_t *cb ){    cb->i_low |= 0x80;    cb->i_low <<= 10;    cb->i_queue += 10;    x264_cabac_putbyte( cb );    x264_cabac_putbyte( cb );    cb->i_queue = 0;    if( cb->p + cb->i_bytes_outstanding + 1 >= cb->p_end )        return; //FIXME throw an error instead of silently truncating the frame    while( cb->i_bytes_outstanding > 0 )    {        *(cb->p++) = 0xff;        cb->i_bytes_outstanding--;    }}/***************************************************************************** * *****************************************************************************/void x264_cabac_size_decision( x264_cabac_t *cb, int i_ctx, int b ){    int i_state = cb->state[i_ctx];    cb->state[i_ctx] = x264_cabac_transition[b][i_state];    cb->f8_bits_encoded += x264_cabac_entropy[ b ? 127 - i_state : i_state ];}int x264_cabac_size_decision2( uint8_t *state, int b ){    int i_state = *state;    *state = x264_cabac_transition[b][i_state];    return x264_cabac_entropy[ b ? 127 - i_state : i_state ];}int x264_cabac_size_decision_noup( uint8_t *state, int b ){    return x264_cabac_entropy[ b ? 127 - *state : *state ];}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -