zoukankan      html  css  js  c++  java
  • HM中再增加一路自己的entropy coder

    compressSlice 中一开始的entropy coder 设置:

    // set entropy coder

    if( m_pcCfg->getUseSBACRD() )

    {

    m_pcSbacCoder->init( m_pcBinCABAC );

    m_pcEntropyCoder->setEntropyCoder ( m_pcSbacCoder, pcSlice );

    m_pcEntropyCoder->resetEntropy ();

    m_pppcRDSbacCoder[0][CI_CURR_BEST]->load(m_pcSbacCoder);

    pppcRDSbacCoder = (TEncBinCABAC *) m_pppcRDSbacCoder[0][CI_CURR_BEST]->getEncBinIf();

    pppcRDSbacCoder->setBinCountingEnableFlag( false );

    pppcRDSbacCoder->setBinsCoded( 0 );

    }

    entropy coder 设为m_pcSbacCoder ,TEncBinCABAC 指向m_pcBinCABAC

    m_pppcRDSbacCoder[0][CI_CURR_BEST] 复制 m_pcSbacCoder的初始ContextModelTEncBinCABAC状态。

    pppcRDSbacCoder 指向m_pppcRDSbacCoder[0][CI_CURR_BEST]TEncBinCABAC

    dual layer的字典编码再添加一个自己的entropy coderTencSbac* m_pcSbacCoderDL

    TencSbac三个私有成员,ContextModelTEncBinCABAC状态。TencBinIf TEncBinCABACTComBitIf

    TComBitCounter

    class TEncSbac : public TencEntropyIf

    {

    protected

    TComBitIf* m_pcBitIf;

    TComSlice* m_pcSlice;

    TEncBinIf* m_pcBinIf;

    }

    dual layerm_pcSbacCoderDL 的初始设置:

    TEncBinCABAC *pppcRDSbacCoderDL = NULL;

    {

    m_pcSbacCoderDL->init( m_pcBinCABAC );

    m_pcEntropyCoder->setEntropyCoder ( m_pcSbacCoderDL, pcSlice );

    m_pcEntropyCoder->resetEntropy ();

    //m_pcSbacCoderDL->loadContexts( m_pcSbacCoder);

    pppcRDSbacCoderDL = (TEncBinCABAC *) m_pcSbacCoderDL->getEncBinIf();

    pppcRDSbacCoderDL->setBinCountingEnableFlag( false );

    pppcRDSbacCoderDL->setBinsCoded( 0 );

    }

    dual layer字典编码前的设置:

    m_pcEntropyCoder->setEntropyCoder ( m_pcSbacCoderDL, pcSlice );         m_pcEntropyCoder->setBitstream( &pcBitCounters[uiSubStrm] );

        m_pcCuEncoder->setBitCounter( &pcBitCounters[uiSubStrm] );

        m_pcBitCounter = &pcBitCounters[uiSubStrm];

        pppcRDSbacCoderDL->setBinCountingEnableFlag( true );

        m_pcBitCounter->resetBits();

        pppcRDSbacCoderDL->setBinsCoded( 0 );

    可以共用TcomBitCounter pcBitCounters[uiSubStrm],但是ContextModelTEncBinCABAC要有自己的。

    DUAL_CODER 自身的熵编码设置就有个小bug:

    {

    m_pTComDictEncoder->DictCompressCu(uiCUAddr,cuCnt-1, true, pcSlice);

    m_pcEntropyCoder->setBitstream( &pcBitCounters[uiSubStrm] );

    m_pcCuEncoder->setBitCounter( &pcBitCounters[uiSubStrm] );

    m_pcBitCounter = &pcBitCounters[uiSubStrm];

    pppcRDSbacCoder->setBinCountingEnableFlag( true );

    m_pcBitCounter->resetBits();

    pppcRDSbacCoder->setBinsCoded( 0 );

    }

    compressSlice一开始初始化的EntropyCoder m_pcSbacCoder, m_pcEntropyCoder->setEntropyCoder ( m_pcSbacCoder, pcSlice );

    这里没有设置EntropyCoder,所以第一个CU字典编码使用的是m_pcSbacCoder

    但是后面HM混合编码了一个CU之后,设置了EntropyCoderm_pppcRDSbacCoder[0][CI_CURR_BEST],从第二个CU开始这里就使用的m_pppcRDSbacCoder[0][CI_CURR_BEST](不过第一个CUm_pppcRDSbacCoder[0][CI_CURR_BEST] loadm_pcSbacCoder,但pppcRDSbacCoder指向的是m_pppcRDSbacCoder[0][CI_CURR_BEST]TEncBinCABAC.)

    Bug fix:最好加上m_pcEntropyCoder->setEntropyCoder (m_pppcRDSbacCoder[0][CI_CURR_BEST], pcSlice );

  • 相关阅读:
    solr 最佳实践
    DNS 域名解析过程
    mac 下 virtualbox 配置全网通
    搜索引擎使用技巧
    三叉搜索树
    双数组trie树的基本构造及简单优化
    基于回归-马尔科夫模型的客运量预测
    solr 常用命令
    PHP yield 分析,以及协程的实现,超详细版(上)
    C语言,简单计算器【上】
  • 原文地址:https://www.cnblogs.com/mlj318/p/3275215.html
Copyright © 2011-2022 走看看