率失真优化是HEVC中的重要内容,通过基本形式如下图的公式求率失真代价J,权衡码率R和失真D,为编码器选择最优编码参数,实现高效编码。
HM中,对于率失真相关的计算都是通过TComRdCost类指针m_pcRdCost调用其成员函数实现的,那就来看下TComRdCost类。
TComRdCost类中定义了失真D、码率R和λ有关的函数,其中计算RD代价的函数为:calcRdCost(详见http://blog.csdn.net/lin453701006/article/details/78145247)。失真计算函数会通过FpDistFunc m_afpDistortFunc[DF_TOTAL_FUNCTIONS]函数指针来调用。
/// RD cost computation class
//率失真
class TComRdCost
{
private:
// for distortion
FpDistFunc m_afpDistortFunc[DF_TOTAL_FUNCTIONS]; // [eDFunc] 失真函数指针
CostMode m_costMode; //失真模式
Double m_distortionWeight[MAX_NUM_COMPONENT]; // only chroma values are used. //色度失真权重
Double m_dLambda;
Double m_sqrtLambda;
#if RExt__HIGH_BIT_DEPTH_SUPPORT
Double m_dLambdaMotionSAD[2 /* 0=standard, 1=for transquant bypass when mixed-lossless cost evaluation enabled*/];
Double m_dLambdaMotionSSE[2 /* 0=standard, 1=for transquant bypass when mixed-lossless cost evaluation enabled*/];
#else
UInt m_uiLambdaMotionSAD[2 /* 0=standard, 1=for transquant bypass when mixed-lossless cost evaluation enabled*/];
UInt m_uiLambdaMotionSSE[2 /* 0=standard, 1=for transquant bypass when mixed-lossless cost evaluation enabled*/];
#endif
Double m_dFrameLambda;
// for motion cost
TComMv m_mvPredictor;
#if RExt__HIGH_BIT_DEPTH_SUPPORT
Double m_dCost;
#else
UInt m_uiCost;
#endif
Int m_iCostScale;
public:
TComRdCost();
virtual ~TComRdCost();
//计算RD代价
Double calcRdCost ( UInt uiBits, Distortion uiDistortion, Bool bFlag = false, DFunc eDFunc = DF_DEFAULT );
Double calcRdCost64( UInt64 uiBits, UInt64 uiDistortion, Bool bFlag = false, DFunc eDFunc =