xGetLumaRecPixels函数在estIntraPredChromaQT函数中被调用,以获取MMLM和MDLM模式中的luma重建像素采样值,包括左和上的参考像素采样,以及pu内luma采样:
X X X X X
X Y Y
X Y Y
X
X
如上X和Y的排列所示,为MDLM模式采样,X代表参考像素采样,Y表示pu内luma像素采样。MMLM模式没有左下和右上部分的多余X。
void IntraPrediction::xGetLumaRecPixels(const PredictionUnit &pu, CompArea chromaArea)
{
int iDstStride = 0;
Pel* pDst0 = 0;
#if JVET_L0338_MDLM
int curChromaMode = pu.intraDir[1]; //pu的帧内色度模式
if ((curChromaMode == MDLM_L_IDX) || (curChromaMode == MDLM_T_IDX))
{
//LM_L、LM_T
iDstStride = 2 * MAX_CU_SIZE + 1; //如函数开始所示,MDLM模式的stride为:2*CU_width+1
pDst0 = m_pMdlmTemp + iDstStride + 1; //m_pMdlmTemp始终指向左上角第一个X,pDst0则指向pu内的第一个luma像素,即第一个Y
}
else //MMLM
{
#endif
iDstStride = MAX_CU_SIZE + 1; //如函数开始所示,MMLM模式的stride为:CU_width+1
pDst0 = m_piTemp + iDstStride + 1; //m_piTemp始终指向左上角第一个X,pDst0则指向pu内的第一个luma像素,即第一个Y
//MMLM_SAMPLE_NEIGHBOR_LINES;
#if JVET_L0338_MDLM
}
#endif
//assert 420 chroma subsampling
CompArea lumaArea = CompArea( COMPONENT_Y, pu.chromaFormat, chromaArea.lumaPos(), recalcSize( pu.chromaFormat, CHANNEL_TYPE_CHROMA, CHANNEL_TYPE_LUMA, chromaArea.size() ) );//needed for correct pos/size (4x4 Tus)
CHECK( lumaArea.width == chromaArea.width, "" );
CHECK( lumaArea.height == chromaArea.height, "" );
const SizeType uiCWidth = chromaArea.width;
const SizeType uiCHeight = chromaArea.height;
const CPelBuf Src = pu.cs->picture->getRecoBuf( lumaArea ); //当前块重建像素
Pel const* pRecSrc0 = Src.bufAt( 0, 0 );
int iRecStride = Src.stride; //luma重建块的stride为picture(包含padding)的width
int iRecStride2 = iRecStride << 1; //因为亮度横纵2:1采样,所以一般stride直接为picture的两行
CodingStructure& cs = *pu.cs;
const CodingUnit& lumaCU = isChroma( pu.chType ) ? *pu.cs->picture->cs->getCU( lumaArea.pos(), CH_L ) : *pu.cu;
const CodingUnit& cu = *pu.cu;
const CompArea& area = isChroma( pu.chType ) ? chromaArea : lumaArea;
const SPS &sps = *cs.sps;
const uint32_t uiTuWidth = area.width;
const uint32_t uiTuHeight = area.height;
int iBaseUnitSize = ( 1 << MIN_CU_LOG2 ); //4x4
if( !