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 );

  • 相关阅读:
    哈希表,开放地址法之线性探测代码(JAVA)
    Java中几个关键字的意思
    java学习——File类操作
    Map三种遍历方法
    Spring Data Binding
    哈希表的基础理解
    选择排序
    map集合使用
    排序
    关于LinkedList
  • 原文地址:https://www.cnblogs.com/mlj318/p/3275215.html
Copyright © 2011-2022 走看看