1. 程式人生 > >HEVC程式碼學習28:setLambda函式

HEVC程式碼學習28:setLambda函式

在之前的TComRdCost類學習中,我們提到,要計算率失真代價,需要三個量:失真D、拉格朗日因子λ和位元速率R。下面就來看一下λ的設定函式。
在TComRdCost類中定義了setLambda函式,來對λ值進行設定。

//設定λ
Void TComRdCost::setLambda( Double dLambda, const BitDepths &bitDepths )
{
  m_dLambda           = dLambda;        //λ
  m_sqrtLambda        = sqrt(m_dLambda);        //λ的平方根
#if RExt__HIGH_BIT_DEPTH_SUPPORT
m_dLambdaMotionSAD[0] = 65536.0 * m_sqrtLambda; m_dLambdaMotionSSE[0] = 65536.0 * m_dLambda; #if FULL_NBIT dLambda = 0.57 * pow(2.0, ((LOSSLESS_AND_MIXED_LOSSLESS_RD_COST_TEST_QP_PRIME - 12) / 3.0)); #else dLambda = 0.57 * pow(2.0, ((LOSSLESS_AND_MIXED_LOSSLESS_RD_COST_TEST_QP_PRIME - 12 - 6 * (bitDepths.recon[CHANNEL_TYPE_LUMA] - 8
)) / 3.0)); #endif m_dLambdaMotionSAD[1] = 65536.0 * sqrt(dLambda); m_dLambdaMotionSSE[1] = 65536.0 * dLambda; #else //m_uiLambdaMotionSAD[2 /* 0=standard, 1=for transquant bypass when mixed-lossless cost evaluation enabled*/] m_uiLambdaMotionSAD[0] = (UInt)floor(65536.0 * m_sqrtLambda); m_uiLambdaMotionSSE[0
] = (UInt)floor(65536.0 * m_dLambda ); #if FULL_NBIT dLambda = 0.57 * pow(2.0, ((LOSSLESS_AND_MIXED_LOSSLESS_RD_COST_TEST_QP_PRIME - 12) / 3.0)); #else dLambda = 0.57 * pow(2.0, ((LOSSLESS_AND_MIXED_LOSSLESS_RD_COST_TEST_QP_PRIME - 12 - 6 * (bitDepths.recon[CHANNEL_TYPE_LUMA] - 8)) / 3.0)); #endif m_uiLambdaMotionSAD[1] = (UInt)floor(65536.0 * sqrt(dLambda)); m_uiLambdaMotionSSE[1] = (UInt)floor(65536.0 * dLambda ); #endif }

可以看到其中分兩種情況:標準情況和變換量化旁路混合無損成本評估啟用情況,計算了SAD和SSE兩種λ。而計算中使用到的dLambda是直接由上層傳入的,實際是通過QP確定的。