今天主要介绍帧内预测一个很重要的函数initAdiPattern,它的主要功能有三个,(1)检测当前PU的相邻样点包括左上、上、右上、左、左下邻域样点值的可用性,或者说检查这些点是否存在;(2)参考样点的替换过程,主要实现的是JCTVC-J1003即draft 8.4.4.2.2的内容,主要由函数fillReferenceSamples来完成,这个在之前的文章已经讨论过了;(3)相邻样点即参考样点的平滑滤波,主要实现draft 8.4.4.2.3的内容。话不多说,下面给出initAdiPattern的实现和我个人的一些注释,供大家参考。
Void TComPattern::initAdiPattern( TComDataCU* pcCU, UInt uiZorderIdxInPart, UInt uiPartDepth, Int* piAdiBuf, Int iOrgBufStride, Int iOrgBufHeight, Bool& bAbove, Bool& bLeft, Bool bLMmode )
{//! bLMmode is usually false
Pel* piRoiOrigin;
Int* piAdiTemp;
UInt uiCuWidth = pcCU->getWidth(0) >> uiPartDepth; //!< CU的宽度
UInt uiCuHeight = pcCU->getHeight(0)>> uiPartDepth; //!< CU的高度
UInt uiCuWidth2 = uiCuWidth<<1;
UInt uiCuHeight2 = uiCuHeight<<1;
UInt uiWidth;
UInt uiHeight;
Int iPicStride = pcCU->getPic()->getStride();
Int iUnitSize = 0;
Int iNumUnitsInCu = 0;
Int iTotalUnits = 0;
Bool bNeighborFlags[4 * MAX_NUM_SPU_W + 1]; //!< 用于存放4个方