1、修改的位置:在预测阶段的量化之后反量化之前这个时候。
以HM 12.0为例,在TEncSearch.cpp::xIntraCodingLumaBlk()函数中
// 变换(连同量化一起)
m_pcTrQuant->transformNxN ( pcCU, piResi, uiStride, pcCoeff,
#if ADAPTIVE_QP_SELECTION
pcArlCoeff,
#endif
uiWidth, uiHeight, uiAbsSum, TEXT_LUMA, uiAbsPartIdx,useTransformSkip );
// ==================================================== 20210524添加
// 在这里修改QDCT/QDST系数
// ====================================================
//--- set coded block flag ---
pcCU->setCbfSubParts ( ( uiAbsSum ? 1 : 0 ) << uiTrDepth, TEXT_LUMA, uiAbsPartIdx, uiFullDepth );
//--- inverse transform ---
// uiAbsSum表示变换系数的绝对值之和
if( uiAbsSum )
{
Int scalingListType = 0 + g_eTTable[(Int)TEXT_LUMA];
assert(scalingListType < 6);
// 反变换
m_pcTrQuant->invtransformNxN( pcCU->getCUTransquantBypass(uiAbsPartIdx), TEXT_LUMA,pcCU->getLumaIntraDir( uiAbsPartIdx ), piResi, uiStride, pcCoeff, uiWidth, uiHeight, scalingListType, useTransformSkip );
}
else
{
Pel* pResi = piResi;
memset( pcCoeff, 0, sizeof( TCoeff ) * uiWidth * uiHeight );
for( UInt uiY = 0; uiY < uiHeight; uiY++ )
{
memset( pResi, 0, sizeof( Pel ) * uiWidth );
pResi += uiStride;
}
}
2、修改完QDCT/QDST系数之后,要把uiAbsSum也一起更新。uiAbsSum是变换系数的绝对值之和。