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

 

 

posted @ 2013-08-22 16:36  mlj318  阅读(814)  评论(0编辑  收藏  举报