推荐http://blog.csdn.net/nb_vol_1/article/details/51190324
在http://blog.csdn.net/lin453701006/article/details/72403936学习中,我们提到xCheckRDCostInter调用了encodeResAndCalcRdInterCU来计算残差和RD cost。今天来学习encodeResAndCalcRdInterCU函数。
encodeResAndCalcRdInterCU的主要功能是计算残差和RD cost,以及进行熵编码。
encodeResAndCalcRdInterCU主要分为两大部分:无残差编码(skip模式)和残差编码。
无残差编码(skip模式):
1、设置skip flag。
2、残差置为0,重构图像直接复制预测图像。
3、计算重构图像与原始图像之间的失真。
4、对skip flag和merge索引进行熵编码。
5、存储总的bit数、失真、代价。
残差编码:
1、原始图像减预测图像计算残差。
2、估计残差的率失真代价和比特代价。
3、进行熵编码。
4、计算总失真。
5、存储总的bit数、失真、代价。
//计算PU的残差和率失真
//! encode residual and calculate rate-distortion for a CU block
Void TEncSearch::encodeResAndCalcRdInterCU( TComDataCU* pcCU, TComYuv* pcYuvOrg, TComYuv* pcYuvPred,
TComYuv* pcYuvResi, TComYuv* pcYuvResiBest, TComYuv* pcYuvRec,
Bool bSkipResidual DEBUG_STRING_FN_DECLARE(sDebug) )
{
assert ( !pcCU->isIntra(0) );
const UInt cuWidthPixels = pcCU->getWidth ( 0 );
const UInt cuHeightPixels = pcCU->getHeight( 0 );
const Int numValidComponents = pcCU->getPic()->getNumberValidComponents();
const TComSPS &sps=*(pcCU->getSlice()->getSPS());
// The pcCU is not marked as skip-mode at this point, and its m_pcTrCoeff, m_pcArlCoeff, m_puhCbf, m_puhTrIdx will all be 0.
// due to prior calls to TComDataCU::initEstData( );