首先这个函数非常复杂,比较长,因此我们分几次讲解。
先讲一下我理解的intra预测这部分。intra分为三种形状,16x16, 8x8, 4x4。 16x16的块也欧4种预测模型,前面文章讲解过。8x8和4x4都是9种预测模型,而且他们是方向伤的预测,没有想16x16有Plane预测。
void x264_macroblock_analyse(x264_t *h)
{
x264_mb_analysis_t analysis;//分析上下文
h->mb.i_qp = x264_ratecontrol_mb_qp(h); //当前宏块qp值
if h->param.rc.i_aq_mode && h->param.analyse.i_subpel_refine < 10) {
h->mb.i_qp = abs(h->mb.i_qp - h->mb.i_last_qp) == 1?h->mb.i_last_qp:h->mb.i_qp;
} //如果qp差值1以内就不做调整
if (h->param.analyse.b_mb_info) {
h->fdec->effective_qp[h->mb.i_mb_xy] = h->mb.i_qp; // store the real analysis QP
}
if (h->sh._type == SLICE_TYPE_I) {
if( analysis.i_mbrd ) //宏块rdo等级,和subme有关,1,2, 3
mb_init_fenc_cache( h, analysis.i_mbrd >= 2 ); //初始化一些值
mb_analyse_intra( h, &analysis, COST_MAX );
}
}
//接下来主要看看MB_ANALYSE_INTRA函数
上面16X16的块预测就完成了。
下面还有8x8以及4x4的预测,整体代码差不太多。