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

📄 cabac.c

📁 h.264编码库 (T264)..........................
💻 C
📖 第 1 页 / 共 4 页
字号:
//        T264_cabac_encode_decision( &t->cabac, 36, 1 );
//        T264_cabac_encode_decision( &t->cabac, 37, 1 );
//        T264_cabac_encode_decision( &t->cabac, 38, 1 );
//        T264_cabac_encode_decision( &t->cabac, 39, 1 );
//        T264_cabac_encode_decision( &t->cabac, 39, 1 );
//    }
//}
//
//
//static __inline  void T264_cabac_mb_ref( T264_t *t, int i_list, int idx )
//{
//	const int i8    = T264_scan8[idx];
//	T264_mb_context_t *mb_ctxs = &(t->rec->mb[0]);
//	const int i_refa = t->mb.vec_ref[i8 - 1].vec[i_list].refno;
//    const int i_refb = t->mb.vec_ref[i8 - 8].vec[i_list].refno;
//    int i_ref  = t->mb.vec_ref[i8].vec[i_list].refno;
//	int a_direct, b_direct;
//	int ctx  = 0;
//	int luma_idx = luma_index[idx];
//	if( t->slice_type==SLICE_B && t->mb.mb_x > 0 && (mb_ctxs[t->mb.mb_xy-1].mb_mode == B_SKIP||mb_ctxs[t->mb.mb_xy-1].is_copy ) && (luma_idx&0x03)==0)
//	{
//		a_direct = 1;
//	}
//	else
//		a_direct = 0;
//	if( t->slice_type==SLICE_B && t->mb.mb_y > 0 && (mb_ctxs[t->mb.mb_xy - t->mb_stride].mb_mode == B_SKIP||mb_ctxs[t->mb.mb_xy - t->mb_stride].is_copy) && luma_idx<4)
//	{
//		b_direct = 1;
//	}
//	else
//		b_direct = 0;
//
//    if( i_refa>0 && !a_direct)
//        ctx++;
//    if( i_refb>0 && !b_direct)
//        ctx += 2;
//
//    while( i_ref > 0 )
//    {
//        T264_cabac_encode_decision( &t->cabac, 54 + ctx, 1 );
//        if( ctx < 4 )
//            ctx = 4;
//        else
//            ctx = 5;
//
//        i_ref--;
//    }
//    T264_cabac_encode_decision( &t->cabac, 54 + ctx, 0 );
//}
//
//
//static __inline  void  T264_cabac_mb_mvd_cpn( T264_t *t, int i_list, int i8, int l, int mvd )
//{
//    const int amvd = abs( t->mb.mvd_ref[i_list][i8 - 1][l] ) +
//                     abs( t->mb.mvd_ref[i_list][i8 - 8][l] );
//    const int i_abs = abs( mvd );
//    const int i_prefix = T264_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++ )
//    {
//        T264_cabac_encode_decision( &t->cabac, ctxbase + ctx, 1 );
//        if( ctx < 3 )
//            ctx = 3;
//        else if( ctx < 6 )
//            ctx++;
//    }
//    if( i_prefix < 9 )
//    {
//        T264_cabac_encode_decision( &t->cabac, ctxbase + ctx, 0 );
//    }
//
//    if( i_prefix >= 9 )
//    {
//        int i_suffix = i_abs - 9;
//        int k = 3;
//
//        while( i_suffix >= (1<<k) )
//        {
//            T264_cabac_encode_bypass( &t->cabac, 1 );
//            i_suffix -= 1 << k;
//            k++;
//        }
//        T264_cabac_encode_bypass( &t->cabac, 0 );
//        while( k-- )
//        {
//            T264_cabac_encode_bypass( &t->cabac, (i_suffix >> k)&0x01 );
//        }
//    }
//
//    /* sign */
//    if( mvd > 0 )
//        T264_cabac_encode_bypass( &t->cabac, 0 );
//    else if( mvd < 0 )
//        T264_cabac_encode_bypass( &t->cabac, 1 );
//}
//
//static __inline  void  T264_cabac_mb_mvd( T264_t *t, int i_list, int idx, int width, int height )
//{
//    T264_vector_t mvp;
//    int mdx, mdy;
//	int i, j;
//	int i8    = T264_scan8[idx];
//	int luma_idx = luma_index[idx];
//    /* Calculate mvd */
//	mvp.refno = t->mb.vec_ref[i8].vec[i_list].refno;
//    T264_predict_mv( t, i_list, luma_idx, width, &mvp );
//	mdx = t->mb.vec_ref[i8].vec[i_list].x - mvp.x;
//	mdy = t->mb.vec_ref[i8].vec[i_list].y - mvp.y;
//    
//    /* encode */
//    T264_cabac_mb_mvd_cpn( t, i_list, i8, 0, mdx );
//    T264_cabac_mb_mvd_cpn( t, i_list, i8, 1, mdy );
//	/* save mvd value */
//	for(j=0; j<height; j++)
//	{
//		for(i=0; i<width; i++)
//		{
//			t->mb.mvd_ref[i_list][i8+i][0] = mdx;
//			t->mb.mvd_ref[i_list][i8+i][1] = mdy;
//			t->mb.mvd[i_list][luma_idx+i][0] = mdx;
//			t->mb.mvd[i_list][luma_idx+i][1] = mdy;
//		}
//		i8 += 8;
//		luma_idx += 4;
//	}
//}
//
//static __inline void T264_cabac_mb8x8_mvd( T264_t *t, int i_list )
//{
//	int i;
//	int sub_part;
//	for( i = 0; i < 4; i++ )
//	{
//		sub_part = t->mb.submb_part[luma_index[i<<2]];
//		if( T264_mb_partition_listX_table[sub_part-B_DIRECT_8x8][i_list] == 0 )
//		{
//			continue;
//		}
//
//		switch( sub_part )
//		{
//		case B_DIRECT_8x8:
//			assert(0);
//			break;
//		case B_L0_8x8:
//		case B_L1_8x8:
//		case B_Bi_8x8:
//			T264_cabac_mb_mvd( t, i_list, 4*i, 2, 2 );
//			break;
//		case B_L0_8x4:
//		case B_L1_8x4:
//		case B_Bi_8x4:
//			T264_cabac_mb_mvd( t, i_list, 4*i+0, 2, 1 );
//			T264_cabac_mb_mvd( t, i_list, 4*i+2, 2, 1 );
//			break;
//		case B_L0_4x8:
//		case B_L1_4x8:
//		case B_Bi_4x8:
//			T264_cabac_mb_mvd( t, i_list, 4*i+0, 1, 2 );
//			T264_cabac_mb_mvd( t, i_list, 4*i+1, 1, 2 );
//			break;
//		case B_L0_4x4:
//		case B_L1_4x4:
//		case B_Bi_4x4:
//			T264_cabac_mb_mvd( t, i_list, 4*i+0, 1, 1 );
//			T264_cabac_mb_mvd( t, i_list, 4*i+1, 1, 1 );
//			T264_cabac_mb_mvd( t, i_list, 4*i+2, 1, 1 );
//			T264_cabac_mb_mvd( t, i_list, 4*i+3, 1, 1 );
//			break;
//		}
//	}
//}
//
//static int T264_cabac_mb_cbf_ctxidxinc( T264_t *t, int i_cat, int i_idx )
//{
//    /* TODO: clean up/optimize */
//	T264_mb_context_t *mb_ctxs = &(t->rec->mb[0]);
//	T264_mb_context_t *mb_ctx;
//    int i_mba_xy = -1;
//    int i_mbb_xy = -1;
//    int i_nza = -1;
//    int i_nzb = -1;
//    int ctx = 0;
//	int cbp;
//
//    if( i_cat == 0 )
//    {
//        if( t->mb.mb_x > 0 )
//        {
//            i_mba_xy = t->mb.mb_xy -1;
//			mb_ctx = &(mb_ctxs[i_mba_xy]);
//            if( mb_ctx->mb_mode == I_16x16 )
//            {
//                i_nza = (mb_ctx->cbp & 0x100);
//            }
//        }
//        if( t->mb.mb_y > 0 )
//        {
//            i_mbb_xy = t->mb.mb_xy - t->mb_stride;
//			mb_ctx = &(mb_ctxs[i_mbb_xy]);
//            if( mb_ctx->mb_mode == I_16x16 )
//            {
//                i_nzb = (mb_ctx->cbp & 0x100);
//            }
//        }
//    }
//    else if( i_cat == 1 || i_cat == 2 )
//    {
//        int x = luma_inverse_x[i_idx];
//        int y = luma_inverse_y[i_idx];
//		int i8 = T264_scan8[i_idx];
//        if( x > 0 )
//            i_mba_xy = t->mb.mb_xy;
//        else if( t->mb.mb_x > 0 )
//            i_mba_xy = t->mb.mb_xy -1;
//
//        if( y > 0 )
//            i_mbb_xy = t->mb.mb_xy;
//        else if( t->mb.mb_y > 0 )
//            i_mbb_xy = t->mb.mb_xy - t->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( (mb_ctxs[i_mba_xy].cbp_y&0x0f)>> i8x8a )
//            {
//                i_nza = t->mb.nnz_ref[i8-1];
//            }
//        }
//        if( i_mbb_xy >= 0 )
//        {
//            const int i8x8b = block_idx_xy[x][(y-1)&0x03]/4;
//            if( (mb_ctxs[i_mbb_xy].cbp_y&0x0f)>> i8x8b )
//            {
//                i_nzb = t->mb.nnz_ref[i8 - 8];
//            }
//        }
//    }
//    else if( i_cat == 3 )
//    {
//        /* no need to test skip/pcm */
//        if( t->mb.mb_x > 0 )
//        {
//            i_mba_xy = t->mb.mb_xy -1;
//			cbp = mb_ctxs[i_mba_xy].cbp;
//            if( cbp&0x30 )
//            {
//                i_nza = cbp&( 0x02 << ( 8 + i_idx) );
//            }
//        }
//        if( t->mb.mb_y > 0 )
//        {
//            i_mbb_xy = t->mb.mb_xy - t->mb_stride;
//			cbp = mb_ctxs[i_mbb_xy].cbp;
//            if( cbp&0x30 )
//            {
//                i_nzb = cbp&( 0x02 << ( 8 + i_idx) );
//            }
//        }
//    }
//    else if( i_cat == 4 )
//    {
//        int idxc = i_idx% 4;
//
//        if( idxc == 1 || idxc == 3 )
//            i_mba_xy = t->mb.mb_xy;
//        else if( t->mb.mb_x > 0 )
//            i_mba_xy = t->mb.mb_xy - 1;
//
//        if( idxc == 2 || idxc == 3 )
//            i_mbb_xy = t->mb.mb_xy;
//        else if( t->mb.mb_y > 0 )
//            i_mbb_xy = t->mb.mb_xy - t->mb_stride;
//
//        /* no need to test skip/pcm */
//        if( i_mba_xy >= 0 && (mb_ctxs[i_mba_xy].cbp&0x30) == 0x20 )
//        {
//            i_nza = t->mb.nnz_ref[T264_scan8[16+i_idx] - 1];
//        }
//        if( i_mbb_xy >= 0 && (mb_ctxs[i_mbb_xy].cbp&0x30) == 0x20 )
//        {
//            i_nzb = t->mb.nnz_ref[T264_scan8[16+i_idx] - 8];
//        }
//    }
//
//    if( ( i_mba_xy < 0  && IS_INTRA( t->mb.mb_mode ) ) || i_nza > 0 )
//    {
//        ctx++;
//    }
//    if( ( i_mbb_xy < 0  && IS_INTRA( t->mb.mb_mode ) ) || i_nzb > 0 )
//    {
//        ctx += 2;
//    }
//
//    return 4 * i_cat + ctx;
//}
//
//
//static void block_residual_write_cabac( T264_t *t, int i_ctxBlockCat, int i_idx, int16_t *l, int i_count )
//{
//    static const int significant_coeff_flag_offset[5] = { 0, 15, 29, 44, 47 };
//    static const int last_significant_coeff_flag_offset[5] = { 0, 15, 29, 44, 47 };
//    static const int coeff_abs_level_m1_offset[5] = { 0, 10, 20, 30, 39 };
//
//    int i_coeff_abs_m1[16];
//    int i_coeff_sign[16];
//    int i_coeff = 0;
//    int i_last  = 0;
//
//    int i_abslevel1 = 0;
//    int i_abslevelgt1 = 0;
//
//    int i;
//
//    /* i_ctxBlockCat: 0-> DC 16x16  i_idx = 0
//     *                1-> AC 16x16  i_idx = luma4x4idx
//     *                2-> Luma4x4   i_idx = luma4x4idx
//     *                3-> DC Chroma i_idx = iCbCr
//     *                4-> AC Chroma i_idx = 4 * iCbCr + chroma4x4idx
//     */
//
//    //fprintf( stderr, "l[] = " );
//    for( i = 0; i < i_count; i++ )
//    {
//        //fprintf( stderr, "%d ", l[i] );
//        if( l[i] != 0 )
//        {
//            i_coeff_abs_m1[i_coeff] = abs( l[i] ) - 1;
//            i_coeff_sign[i_coeff]   = ( l[i] < 0 ? 1 : 0);
//            i_coeff++;
//
//            i_last = i;
//        }
//    }
//    //fprintf( stderr, "\n" );
//
//    if( i_coeff == 0 )
//    {
//        /* codec block flag */
//        T264_cabac_encode_decision( &t->cabac,  85 + T264_cabac_mb_cbf_ctxidxinc( t, i_ctxBlockCat, i_idx ), 0 );
//        return;
//    }
//
//    /* block coded */
//    T264_cabac_encode_decision( &t->cabac,  85 + T264_cabac_mb_cbf_ctxidxinc( t, i_ctxBlockCat, i_idx ), 1 );
//    for( i = 0; i < i_count - 1; i++ )
//    {
//        int i_ctxIdxInc;
//
//        i_ctxIdxInc = T264_MIN( i, i_count - 2 );
//
//        if( l[i] != 0 )
//        {
//            T264_cabac_encode_decision( &t->cabac, 105 + significant_coeff_flag_offset[i_ctxBlockCat] + i_ctxIdxInc, 1 );
//            T264_cabac_encode_decision( &t->cabac, 166 + last_significant_coeff_flag_offset[i_ctxBlockCat] + i_ctxIdxInc, i == i_last ? 1 : 0 );
//        }

⌨️ 快捷键说明

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