在执行色度分量的预测时,对色度分量的11种候选模式都调用一次xRecurIntraChromaCodingQT函数,在里面完成预测,求残差,变换量化和重建,并返回失真。
Void
TEncSearch::xRecurIntraChromaCodingQT(TComYuv* pcOrgYuv,
TComYuv* pcPredYuv,
TComYuv* pcResiYuv,
#if COM16_C806_LARGE_CTU
Pel* resiLuma[NUMBER_OF_STORED_RESIDUAL_TYPES],
#else
Pel resiLuma[NUMBER_OF_STORED_RESIDUAL_TYPES][MAX_CU_SIZE * MAX_CU_SIZE],
#endif
Distortion& ruiDist,
TComTU& rTu
DEBUG_STRING_FN_DECLARE(sDebug))
{
TComDataCU *pcCU = rTu.getCU();
const UInt uiTrDepth = rTu.GetTransformDepthRel();//一定为0;
#if JVET_C0024_QTBT
assert(rTu.GetAbsPartIdxTU()==0 && uiTrDepth==0);
UInt uiWIdx = g_aucConvertToBit[pcCU->getWidth(0)];
UInt uiHIdx = g_aucConvertToBit[pcCU->getHeight(0)];
#else
const UInt uiAbsPartIdx = rTu.GetAbsPartIdxTU();
#endif
const ChromaFormat format = rTu.GetChromaFormat();
#if !JVET_C0024_QTBT
UInt uiTrMode = pcCU->getTransformIdx( uiAbsPartIdx );
#endif
const UInt numberValidComponents = getNumberValidComponents(format);
#if JVET_C0024_QTBT
assert(uiTrDepth==0);
#else
if( uiTrMode == uiTrDepth )
{
#endif
if (!rTu.ProcessChannelSection(CHANNEL_TYPE_CHROMA))
{
return;
}
#if !JVET_C0024_QTBT
const UInt uiFullDepth = rTu.GetTransformDepthTotal();
#endif
Bool checkTransformSkip = pcCU->getSlice()->getPPS()->getUseTransformSkip();
#if JVET_C0024_QTBT
checkTransformSkip &= TUCompRectHasAssociatedTransformSkipFlag(pcCU->getSlice()->isIntra(), rTu.getRect(COMPONENT_Cb), pcCU->getSlice()->getPPS()->getPpsRangeExtension().getLog2MaxTransformSkipBlockSize());
#else
checkTransformSkip &= TUCompRectHasAssociatedTransformSkipFlag(rTu.getRect(COMPONENT_Cb), pcCU->getSlice()->getPPS()->getPpsRangeExtension().getLog2MaxTransformSkipBlockSize());
#endif
if ( m_pcEncCfg->getUseTransformSkipFast() )
{
#if JVET_C0024_QTBT//只有亮度分量使用跳过变换时才允许色度分量使用
checkTransformSkip &= TUCompRectHasAssociatedTransformSkipFlag(pcCU->getSlice()->isIntra(), rTu.getRect(COMPONENT_Y), pcCU->getSlice()->getPPS()->getPpsRangeExtension().getLog2MaxTransformSkipBlockSize());
#else
checkTransformSkip &= TUCompRectHasAssociatedTransformSkipFlag(rTu.getRect(COMPONENT_Y), pcCU->getSlice()->getPPS()->getPpsRangeExtension().getLog2Max