HEVC码率控制代码追踪(三)

本文深入探讨了HEVC编码中图像级别和单元级别的Lambda及QP预测计算,参照JCTVC-K0103码率控制提案。内容包括Double TEncRCPic::estimatePicLambda和TEncRCPic::estimatePicQP函数,用于计算图片级Lambda和QP。同时介绍了单元层参数的计算,如通过getLCUTargetBpp函数计算单元层的bpp,进而得到Lambda和QP。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于图像级别和单元级别的lambda和qp预测计算
这两个级别各两个参数的计算主要考虑的是计算和计算后的平滑参数的设置。都有现成的公式可以参考。同样用到的是HEVC提案JCTVC-K0103(码率控制提案)
(一)Double TEncRCPic::estimatePicLambda

Double TEncRCPic::estimatePicLambda( list<TEncRCPic*>& listPreviousPictures, SliceType eSliceType)//估计图片级别的lambda
{
  Double alpha         = m_encRCSeq->getPicPara( m_frameLevel ).m_alpha;
  Double beta          = m_encRCSeq->getPicPara( m_frameLevel ).m_beta;
  Double bpp       = (Double)m_targetBits/(Double)m_numberOfPixel;//前面求得的bpp用于这里来获得lambda
  Double estLambda;
  if (eSliceType == I_SLICE)//I片有自己的lambda算法
  {
    estLambda = calculateLambdaIntra(alpha, beta, pow(m_totalCostIntra/(Double)m_numberOfPixel, BETA1), bpp);
  }
  else
  {
    estLambda = alpha * pow( bpp, beta );//非I帧的计算公式,提案中常用的公式
  }
  /*到这里当前帧的lambda已经求得,但是还需要对数据进行处理才能正式用于编码当中,用约束条件进行约束,使其值有限定范围*/
 //下面这段程序是对Lambda的平滑,保证前后帧之间的参数不变化太大。
  Double lastLevelLambda = -1.0;//上一个级别???
  Double lastPicLambda   = -1.0;//上一帧的lambda
  Double lastValidLambda = -1.0;
  list<TEncRCPic*>::iterator it;
  for ( it = listPreviousPictures.begin(); it != listPreviousPictures.end(); it++ )
  {
    if ( (*it)->getFrameLevel() == m_frameLevel )
    {
      lastLevelLambda = (*it)->getPicActualLambda();
    }
    lastPicLambda     = (*it)->getPicActualLambda();

    if ( lastPicLambda > 0.0 )
    {
      lastValidLambda = lastPicLambda;
    }
  }

  if ( lastLevelLambda > 0.0 )
  {
    lastLevelLambda = Clip3( 0.1, 10000.0, lastLevelLambda );
    estLambd
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值