阅读背景:

HM编码器代码阅读(22)——熵编码的初始化

来源:互联网 

入口函数:TEncSbac::resetEntropy:

这个函数的本质就是初始化各种高低文

// 重置熵编码器
Void TEncSbac::resetEntropy           ()
{
	Int  iQp              = m_pcSlice->getSliceQp();
	SliceType eSliceType  = m_pcSlice->getSliceType();

	Int  encCABACTableIdx = m_pcSlice->getPPS()->getEncCABACTableIdx();
	if (!m_pcSlice->isIntra() && (encCABACTableIdx==B_SLICE || encCABACTableIdx==P_SLICE) && m_pcSlice->getPPS()->getCabacInitPresentFlag())
	{
		eSliceType = (SliceType) encCABACTableIdx;
	}

	// 初始化各个模型的缓存

	// split标记的高低文
	m_cCUSplitFlagSCModel.initBuffer       ( eSliceType, iQp, (UChar*)INIT_SPLIT_FLAG );

	// skip标记的高低文
	m_cCUSkipFlagSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_SKIP_FLAG );

	// merge标记高低文
	m_cCUMergeFlagExtSCModel.initBuffer    ( eSliceType, iQp, (UChar*)INIT_MERGE_FLAG_EXT);

	// merge索引高低文
	m_cCUMergeIdxExtSCModel.initBuffer     ( eSliceType, iQp, (UChar*)INIT_MERGE_IDX_EXT);

	// partsize高低文
	m_cCUPartSizeSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_PART_SIZE );

	// 预测高低文
	m_cCUPredModeSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_PRED_MODE );

	// 帧内预测高低文
	m_cCUIntraPredSCModel.initBuffer       ( eSliceType, iQp, (UChar*)INIT_INTRA_PRED_MODE );

	// 色度预测高低文
	m_cCUChromaPredSCModel.initBuffer      ( eSliceType, iQp, (UChar*)INIT_CHROMA_PRED_MODE );

	// 帧间预测角度高低文
	m_cCUInterDirSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_INTER_DIR );

	// MV残差高低文
	m_cCUMvdSCModel.initBuffer             ( eSliceType, iQp, (UChar*)INIT_MVD );

	// 参考帧高低文
	m_cCURefPicSCModel.initBuffer          ( eSliceType, iQp, (UChar*)INIT_REF_PIC );

	// 量化步长高低文
	m_cCUDeltaQpSCModel.initBuffer         ( eSliceType, iQp, (UChar*)INIT_DQP );

	// CBF高低文
	m_cCUQtCbfSCModel.initBuffer           ( eSliceType, iQp, (UChar*)INIT_QT_CBF );

	// 四叉树根的CBF高低文
	m_cCUQtRootCbfSCModel.initBuffer       ( eSliceType, iQp, (UChar*)INIT_QT_ROOT_CBF );

	// 系数的符号高低文
	m_cCUSigCoeffGroupSCModel.initBuffer   ( eSliceType, iQp, (UChar*)INIT_SIG_CG_FLAG );

	// 符号高低文
	m_cCUSigSCModel.initBuffer             ( eSliceType, iQp, (UChar*)INIT_SIG_FLAG );

	// 最后一个X高低文
	m_cCuCtxLastX.initBuffer               ( eSliceType, iQp, (UChar*)INIT_LAST );

	// 最后一个Y高低文
	m_cCuCtxLastY.initBuffer               ( eSliceType, iQp, (UChar*)INIT_LAST );
	m_cCUOneSCModel.initBuffer             ( eSliceType, iQp, (UChar*)INIT_ONE_FLAG );

	// CU绝对索引?高低文
	m_cCUAbsSCModel.initBuffer             ( eSliceType, iQp, (UChar*)INIT_ABS_FLAG );

	// MVP索引高低文
	m_cMVPIdxSCModel.initBuffer            ( eSliceType, iQp, (UChar*)INIT_MVP_IDX );

	// TU划分标记高低文
	m_cCUTransSubdivFlagSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_TRANS_SUBDIV_FLAG );

	// SAO merge高低文
	m_cSaoMergeSCModel.initBuffer      ( eSliceType, iQp, (UChar*)INIT_SAO_MERGE_FLAG );

	// SAO类型索引高低文
	m_cSaoTypeIdxSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_SAO_TYPE_IDX );

	// 变换skip标记高低文
	m_cTransformSkipSCModel.initBuffer     ( eSliceType, iQp, (UChar*)INIT_TRANSFORMSKIP_FLAG );

	// 变换量化bypass标记高低文
	m_CUTransquantBypassFlagSCModel.initBuffer( eSliceType, iQp, (UChar*)INIT_CU_TRANSQUANT_BYPASS_FLAG );
	// new structure
	m_uiLastQp = iQp;

	// 二值化的一些操作
	m_pcBinIf->start();

	return;
}// 




你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: