HEVC代码学习37:帧内预测代码整体学习
最近一直在看变换部分的东西,由于很多变换模式是针对帧内预测模式设计的,来简单学习一下帧内预测流程。
通过之前xCompressCU的学习,我们知道了帧内、帧间的入口函数都在xCompressCU中,下面回顾一下xCompressCU函数。
xCompressCU
xCompressCU主要作用是完成块划分,确定最优预测模式,其流程为:
1.帧间预测xCheckRDCostInter、xCheckRDCostMerge2Nx2N
2.帧内预测xCheckRDCostIntra
3.PCM模式xCheckIntraPCM
其中xCheckRDCostIntra即为帧内预测的入口函数。xCheckIntraPCM从函数名称来看貌似也是一个帧内预测模式,其实际没有进行任何预测和变换,直接传输CU像素值,不属于帧内预测。
接下来从xCheckRDCostIntra入手,开始学习帧内预测的整体流程。下图为帧内预测主要函数及调用关系:
xCheckRDCostIntra
xCheckRDCostIntra是帧内预测的入口函数,其中通过调用各函数完成具体的帧内预测、编码、最优模式选择等任务。其中分为亮度帧内预测estIntraPredLumaQT和色度帧内预测estIntraPredChromaQT两个部分。这里主要研究亮度分量预测部分,色度部分要简单很多。
estIntraPredLumaQT
estIntraPredLumaQT是亮度帧内预测的入口函数,大致流程如下:
1.遍历35种帧内预测模式使用predIntraAng进行预测,并调用xUpdateCandList构建候选列表。
2.调用getIntraDirPredictor获得最可能模式MPM,加入候选列表。
3.遍历候选列表,调用xRecurIntraCodingLumaQT完成变换、量化,计算得到RD Cost与最优PU模式比较,更新最优模式。
详细介绍见:HEVC代码学习42:estIntraPredLumaQT函数
xRecurIntraCodingLumaQT
xRecurIntraCodingLumaQT完成变换、量化、率失真计算的工作。其中调用了xIntraCodingTUBlock,是帧内预测变换量化的入口函数。
xIntraCodingTUBlock
xIntraCodingTUBlock是帧内预测变换量化的入口函数。其中调用了transformNxN和invTransformNxN进行变换量化和反变换反量化。这里调用predIntraAng用于得到预测信号。