CUData::getIntraDirLumaPredictor()

/* 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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值