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

📄 cabac.c

📁 H.264 source codes
💻 C
📖 第 1 页 / 共 3 页
字号:
        x264_cabac_encode_decision( &h->cabac,  60 + ctx, 1 );        if( ctx < 2 )            ctx = 2;        else            ctx = 3;        val--;    }    x264_cabac_encode_decision( &h->cabac,  60 + ctx, 0 );}void x264_cabac_mb_skip( x264_t *h, int b_skip ){    int ctx = 0;    if( h->mb.i_mb_x > 0 && !IS_SKIP( h->mb.type[h->mb.i_mb_xy -1]) )    {        ctx++;    }    if( h->mb.i_mb_y > 0 && !IS_SKIP( h->mb.type[h->mb.i_mb_xy -h->mb.i_mb_stride]) )    {        ctx++;    }    if( h->sh.i_type == SLICE_TYPE_P )        x264_cabac_encode_decision( &h->cabac, 11 + ctx, b_skip ? 1 : 0 );    else /* SLICE_TYPE_B */        x264_cabac_encode_decision( &h->cabac, 24 + ctx, b_skip ? 1 : 0 );}static inline void x264_cabac_mb_sub_p_partition( x264_t *h, int i_sub ){    if( i_sub == D_L0_8x8 )    {        x264_cabac_encode_decision( &h->cabac, 21, 1 );    }    else if( i_sub == D_L0_8x4 )    {        x264_cabac_encode_decision( &h->cabac, 21, 0 );        x264_cabac_encode_decision( &h->cabac, 22, 0 );    }    else if( i_sub == D_L0_4x8 )    {        x264_cabac_encode_decision( &h->cabac, 21, 0 );        x264_cabac_encode_decision( &h->cabac, 22, 1 );        x264_cabac_encode_decision( &h->cabac, 23, 1 );    }    else if( i_sub == D_L0_4x4 )    {        x264_cabac_encode_decision( &h->cabac, 21, 0 );        x264_cabac_encode_decision( &h->cabac, 22, 1 );        x264_cabac_encode_decision( &h->cabac, 23, 0 );    }}static inline void x264_cabac_mb_sub_b_partition( x264_t *h, int i_sub ){    if( i_sub == D_DIRECT_8x8 )    {        x264_cabac_encode_decision( &h->cabac, 36, 0 );    }    else if( i_sub == D_L0_8x8 )    {        x264_cabac_encode_decision( &h->cabac, 36, 1 );        x264_cabac_encode_decision( &h->cabac, 37, 0 );        x264_cabac_encode_decision( &h->cabac, 39, 0 );    }    else if( i_sub == D_L1_8x8 )    {        x264_cabac_encode_decision( &h->cabac, 36, 1 );        x264_cabac_encode_decision( &h->cabac, 37, 0 );        x264_cabac_encode_decision( &h->cabac, 39, 1 );    }    else if( i_sub == D_BI_8x8 )    {        x264_cabac_encode_decision( &h->cabac, 36, 1 );        x264_cabac_encode_decision( &h->cabac, 37, 1 );        x264_cabac_encode_decision( &h->cabac, 38, 0 );        x264_cabac_encode_decision( &h->cabac, 39, 0 );        x264_cabac_encode_decision( &h->cabac, 39, 0 );    }    else if( i_sub == D_L0_8x4 )    {        x264_cabac_encode_decision( &h->cabac, 36, 1 );        x264_cabac_encode_decision( &h->cabac, 37, 1 );        x264_cabac_encode_decision( &h->cabac, 38, 0 );        x264_cabac_encode_decision( &h->cabac, 39, 0 );        x264_cabac_encode_decision( &h->cabac, 39, 1 );    }    else if( i_sub == D_L0_4x8 )    {        x264_cabac_encode_decision( &h->cabac, 36, 1 );        x264_cabac_encode_decision( &h->cabac, 37, 1 );        x264_cabac_encode_decision( &h->cabac, 38, 0 );        x264_cabac_encode_decision( &h->cabac, 39, 1 );        x264_cabac_encode_decision( &h->cabac, 39, 0 );    }    else if( i_sub == D_L1_8x4 )    {        x264_cabac_encode_decision( &h->cabac, 36, 1 );        x264_cabac_encode_decision( &h->cabac, 37, 1 );        x264_cabac_encode_decision( &h->cabac, 38, 0 );        x264_cabac_encode_decision( &h->cabac, 39, 1 );        x264_cabac_encode_decision( &h->cabac, 39, 1 );    }    else if( i_sub == D_L1_4x8 )    {        x264_cabac_encode_decision( &h->cabac, 36, 1 );        x264_cabac_encode_decision( &h->cabac, 37, 1 );        x264_cabac_encode_decision( &h->cabac, 38, 1 );        x264_cabac_encode_decision( &h->cabac, 39, 0 );        x264_cabac_encode_decision( &h->cabac, 39, 0 );        x264_cabac_encode_decision( &h->cabac, 39, 0 );    }    else if( i_sub == D_BI_8x4 )    {        x264_cabac_encode_decision( &h->cabac, 36, 1 );        x264_cabac_encode_decision( &h->cabac, 37, 1 );        x264_cabac_encode_decision( &h->cabac, 38, 1 );        x264_cabac_encode_decision( &h->cabac, 39, 0 );        x264_cabac_encode_decision( &h->cabac, 39, 0 );        x264_cabac_encode_decision( &h->cabac, 39, 1 );    }    else if( i_sub == D_BI_4x8 )    {        x264_cabac_encode_decision( &h->cabac, 36, 1 );        x264_cabac_encode_decision( &h->cabac, 37, 1 );        x264_cabac_encode_decision( &h->cabac, 38, 1 );        x264_cabac_encode_decision( &h->cabac, 39, 0 );        x264_cabac_encode_decision( &h->cabac, 39, 1 );        x264_cabac_encode_decision( &h->cabac, 39, 0 );    }    else if( i_sub == D_L0_4x4 )    {        x264_cabac_encode_decision( &h->cabac, 36, 1 );        x264_cabac_encode_decision( &h->cabac, 37, 1 );        x264_cabac_encode_decision( &h->cabac, 38, 1 );        x264_cabac_encode_decision( &h->cabac, 39, 0 );        x264_cabac_encode_decision( &h->cabac, 39, 1 );        x264_cabac_encode_decision( &h->cabac, 39, 1 );    }    else if( i_sub == D_L1_4x4 )    {        x264_cabac_encode_decision( &h->cabac, 36, 1 );        x264_cabac_encode_decision( &h->cabac, 37, 1 );        x264_cabac_encode_decision( &h->cabac, 38, 1 );        x264_cabac_encode_decision( &h->cabac, 39, 1 );        x264_cabac_encode_decision( &h->cabac, 39, 0 );    }    else if( i_sub == D_BI_4x4 )    {        x264_cabac_encode_decision( &h->cabac, 36, 1 );        x264_cabac_encode_decision( &h->cabac, 37, 1 );        x264_cabac_encode_decision( &h->cabac, 38, 1 );        x264_cabac_encode_decision( &h->cabac, 39, 1 );        x264_cabac_encode_decision( &h->cabac, 39, 1 );    }}static inline void x264_cabac_mb_ref( x264_t *h, int i_list, int idx ){    const int i8 = x264_scan8[idx];    const int i_refa = h->mb.cache.ref[i_list][i8 - 1];    const int i_refb = h->mb.cache.ref[i_list][i8 - 8];    int i_ref  = h->mb.cache.ref[i_list][i8];    int ctx  = 0;    if( i_refa > 0 && !h->mb.cache.skip[i8 - 1])        ctx++;    if( i_refb > 0 && !h->mb.cache.skip[i8 - 8])        ctx += 2;    while( i_ref > 0 )    {        x264_cabac_encode_decision( &h->cabac, 54 + ctx, 1 );        if( ctx < 4 )            ctx = 4;        else            ctx = 5;        i_ref--;    }    x264_cabac_encode_decision( &h->cabac, 54 + ctx, 0 );}static inline void  x264_cabac_mb_mvd_cpn( x264_t *h, int i_list, int idx, int l, int mvd ){    const int amvd = abs( h->mb.cache.mvd[i_list][x264_scan8[idx] - 1][l] ) +                     abs( h->mb.cache.mvd[i_list][x264_scan8[idx] - 8][l] );    const int i_abs = abs( mvd );    const int i_prefix = X264_MIN( i_abs, 9 );    const int ctxbase = (l == 0 ? 40 : 47);    int ctx;    int i;    if( amvd < 3 )        ctx = 0;    else if( amvd > 32 )        ctx = 2;    else        ctx = 1;    for( i = 0; i < i_prefix; i++ )    {        x264_cabac_encode_decision( &h->cabac, ctxbase + ctx, 1 );        if( ctx < 3 )            ctx = 3;        else if( ctx < 6 )            ctx++;    }    if( i_prefix < 9 )    {        x264_cabac_encode_decision( &h->cabac, ctxbase + ctx, 0 );    }    if( i_prefix >= 9 )    {        int i_suffix = i_abs - 9;        int k = 3;        while( i_suffix >= (1<<k) )        {            x264_cabac_encode_bypass( &h->cabac, 1 );            i_suffix -= 1 << k;            k++;        }        x264_cabac_encode_bypass( &h->cabac, 0 );        while( k-- )        {            x264_cabac_encode_bypass( &h->cabac, (i_suffix >> k)&0x01 );        }    }    /* sign */    if( mvd > 0 )        x264_cabac_encode_bypass( &h->cabac, 0 );    else if( mvd < 0 )        x264_cabac_encode_bypass( &h->cabac, 1 );}static inline void  x264_cabac_mb_mvd( x264_t *h, int i_list, int idx, int width, int height ){    int mvp[2];    int mdx, mdy;    /* Calculate mvd */    x264_mb_predict_mv( h, i_list, idx, width, mvp );    mdx = h->mb.cache.mv[i_list][x264_scan8[idx]][0] - mvp[0];    mdy = h->mb.cache.mv[i_list][x264_scan8[idx]][1] - mvp[1];    /* encode */    x264_cabac_mb_mvd_cpn( h, i_list, idx, 0, mdx );    x264_cabac_mb_mvd_cpn( h, i_list, idx, 1, mdy );    /* save value */    x264_macroblock_cache_mvd( h, block_idx_x[idx], block_idx_y[idx], width, height, i_list, mdx, mdy );}static inline void x264_cabac_mb8x8_mvd( x264_t *h, int i_list ){    int i;    for( i = 0; i < 4; i++ )    {        if( !x264_mb_partition_listX_table[i_list][ h->mb.i_sub_partition[i] ] )        {            continue;        }        switch( h->mb.i_sub_partition[i] )        {            case D_L0_8x8:            case D_L1_8x8:            case D_BI_8x8:                x264_cabac_mb_mvd( h, i_list, 4*i, 2, 2 );                break;            case D_L0_8x4:            case D_L1_8x4:            case D_BI_8x4:                x264_cabac_mb_mvd( h, i_list, 4*i+0, 2, 1 );                x264_cabac_mb_mvd( h, i_list, 4*i+2, 2, 1 );                break;            case D_L0_4x8:            case D_L1_4x8:            case D_BI_4x8:                x264_cabac_mb_mvd( h, i_list, 4*i+0, 1, 2 );                x264_cabac_mb_mvd( h, i_list, 4*i+1, 1, 2 );                break;            case D_L0_4x4:            case D_L1_4x4:            case D_BI_4x4:                x264_cabac_mb_mvd( h, i_list, 4*i+0, 1, 1 );                x264_cabac_mb_mvd( h, i_list, 4*i+1, 1, 1 );                x264_cabac_mb_mvd( h, i_list, 4*i+2, 1, 1 );                x264_cabac_mb_mvd( h, i_list, 4*i+3, 1, 1 );                break;        }    }}static int x264_cabac_mb_cbf_ctxidxinc( x264_t *h, int i_cat, int i_idx ){    /* TODO: clean up/optimize */    int i_mba_xy = -1;    int i_mbb_xy = -1;    int i_nza = -1;    int i_nzb = -1;    int ctx = 0;    if( i_cat == 0 )    {        if( h->mb.i_mb_x > 0 )        {            i_mba_xy = h->mb.i_mb_xy -1;            if( h->mb.type[i_mba_xy] == I_16x16 )            {                i_nza = h->mb.cbp[i_mba_xy]&0x100;            }        }        if( h->mb.i_mb_y > 0 )        {            i_mbb_xy = h->mb.i_mb_xy - h->mb.i_mb_stride;            if( h->mb.type[i_mbb_xy] == I_16x16 )            {                i_nzb = h->mb.cbp[i_mbb_xy]&0x100;            }        }    }    else if( i_cat == 1 || i_cat == 2 )    {        int x = block_idx_x[i_idx];        int y = block_idx_y[i_idx];        if( x > 0 )            i_mba_xy = h->mb.i_mb_xy;        else if( h->mb.i_mb_x > 0 )            i_mba_xy = h->mb.i_mb_xy -1;        if( y > 0 )            i_mbb_xy = h->mb.i_mb_xy;        else if( h->mb.i_mb_y > 0 )            i_mbb_xy = h->mb.i_mb_xy - h->mb.i_mb_stride;        /* no need to test for skip/pcm */        if( i_mba_xy >= 0 )        {            const int i8x8a = block_idx_xy[(x-1)&0x03][y]/4;            if( (h->mb.cbp[i_mba_xy]&0x0f)>> i8x8a )            {                i_nza = h->mb.cache.non_zero_count[x264_scan8[i_idx] - 1];            }        }        if( i_mbb_xy >= 0 )        {            const int i8x8b = block_idx_xy[x][(y-1)&0x03]/4;            if( (h->mb.cbp[i_mbb_xy]&0x0f)>> i8x8b )            {                i_nzb = h->mb.cache.non_zero_count[x264_scan8[i_idx] - 8];            }        }    }    else if( i_cat == 3 )    {        /* no need to test skip/pcm */        if( h->mb.i_mb_x > 0 )        {            i_mba_xy = h->mb.i_mb_xy -1;            if( h->mb.cbp[i_mba_xy]&0x30 )            {                i_nza = h->mb.cbp[i_mba_xy]&( 0x02 << ( 8 + i_idx) );            }        }        if( h->mb.i_mb_y > 0 )        {            i_mbb_xy = h->mb.i_mb_xy - h->mb.i_mb_stride;            if( h->mb.cbp[i_mbb_xy]&0x30 )            {                i_nzb = h->mb.cbp[i_mbb_xy]&( 0x02 << ( 8 + i_idx) );            }        }    }    else if( i_cat == 4 )    {        int idxc = i_idx% 4;        if( idxc == 1 || idxc == 3 )            i_mba_xy = h->mb.i_mb_xy;        else if( h->mb.i_mb_x > 0 )            i_mba_xy = h->mb.i_mb_xy - 1;        if( idxc == 2 || idxc == 3 )            i_mbb_xy = h->mb.i_mb_xy;        else if( h->mb.i_mb_y > 0 )            i_mbb_xy = h->mb.i_mb_xy - h->mb.i_mb_stride;        /* no need to test skip/pcm */        if( i_mba_xy >= 0 && (h->mb.cbp[i_mba_xy]&0x30) == 0x20 )

⌨️ 快捷键说明

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