HM中开启maxDeltaQP的操作

在不开启码率控制的情况下,CTU是按照帧级QP进行实际编码的,如果想使CTU级的QP不同,则需要配置maxDeltaQP。有以下两种方式开启maxDeltaQP:

一、配置文件

如果仅仅使CTU级QP在某一范围浮动,则只需要在配置文件中改动maxDeltaQP即可。例如:帧级QP为32,配置文件中的maxDeltaQP为1,则编码之后的CTU的QP会在[31,33]之间。

二、HM代码

由于我的目标是指定CTU级QP,就是不允许它以某一范围浮动,那么就不能在配置文件中改动了。在HM代码中的TEncTop.cpp中的xInitPPS函数中修改:

Void TEncTop::xInitPPS(TComPPS &pps, const TComSPS &sps)
{
  // pps ID already initialised.
  pps.setSPSId(sps.getSPSId());

  pps.setConstrainedIntraPred( m_bUseConstrainedIntraPred );
  Bool bUseDQP = (getMaxCuDQPDepth() > 0)? true : false;

  if((getMaxDeltaQP() != 0 )|| getUseAdaptiveQP())
  {
    bUseDQP = true;
  }

  if ( getLumaLevelToDeltaQPMapping().isEnabled() )
  {
    bUseDQP = true;
  }

  if (m_costMode==COST_SEQUENCE_LEVEL_LOSSLESS || m_costMode==COST_LOSSLESS_CODING)
  {
    bUseDQP=false;
  }


  if ( m_RCEnableRateControl )
  {
    pps.setUseDQP(true);
    pps.setMaxCuDQPDepth( 0 );
  }
  else if(bUseDQP)
  {
    pps.setUseDQP(true);
    pps.setMaxCuDQPDepth( m_iMaxCuDQPDepth );
  }
  else
  {
    pps.setUseDQP(false);
    pps.setMaxCuDQPDepth( 0 );
  }
  if (true) {
      pps.setUseDQP(true);
  }

//省略部分代码

在后面我加上了始终保持delta qp为true;然后在xCompressCTU中,将iBaseQP改为所要设定的QP值即可。需要注意的是,delta qp只会从第一个具有非零残差系数的块开始生效(这里涉及到量化组QG的概念),如果当前块的残差系数为0,那么它会沿用前一个已编码的CU块的QP。

三、问题的产生

在做实验的过程中,发现即使指定CTU级QP,帧级QP对编码后的码率影响也很大。例如:

①帧级QP为10,CTU级QP全为10;

②帧级QP为50,CTU级QP全为10。

①产生的码率远远大于②产生的码率。所以,现在的目标应该消除帧级QP对编码的影响,才可以使指定CTU级QP这一操作生效。

经过查看编码CTU的代码后,发现每个CTU进行R-D决策时都是使用的帧级的lambda,而lambda的大小是会影响模式选择、运动估计等过程的。(此处可以对比一下开启码控,则在CTU级,会根据目标比特计算lambda,再根据lambda推导出QP;其实我现在指定CTU级QP和开码控是有相似之处,所以对于每个我指定的CTU的QP,还要计算一次lambda值)

四、问题的解决

HM提供了修改lambda的函数,将指定的CTU级QP传进函数,即可得到预期的编码结果。

Void TEncSlice::updateLambda(TComSlice* pSlice, Double dQP)
{
  Int iQP = (Int)dQP;
  Double dLambda = calculateLambda(pSlice, m_gopID, pSlice->getDepth(), pSlice->getSliceQp(), dQP, iQP);

  setUpLambda(pSlice, dLambda, iQP);
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值