getIntraChromaCandModes函数主要是estIntraPredChromaQT中调用来色度列表的,在ECM中,色度列表默认为以下的12种,前四个模式即PLANAR、VER、HOR、DC模式,若其与DM模式推导得到的帧内预测模式相同则将其替换为VDIA模式。
Index | Mode |
0 | PLANAR(VDIA) |
1 | VER(VDIA) |
2 | HOR(VDIA) |
3 | DC(VDIA) |
4 | CCLM |
5 | CCLM_L |
6 | CCLM_T |
7 | MMLM |
8 | MMLM_L |
9 | MMLM_T |
10 | DM |
11 | DIMD_CHROMA |
若直接模式是MIP模式,则模式不能已在列表中。
代码及注释如下:
void PU::getIntraChromaCandModes(const PredictionUnit &pu, unsigned modeList[NUM_CHROMA_MODE])
{//默认的12种色度模式列表
modeList[0] = PLANAR_IDX;
modeList[1] = VER_IDX;
modeList[2] = HOR_IDX;
modeList[3] = DC_IDX;
modeList[4] = LM_CHROMA_IDX;
#if MMLM
modeList[5] = MDLM_L_IDX;
modeList[6] = MDLM_T_IDX;
modeList[7] = MMLM_CHROMA_IDX;
modeList[8] = MMLM_L_IDX;
modeList[9] = MMLM_T_IDX;
#if JVET_Z0050_DIMD_CHROMA_FUSION && ENABLE_DIMD
modeList[10] = DM_CHROMA_IDX;
modeList[11] = DIMD_CHROMA_IDX;
#else
modeList[10] = DM_CHROMA_IDX;
#endif
#else
modeList[5] = MDLM_L_IDX;
modeList[6] = MDLM_T_IDX;
#if JVET_Z0050_DIMD_CHROMA_FUSION && ENABLE_DIMD
modeList[7] = DM_CHROMA_IDX;
modeList[8] = DIMD_CHROMA_IDX;
#else
modeList[7] = DM_CHROMA_IDX;
#endif
#endif
// If Direct Mode is MIP, mode cannot be already in the list.
//如果直接模式是MIP模式,其不能已经在列表中
if (isDMChromaMIP(pu))
{
return;
}
//获取当前亮度模式,若为前4种模式,即PLANAR,VER,HOR,DC,则将其设置为VDIA
const uint32_t lumaMode = getCoLocatedIntraLumaMode(pu);
for (int i = 0; i < 4; i++)
{
if (lumaMode == modeList[i])
{
modeList[i] = VDIA_IDX;
break;
}
}
}