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

📄 cavlc.c

📁 T264是中国的视频编码自由组织合力开发的264编解码程序
💻 C
📖 第 1 页 / 共 3 页
字号:
        }
        if( ABS( level[i] ) > ( 3 << ( i_suffix_length - 1 ) ) && i_suffix_length < 6 )
        {
            i_suffix_length++;
        }
    }

	//encode total zeros [i_total-1][i_total_zero]
    if( i_total < i_count )
    {
        if( i_idx == BLOCK_INDEX_CHROMA_DC )
        {
            eg_write_vlc(h->bs, x264_total_zeros_dc[i_total-1][i_total_zero]);
        }
        else
        {
            eg_write_vlc(h->bs, x264_total_zeros[i_total-1][i_total_zero]);
        }
    }

	//encode each run of zeros
    for( i = 0, i_zero_left = i_total_zero; i < i_total - 1; i++ )
    {
        int i_zl;

        if( i_zero_left <= 0 )
        {
            break;
        }

        i_zl = T264_MIN( i_zero_left - 1, 6 );

		eg_write_vlc(h->bs, x264_run_before[i_zl][run[i]]);

        i_zero_left -= run[i];
    }
}

void 
T264_macroblock_write_cavlc(T264_t *t)
{
    int32_t mb_mode = t->mb.mb_mode;
    int32_t i;
    int32_t offset;

    if (t->slice_type == SLICE_I)
    {
        offset = 0;
    }
    else if (t->slice_type == SLICE_P)
    {
        offset = 5;
    }
    else if (t->slice_type == SLICE_B)
    {
        offset = 23;
    }

    if(t->slice_type != SLICE_I)
    {
        eg_write_ue(t->bs, t->skip);  /* skip run */
        t->skip = 0;
    }

    if (mb_mode == I_4x4)
    {
        // mb_type
        eg_write_ue(t->bs, offset + 0);
        /* Prediction: Luma */
        for (i = 0 ; i < 16; i ++) /* i : Inverse raster scan */
        {
            int8_t pred = T264_mb_predict_intra4x4_mode(t, i);
            int8_t mode = t->mb.mode_i4x4[i];

            if( pred == mode)
            {
                eg_write_direct1(t->bs, 1);	/* b_prev_intra4x4_pred_mode */
            }
            else
            {
                eg_write_direct1(t->bs, 0);	/* b_prev_intra4x4_pred_mode */
                if( mode < pred )
                {
                    eg_write_direct(t->bs, mode, 3);  /* rem_intra4x4_pred_mode */
                }
                else
                {
                    eg_write_direct(t->bs, mode - 1, 3);  /* rem_intra4x4_pred_mode */
                }
            }
        }
        //intra_chroma_pred_mode
        eg_write_ue(t->bs, t->mb.mb_mode_uv);

        // coded_block_pattern
        eg_write_ue(t->bs, intra4x4_cbp_to_golomb[( t->mb.cbp_c << 4 ) | t->mb.cbp_y]);

        //delta_qp
        if (t->mb.cbp_y > 0 || t->mb.cbp_c > 0)
        {
            eg_write_se(t->bs, t->mb.mb_qp_delta);	/* 0 = no change on qp */

            for (i = 0; i < 16 ; i ++)
            {
                if(t->mb.cbp_y & (1 << ( i / 4 )))
                {
                    block_residual_write_cavlc(t, i, t->mb.dct_y_z[i], 16);
                }
            }
        }
    }
    else if (mb_mode == I_16x16)
    {
        // mb_type
        eg_write_ue(t->bs, offset + 1 + t->mb.mode_i16x16 + 
            t->mb.cbp_c * 4 + (t->mb.cbp_y == 0 ? 0 : 12));
        // intra chroma pred mode
        eg_write_ue(t->bs, t->mb.mb_mode_uv);

        // delta qp
        eg_write_se(t->bs, t->mb.mb_qp_delta);

        // dc luma
        block_residual_write_cavlc(t, BLOCK_INDEX_LUMA_DC, t->mb.dc4x4_z, 16);

        if (t->mb.cbp_y != 0)
        {
            for(i = 0 ; i < 16 ; i ++)
            {
                if (t->mb.cbp_y & (1 << (i / 4)))
                {
                    block_residual_write_cavlc(t, i, &(t->mb.dct_y_z[i][1]), 15);
                }
            }
        }
    }
    else
    {
        T264_vector_t vec;
        if (t->slice_type == SLICE_P)
        {
            switch (t->mb.mb_part) 
            {
            case MB_16x16:
                eg_write_ue(t->bs, MB_16x16);
                if (t->ps.num_ref_idx_l0_active_minus1 > 0)
                {
                    eg_write_te(t->bs, t->ps.num_ref_idx_l0_active_minus1, t->mb.vec[0][0].refno);
                }
                vec = t->mb.vec[0][0];
                T264_predict_mv(t, 0, 0, 4, &vec);
                eg_write_se(t->bs, t->mb.vec[0][0].x - vec.x);
                eg_write_se(t->bs, t->mb.vec[0][0].y - vec.y);
        	    break;
            case MB_16x8:
                eg_write_ue(t->bs, MB_16x8);
                if (t->ps.num_ref_idx_l0_active_minus1 > 0)
                {
                    eg_write_te(t->bs, t->ps.num_ref_idx_l0_active_minus1, t->mb.vec[0][0].refno);
                    eg_write_te(t->bs, t->ps.num_ref_idx_l0_active_minus1, t->mb.vec[0][8].refno);
                }
                vec = t->mb.vec[0][0];
                T264_predict_mv(t, 0, 0, 4, &vec);
                eg_write_se(t->bs, t->mb.vec[0][0].x - vec.x);
                eg_write_se(t->bs, t->mb.vec[0][0].y - vec.y);

                vec = t->mb.vec[0][8];
                T264_predict_mv(t, 0, 8, 4, &vec);
                eg_write_se(t->bs, t->mb.vec[0][8].x - vec.x);
                eg_write_se(t->bs, t->mb.vec[0][8].y - vec.y);
        	    break;
            case MB_8x16:
                eg_write_ue(t->bs, MB_8x16);
                if (t->ps.num_ref_idx_l0_active_minus1 > 0)
                {
                    eg_write_te(t->bs, t->ps.num_ref_idx_l0_active_minus1, t->mb.vec[0][0].refno);
                    eg_write_te(t->bs, t->ps.num_ref_idx_l0_active_minus1, t->mb.vec[0][luma_index[4]].refno);
                }
                vec = t->mb.vec[0][0];
                T264_predict_mv(t, 0, 0, 2, &vec);
                eg_write_se(t->bs, t->mb.vec[0][0].x - vec.x);
                eg_write_se(t->bs, t->mb.vec[0][0].y - vec.y);

                vec = t->mb.vec[0][luma_index[4]];
                T264_predict_mv(t, 0, luma_index[4], 2, &vec);
                eg_write_se(t->bs, t->mb.vec[0][luma_index[4]].x - vec.x);
                eg_write_se(t->bs, t->mb.vec[0][luma_index[4]].y - vec.y);
                break;
            case MB_8x8:
            case MB_8x8ref0:
                if (t->mb.vec[0][luma_index[0]].refno == 0 &&
                    t->mb.vec[0][luma_index[4]].refno == 0 &&
                    t->mb.vec[0][luma_index[8]].refno == 0 &&
                    t->mb.vec[0][luma_index[12]].refno == 0)
                {
                    eg_write_ue(t->bs, MB_8x8ref0);
                    for (i = 0 ; i < 4 ; i ++)
                    {
                        switch (t->mb.submb_part[luma_index[4 * i]]) 
                        {
                        case MB_8x8:
                            eg_write_ue(t->bs, 0);
                    	    break;
                        case MB_8x4:
                            eg_write_ue(t->bs, 1);
                            break;
                        case MB_4x8:
                            eg_write_ue(t->bs, 2);
                            break;
                        case MB_4x4:
                            eg_write_ue(t->bs, 3);
                            break;
                        default:
                            break;
                        }
                    }
                }
                else
                {
                    eg_write_ue(t->bs, MB_8x8);
                    for (i = 0 ; i < 4 ; i ++)
                    {
                        switch (t->mb.submb_part[luma_index[4 * i]]) 
                        {
                        case MB_8x8:
                            eg_write_ue(t->bs, 0);
                            break;
                        case MB_8x4:
                            eg_write_ue(t->bs, 1);
                            break;
                        case MB_4x8:
                            eg_write_ue(t->bs, 2);
                            break;
                        case MB_4x4:
                            eg_write_ue(t->bs, 3);
                            break;
                        default:
                            break;
                        }
                    }
                    
                    if (t->ps.num_ref_idx_l0_active_minus1 > 0)
                    {
                        eg_write_te(t->bs, t->ps.num_ref_idx_l0_active_minus1, t->mb.vec[0][0].refno);
                        eg_write_te(t->bs, t->ps.num_ref_idx_l0_active_minus1, t->mb.vec[0][luma_index[4]].refno);
                        eg_write_te(t->bs, t->ps.num_ref_idx_l0_active_minus1, t->mb.vec[0][luma_index[8]].refno);
                        eg_write_te(t->bs, t->ps.num_ref_idx_l0_active_minus1, t->mb.vec[0][luma_index[12]].refno);
                    }
                }
                for(i = 0 ; i < 4 ; i ++)
                {
                    switch(t->mb.submb_part[luma_index[4 * i]]) 
                    {
                    case MB_8x8:
                        vec = t->mb.vec[0][luma_index[4 * i]];
                        T264_predict_mv(t, 0, luma_index[4 * i], 2, &vec);
                        eg_write_se(t->bs, t->mb.vec[0][luma_index[4 * i]].x - vec.x);
                        eg_write_se(t->bs, t->mb.vec[0][luma_index[4 * i]].y - vec.y);
                	    break;
                    case MB_8x4:
                        vec = t->mb.vec[0][luma_index[4 * i]];
                        T264_predict_mv(t, 0, luma_index[4 * i], 2, &vec);
                        eg_write_se(t->bs, t->mb.vec[0][luma_index[4 * i]].x - vec.x);
                        eg_write_se(t->bs, t->mb.vec[0][luma_index[4 * i]].y - vec.y);

                        vec = t->mb.vec[0][luma_index[4 * i + 2]];
                        T264_predict_mv(t, 0, luma_index[4 * i + 2], 2, &vec);
                        eg_write_se(t->bs, t->mb.vec[0][luma_index[4 * i + 2]].x - vec.x);
                        eg_write_se(t->bs, t->mb.vec[0][luma_index[4 * i + 2]].y - vec.y);
                	    break;
                    case MB_4x8:
                        vec = t->mb.vec[0][luma_index[4 * i]];
                        T264_predict_mv(t, 0, luma_index[4 * i], 1, &vec);
                        eg_write_se(t->bs, t->mb.vec[0][luma_index[4 * i]].x - vec.x);
                        eg_write_se(t->bs, t->mb.vec[0][luma_index[4 * i]].y - vec.y);

                        vec = t->mb.vec[0][luma_index[4 * i + 1]];
                        T264_predict_mv(t, 0, luma_index[4 * i + 1], 1, &vec);
                        eg_write_se(t->bs, t->mb.vec[0][luma_index[4 * i + 1]].x - vec.x);
                        eg_write_se(t->bs, t->mb.vec[0][luma_index[4 * i + 1]].y - vec.y);
                        break;
                    case MB_4x4:
                        vec = t->mb.vec[0][luma_index[4 * i]];
                        T264_predict_mv(t, 0, luma_index[4 * i], 1, &vec);
                        eg_write_se(t->bs, t->mb.vec[0][luma_index[4 * i]].x - vec.x);
                        eg_write_se(t->bs, t->mb.vec[0][luma_index[4 * i]].y - vec.y);

                        vec = t->mb.vec[0][luma_index[4 * i + 1]];
                        T264_predict_mv(t, 0, luma_index[4 * i + 1], 1, &vec);
                        eg_write_se(t->bs, t->mb.vec[0][luma_index[4 * i + 1]].x - vec.x);
                        eg_write_se(t->bs, t->mb.vec[0][luma_index[4 * i + 1]].y - vec.y);

                        vec = t->mb.vec[0][luma_index[4 * i + 2]];
                        T264_predict_mv(t, 0, luma_index[4 * i + 2], 1, &vec);
                        eg_write_se(t->bs, t->mb.vec[0][luma_index[4 * i + 2]].x - vec.x);
                        eg_write_se(t->bs, t->mb.vec[0][luma_index[4 * i + 2]].y - vec.y);

                        vec = t->mb.vec[0][luma_index[4 * i + 3]];

⌨️ 快捷键说明

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