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

  • 相关阅读:
    word批量打印工具,c#写的
    word添加页眉脚和设置各页不同的页眉页脚.
    打印机双面打印
    ORACLE OCP认证
    基于.net程序,使用cefsharp开发的打开网页工具,如何不加载图片
    在iis上运行的服务器端程序,运行一段时间后,访问都只出现一行乱码,回收进程池后又好了,求大神回复
    ArcGis API for JavaScript 开发笔记一 加载地图
    修改现有消息类让.net core项目支持Protobuf
    结合现有分布式系统的数据一致性思考
    让现有vue前端项目快速支持多语言
  • 原文地址:https://www.cnblogs.com/mlj318/p/3275215.html
Copyright © 2020-2023  润新知