后者,根据粗略决定各分块方式下的预测模式(由x264_mb_analyse_intra( h, &analysis, COST_MAX )实现)intra mode 尝试性编码,计算cost,然后根据cost大小决定最终编码type,根据type cost ratecontrol 即可真正最后编码.
但在最后编码之前,如果对画质要求的option为最高值7,则需进行x264_intra_rd_refine.
rd_refine与 rd的不同决定它可以refine 画质:
x264_intra_rd:
某模式satd<COST_MAX(此函数中形参i_satd_thresh的实参为cost_max=1<<28 , 即4bits) 即进行该模式(由ananlyse确定各intra分块模式(1个16x16,4个8x8,16个4x4 3中模式)的satd)试探编码计算cost bits.纳入考虑范围,最后定cost最小mode为目标mode,这部分是在函数外面实现的.因此试探性编码并不是对所有由neighboour决定的所有可能mode都进行
x264_intra_rd_refine:
根据之前判断的模式分支,存储之前判决的模式,新i_thresh = a->i_satd_i16x16_dir[old_pred_mode] * 9/8;// new thresh 为上次结果放大12.5%,重新对所有可能模式(粗略值不比上次判断最优值大12.5%)进行试探性编码,如果在thresh以下,用i_satd = x264_rd_cost_mb( h, a->i_lambda2 );重新判断satd(x264_intra_rd中用 a->i_satd_i16x16 = x264_rd_cost_mb( h, a->i_lambda2 )判断satd与refine相同).
结论:
非refine先错略比较并决定各分块方式下mode,然后需要rd时,由x264_intra_rd在thresh前提下计算各分块方式下已决定mode 的cost,有试探性编码,和最终编码同一个函数.
由最小cost决定分块方式,因各分块方式的预测mode早确定了.
这样被错略去掉的mode可能在实际编码中占用少的bits,refine试探了这些mode.但也没有完全试探,只试探比上次
最优值差12.5%以内的,这样又一次确定mode,分块方式不变.