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的初始ContextModel和TEncBinCABAC状态。
pppcRDSbacCoder 指向m_pppcRDSbacCoder[0][CI_CURR_BEST]的TEncBinCABAC
为dual layer的字典编码再添加一个自己的entropy coder(TencSbac* m_pcSbacCoderDL):
TencSbac三个私有成员,ContextModel和TEncBinCABAC状态。TencBinIf 为 TEncBinCABAC,TComBitIf
为TComBitCounter
class TEncSbac : public TencEntropyIf
{
protected:
TComBitIf* m_pcBitIf;
TComSlice* m_pcSlice;
TEncBinIf* m_pcBinIf;
}
dual layer的m_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],但是ContextModel和TEncBinCABAC要有自己的。
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之后,设置了EntropyCoder是m_pppcRDSbacCoder[0][CI_CURR_BEST],从第二个CU开始这里就使用的m_pppcRDSbacCoder[0][CI_CURR_BEST]。(不过第一个CU时m_pppcRDSbacCoder[0][CI_CURR_BEST] load自m_pcSbacCoder,但pppcRDSbacCoder指向的是m_pppcRDSbacCoder[0][CI_CURR_BEST]的TEncBinCABAC.)
Bug fix:最好加上m_pcEntropyCoder->setEntropyCoder (m_pppcRDSbacCoder[0][CI_CURR_BEST], pcSlice );