HEVC学习(二十) —— 熵编码之一

本文深入分析HEVC编码器中CABAC(Context-Adaptive Binary Arithmetic Coding)的初始化过程,基于HM 9.1模型。内容涵盖压缩Slice时的entropy coder重置,initBuffer函数对context变量的初始化,以及与标准文档中表格(9-5至9-31)的对应关系。尽管HM实现与标准草案存在细微差异,但核心流程与H.264的CABAC相似。
摘要由CSDN通过智能技术生成

从本篇开始,接下来的若干篇会逐步分析HM 9.1中有关熵编码的过程。在此以及以后的几篇,我都默认大家对熵编码(针对CABAC,因为HEVC只有这一种编码方式,而H.264有CAVLC和CABAC两种)的基本概念和流程有了一定的基础,同时,由于HEVC中的CABAC基本流程与H.264中的基本一致,因此,这里暂时不会介绍熵编码框架和流程,有兴趣的可以参考H.264中的相关资料。我会按照编码的执行顺序逐步地分析代码,到最后会再给出总结。

 

本文首先介绍编码器的初始化过程,即draft 9.3.4.1的部分。

 

在Void TEncSlice::compressSlice( TComPic*& rpcPic )有这么一段:

  // set entropy coder
  if( m_pcCfg->getUseSBACRD() ) //!< 默认条件下m_bUseSBACRD为true //!< draft 9.3.4.1
  {
    m_pcSbacCoder->init( m_pcBinCABAC );
    m_pcEntropyCoder->setEntropyCoder   ( m_pcSbacCoder, pcSlice );
    m_pcEntropyCoder->resetEntropy      (); //!< 主要进行上下文模型的初始化,codILow和codIRange的初始化等
    m_pppcRDSbacCoder[0][CI_CURR_BEST]->load(m_pcSbacCoder);
    pppcRDSbacCoder = (TEncBinCABAC *) m_pppcRDSbacCoder[0][CI_CURR_BEST]->getEncBinIf();
    pppcRDSbacCoder->setBinCountingEnableFlag( false );
    pppcRDSbacCoder->setBinsCoded( 0 );
  }

重点看m_pcEntropyCoder->resetEntropy ();

该函数中调用的initBuffer功能即是对相应的context变量进行初始化,这个可参考draft 9.3.1.1的相关内容。

Void TEncSbac::resetEntropy           ()
{
  Int  iQp              = m_pcSlice->getSliceQp();
  SliceType eSliceType  = m_pcSlice->getSliceType();
  
  Int  encCABACTableIdx = m_pcSlice->getPPS()->getEncCABACTableIdx();
  if (!m_pcSlice->isIntra() && (encCABACTableIdx==B_SLICE || encCABACTableIdx==P_SLICE) && m_pcSlice->getPPS()->getCabacInitPresentFlag())
  {
    eSliceType = (SliceType) encCABACTableIdx;
  }
  //! draft 9.3.1.1 Initialization process for context variables
  m_cCUSplitFlagSCModel.initBuffer       ( eSliceType, iQp, (UChar*)INIT_SPLIT_FLAG );  
  m_cCUSkipFlagSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_SKIP_FLAG );
  m_cCUMergeFlagExtSCModel.initBuffer    ( eSliceType, 
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值