HEVC帧间预测之三――TEncCu::xCheckRDCostMerge2Nx2N函数分析(二)
/!< CBF为0,说明变换系数全为0
{
mergeCandBuffer[uiMergeCand] = 1;
}
}
rpcTempCU->setSkipFlagSubParts( rpcTempCU->getQtRootCbf(0) == 0, 0, uhDepth );
Int orgQP = rpcTempCU->getQP( 0 );
xCheckDQP( rpcTempCU );
xCheckBestMode(rpcBestCU, rpcTempCU, uhDepth); //!< 更新最佳模式
rpcTempCU->initEstData( uhDepth, orgQP ); //!< 重新初始化预测参数,为下一次预测做准备
if( m_pcEncCfg->getUseFastDecisionForMerge() && !bestIsSkip ) //!< m_useFastDecisionForMerge默认为true
{
bestIsSkip = rpcBestCU->getQtRootCbf(0) == 0;
}
}//!< if( !(bestIsSkip && uiNoResidual == 0) )
}//!< if(!(uiNoResidual==1 && mergeCandBuffer[uiMergeCand]==1))
}//!<
}//!< for( UInt uiMergeCand = 0; uiMergeCand < numValidMergeCand; ++uiMergeCand )
if(uiNoResidual == 0 && m_pcEncCfg->getUseEarlySkipDetection()) //!< 第一次对merging candidates迭代后
{
if(rpcBestCU->getQtRootCbf( 0 ) == 0) //!< earlyDetectionSkip 算法
{
if( rpcBestCU->getMergeFlag( 0 ))
{
*earlyDetectionSkipMode = true;
}
else
{
Int absoulte_MV=0;
for ( UInt uiRefListIdx = 0; uiRefListIdx < 2; uiRefListIdx++ )
{ www.2cto.com
if ( rpcBestCU->getSlice()->getNumRefIdx( RefPicList( uiRefListIdx ) ) > 0 )
{
TComCUMvField* pcCUMvField = rpcBestCU->getCUMvField(RefPicList( uiRefListIdx ));
Int iHor = pcCUMvField->getMvd( 0 ).getAbsHor();
Int iVer = pcCUMvField->getMvd( 0 ).getAbsVer();
absoulte_MV+=iHor+iVer;
}
}
if(absoulte_MV == 0)
{
*earlyDetectionSkipMode = true;
}
}//!< else
}//!< if(rpcBestCU->getQtRootCbf( 0 ) == 0)
}//!< if(uiNoResidual == 0 && m_pcEncCfg->getUseEarlySkipDetection())
}//!< for( UInt uiNoResidual = 0; uiNoResidual < iteration; ++uiNoResidual )
}