关于浮点QP

25 篇文章 3 订阅

总所周知,QP是整数。然而HM/JEM均支持浮点QP(floating point QP),而且HM中从HM-1.0就开始支持了,这是为什么呢?先来看配置文件的参数说明:
这里写图片描述

从上图可以看出,配置文件中的QP被程序读进来的时候是一个浮点数Double TAppEncCfg::m_fQP。读进来之后在函数TAppEncCfg::parseCfg中对这个浮点QP进行如下处理:

  // allocate slice-based dQP values
  m_aidQP = new Int[ m_framesToBeEncoded + m_iGOPSize + 1 ];
  ::memset( m_aidQP, 0, sizeof(Int)*( m_framesToBeEncoded + m_iGOPSize + 1 ) );

  // handling of floating-point QP values
  // if QP is not integer, sequence is split into two sections having QP and QP+1
  m_iQP = (Int)( m_fQP );
  if ( m_iQP < m_fQP )
  {
    Int iSwitchPOC = (Int)( m_framesToBeEncoded - (m_fQP - m_iQP)*m_framesToBeEncoded + 0.5 );
    // iSwitchPOC须是key帧,所以需要取整
    iSwitchPOC = (Int)( (Double)iSwitchPOC / m_iGOPSize + 0.5 )*m_iGOPSize;
    for ( Int i=iSwitchPOC; i<m_framesToBeEncoded + m_iGOPSize + 1; i++ )
    {
      m_aidQP[i] = 1;
    }
  }

上面的代码中,将poc小于iSwitchPOC的帧级QP偏置置为0,poc大于iSwitchPOC的帧级QP偏置置为1。其中,TEncCfg::m_aidQP
就是delta QP(QP偏置);如果m_fQP更接近m_iQP,iSwitchPOC更偏向0,如果m_fQP更接近m_iQP+1,iSwitchPOC更偏向m_framesToBeEncoded+m_iGOPSize。
再在TEncSlice::initEncSlice中用TEncCfg::m_aidQP修改slice级QP:

  // modify QP
  Int* pdQPs = m_pcCfg->getdQPs();
  if ( pdQPs )
  {
    dQP += pdQPs[ rpcSlice->getPOC() ];
  }

简言之,浮点QP是所有base QP的均值,且前面部分帧的base QP为[m_fQP],后面部分帧的base QP为[m_fQP]+1。
下面是一个例子,在不开率控的情况下设置QP为32.5,FramesToBeEncoded为9。从图中可以看出,前二个GOP的QP的base QP为32,第三个GOP的QP的base QP为33:
这里写图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值