if (input->rdopt)
IntraChromaPrediction8x8() //8*8色度块的帧内预测,挑选最佳模式
Loop over 8*8 chroma intra prediction modes:
垂直、水平、平面预测模式不能进行的条件,跳出循环
Loop over macroblock mode
for INTER16x16 check all prediction directions
if(valid mode)
SetModesAndRefframeForBlocks() //设置各种块类型(帧间和帧内)下的参考帧及预测模式
If (MB type is intra and chroma prediction mode is DC ,RDCost_for_macroblocks(mode)>0)
store_macroblock_parameters() //计算帧内7种编码模块亮度编码RD_cost,并保存其结果
if(b_skip andRDCost_for_macroblocks(mode)>0)
store_macroblock_parameters()
else //从下面几种模式中选取最佳预测模式,这个为什么没分 亮度和色度块来考虑难道非率失真模式下的拉格朗日方法不需同时考虑亮度和色度的开销
check DIRECT MODE
check INTRA4*4
check INTRA16*16
if (input->rdopt)
set_stored_macroblock_parameters () //保存宏块参数
else //对不同模式保存不同的参数
SetModesAndRefframeForBlocks()
If(best_mode==p8*8)
SetCoeffAndReconstruction8x8()
else
if (best_mode!=I4MB)
帧内预测模式设为DC
if (best_mode!=I16MB)
LumaResidualCoding () //在rdo==0情况下,前面只是计算了预测值,并没有算dct
IntraChromaPrediction8x8() //对色差进行8*8帧内预测,选出一个最好的
ChromaResidualCoding()
SetMotionVectorsMB()
check for SKIP mode
Decide if this MB will restrict the reference frames
附:帧内预测的算法流程(转载)
对一个宏块进行帧内预测的具体过程如下:
(1)对于8x8色度块就选择一种帧内色度预测模式建立相应的帧内预测块;
(2)按遍历的方法分别计算4种Intra_16x16帧内预测模式的代价(Rdcost16x16),选择具有最小代价(Rdcost16x16)的模式作为16x16亮度块的最佳帧内预测模式,进而获得该宏块在16x16亮度块帧内预测模式下的率失真开销(RdcostMB)。
(3)对于4x4亮度块选择一种Intra_4x4帧内预测模式建立相应的帧内预测块。
(4)用拉格朗日率失真函数计算该预测模式下的代价(Rdcost4x4)。
(5)重复3,4步,遍历所有9种4x4亮度块帧内预测模式,选择具有最小代价(Rdcost4x4)的模式作为4x4亮度块的最佳帧内预测模式。
(6)对当前宏块中16个4x4亮度块重复第3步至第5步,获得每一个4x4亮度块的最佳帧内预测模式和相应的代价Rdcost4x4,进而获得该宏块在4x4亮度块帧内预测模式下的率失真开销(RdcostMB)。
(7)选择第2步和第6步中具有最小宏块率失真开销(RdcostMB)的模式作为该色度下的最优模式组合。
(8)重复第1步至第7步,遍历所有8x8色度块帧内预测模式下的最优模式组合,选择具有最小RdcostMB的模式组合作为该宏块的最佳帧内预测模式组合。
这样每一个宏块都要进行M8 x (M4 x 16 + M16)次RDO计算,其中M8、M4、M16分别表示8x8色度块、4x4亮度块、16x16亮度块的预测模式数,这也就意味着每个宏块要进行592次RDO计算。