HEVC程式碼學習28:setLambda函式
阿新 • • 發佈:2019-01-23
在之前的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確定的。