Openh264模式决策过程
I slice(帧内决策)
概述
对I slice 的预测变换模块和编码模块都在函数WelsISliceMdEnc中进行的。由于openh264暂时还不支持High profile及其以上的档次,所以I slice(帧内 条/片)的宏块,亮度分量只支持16x16 和 4x4的划分模式,色度分量只支持8x8的划分。
对宏块的亮度分量选择最佳的划分模式及预测模式流程如下:
- 计算帧内16x16划分模式(以下称其为I16x16模式)的SATD代价。
- 计算帧内4x4划分模式(以下称其为I4x4模式)的SATD代价。
- 根据两种划分模式各自的SATD代价得到最优的划分模式,并保存预测模式,预测数据等。
I16x16模式
在函数WelsMdIntraMb中有个WelsMdI16x16函数,I16x16模式的决策过程就是在这个函数里面完成的。下面简要的介绍I16x16决策过程:
1.根据当前宏块的邻近宏块存在状况,得到当前宏块候选的预测模式列表。
int32_t iOffset = pMbCache->uiNeighborIntra & 0x07;
iAvailCount = g_kiIntra16AvaliMode[iOffset][4];
kpAvailMode = g_kiIntra16AvaliMode[iOffset];
2.遍历候选的预测模式列表,求出预测模式的预测值,SATD代价,并且每次根据SATD代价更新最优的预测模式及其他预测数据。
pFunc->pfGetLumaI16x16Pred[iCurMode] (pDst, pDec, iLineSizeDec);
iCurCost = pFunc->sSampleDealingFuncs.pfMdCost[BLOCK_16x16] (pDst, 16, pEnc, iLineSizeEnc);
iCurCost +=