本文主要是列出几个与变换有关的函数,以及涉及到的比较重要的变量,但不会去深入讨论函数的实现,日后有机会的话会更详细地讨论这几个函数,这里仅是列举出来,起到备忘的作用,也能供大家参考。
如何定位到这几个函数的,方法与前面的一篇博客HEVC学习(八) —— 以SAO为例浅析跟踪代码方法类似,有兴趣的朋友可以去看看,这里就不重复这个过程了。
在xCompressCU函数中,有这么几个函数值得我们注意的,xCheckRDCostInter、xCheckRDCostMerge2Nx2N、xCheckRDCostIntra。它们分别是实现帧间预测模式、Merge模式、帧内预测式的主函数。前两个函数的子函数xEstimateResidualQT(实际上通过调用函数encodeResAndCalcRdInterCU)、第三个函数的子函数xRecurIntraCodingQT(实际上通过调用xIntraCodingLumaBlk、xIntraCodingChromaBlk)均会调用函数transformNxN,该函数如下定义:
Void TComTrQuant::transformNxN( TComDataCU* pcCU,
Pel* pcResidual,
UInt uiStride,
TCoeff* rpcCoeff,
#if ADAPTIVE_QP_SELECTION
Int*& rpcArlCoeff,
#endif
UInt uiWidth,
UInt uiHeight,
UInt& uiAbsSum,
TextType eTType,
UInt uiAbsPartIdx,
Bool useTransformSkip
)
{
if (pcCU->getCUTransquantBypass(uiAbsPartIdx))
{
uiAbsSum=0;
for (UInt k = 0; k<uiHeight; k++)
{
for (UInt j = 0; j<uiWidth; j++)
{
rpcCoeff[k*uiWidth+j]= pcResidual[k*uiStride+j];
uiAbsSum += abs(pcResidual[k*uiStride+j]);
}
}
return;
}
UInt uiMode; //luma intra pred
if(eTType == TEXT_LUMA && pcCU->getPredictionMode(uiAbsPartIdx) == MODE_INTRA )
{
uiMode = pcCU->getLumaIntraDir( uiAbsPartIdx );
}
else
{
uiMode = REG_DCT;
}
uiAbsSum = 0;
assert( (pcCU->getSlice()->getSPS()->getMaxTrSize() >= uiWidth) );
if(useTransformSkip)
{
xTransform