/* Get most probable intra modes
得到mpms,输出到intraDirPred[3]中。
作用同H264/AVC的mpm,只不过H264里面只有一个,而H265里面有三个
过程:
1.分别得到左边PU的帧内预测方向 和 上边PU的帧内预测方向
2.构造mpms
·左边PU帧内预测方向 == 上边PU帧内预测方向
·它们是angle,则mpm[0]是它们本身,mpm[1]是,mpm[2]
·它们不是angle,即DC或PLANAR,则mpm[0]是PLANAR,mpm[1]是DC,mpm[2]是VER
·左边PU帧内预测方向 != 上边PU帧内预测方向
1.mpm[0]是左边PU帧内预测方向,mpm[1]是上边PU帧内预测方向
2.mpm[2]是
·若左边PU帧内预测方向和上边PU帧内预测方向都不是DC,则mpm[2]是PLANAR
·否则mpm[2]=左边PU帧内预测方向+上边PU帧内预测方向?VER:DC
*/
int CUData::getIntraDirLumaPredictor(uint32_t absPartIdx, uint32_t* intraDirPred) const
{
const CUData* tempCU;
uint32_t tempPartIdx;
uint32_t leftIntraDir, aboveIntraDir;
// Get intra direction of left PU 得到左边PU的帧内预测方向
tempCU = getPULeft(tempPartIdx, m_absIdxInCTU + absPartIdx);
leftIntraDir = (tempCU && tempCU->isIntra(tempPartIdx)) ? tempCU->m_lumaIntraDir[tempPartIdx] : DC_IDX;
// Get intra direction of above PU 得到上边PU的帧内预测方向
tempCU = g_zscanToPelY[m_absIdxInCTU + absPartIdx] > 0 ? getPUAbove(tempPartIdx, m_absIdxInCTU + absPartIdx) : NULL;
aboveIntraDir = (tempCU && tempCU->isIntra(tempPartIdx)) ? tempCU->m_lumaIntraDir[tempPartIdx] : DC_IDX;
/* 构造mpms */
//若左边PU的帧内预测方向 == 上边PU的帧内预测方向
if (leftIntraDir == aboveIntraDir)
{
if (leftIntraDir >= 2) // angular modes 若他们是angle
{
intraDirPred[0] = leftIntraDir;
intraDirPred[1] = ((leftIntraDir - 2 + 31) & 31) + 2;
intraDirPred[2] = ((leftIntraDir - 2 + 1) & 31) + 2;
}
else //non-angular 若他们是DC或PLANAR
{
intraDirPred[0] = PLANAR_IDX;
intraDirPred[1] = DC_IDX;
intraDirPred[2] = VER_IDX;
}
return 1;
}
//若左边PU的帧内预测方向 != 上边PU的帧内预测方向
else
{
intraDirPred[0] = leftIntraDir;
intraDirPred[1] = aboveIntraDir;
if (leftIntraDir && aboveIntraDir) //both modes are non-planar
intraDirPred[2] = PLANAR_IDX;
else
intraDirPred[2] = (leftIntraDir + aboveIntraDir) < 2 ? VER_IDX : DC_IDX;
return 2;
}
}
CUData::getIntraDirLumaPredictor()
最新推荐文章于 2022-07-31 22:05:41 发布