HEVC代码学习28:setLambda函数

来源:互联网 发布:黄金未来走势预测知乎 编辑:程序博客网 时间:2024/06/05 00:40

在之前的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确定的。

原创粉丝点击