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;
}
Void TEncBinCABAC::start()
{
	m_uiLow            = 0;				// 下限(进行二值化的时候)
	m_uiRange          = 510;		// 范围(进行二值化的时候)
	m_bitsLeft         = 23;
	m_numBufferedBytes = 0;
	m_bufferedByte     = 0xff;
}

工程中预定义了一些初始的上下文模型,预定义的各个上下模型实际就是一些二维数组:

// 上下文模型的数量
#define MAX_NUM_CTX_MOD             512       ///< maximum number of supported contexts

// 上下文split标志的数量
#define NUM_SPLIT_FLAG_CTX            3       ///< number of context models for split flag
// 上下文skip标志的数量
#define NUM_SKIP_FLAG_CTX             3       ///< number of context models for skip flag

// 上下文merge扩展中merge标志的数量
#define NUM_MERGE_FLAG_EXT_CTX        1       ///< number of context models for merge flag of merge extended
// 上下文merge扩展中merge index的数量
#define NUM_MERGE_IDX_EXT_CTX         1       ///< number of context models for merge index of merge extended

// partition的类型
#define NUM_PART_SIZE_CTX             4       ///< number of context models for partition size
// 预测的类型
#define NUM_PRED_MODE_CTX             1       ///< number of context models for prediction mode

// 帧内预测的数量
#define NUM_ADI_CTX                   1       ///< number of context models for intra prediction

// 色度帧内预测的数量
#define NUM_CHROMA_PRED_CTX           2       ///< number of context models for intra prediction (chroma)
// 用于帧间预测的上下文模型的数量
#define NUM_INTER_DIR_CTX             5       ///< number of context models for inter prediction direction
// 用于MV的上下文模型的数量
#define NUM_MV_RES_CTX                2       ///< number of context models for motion vector difference
// 用于参考索引的上下文模型的数量
#define NUM_REF_NO_CTX                2       ///< number of context models for reference index
// 用于变换切分的的上下文模型的数量
#define NUM_TRANS_SUBDIV_FLAG_CTX     3       ///< number of context models for transform subdivision flags
// 用于量化树的CBF的上下文模型的数量
#define NUM_QT_CBF_CTX                4       ///< number of context models for QT CBF
// 用于量化树根的CBF的上下文模型的数量
#define NUM_QT_ROOT_CBF_CTX           1       ///< number of context models for QT ROOT CBF
// 用于dQP的上下文模型的数量
#define NUM_DELTA_QP_CTX              3       ///< number of context models for dQP

//
#define NUM_SIG_CG_FLAG_CTX           2       ///< number of context models for MULTI_LEVEL_SIGNIFICANCE
// 用于符号(正负号)标志的上下文模型的数量
#define NUM_SIG_FLAG_CTX              42      ///< number of context models for sig flag
// 用于亮度符号标志的上下文模型的数量
#define NUM_SIG_FLAG_CTX_LUMA         27      ///< number of context models for luma sig flag
// 用于色度符号标志的上下文模型的数量
#define NUM_SIG_FLAG_CTX_CHROMA       15      ///< number of context models for chroma sig flag

// 用于 最后一个系数 的上下文模型的数量
#define NUM_CTX_LAST_FLAG_XY          15      ///< number of context models for last coefficient position

#define NUM_ONE_FLAG_CTX              24      ///< number of context models for greater than 1 flag
#define NUM_ONE_FLAG_CTX_LUMA         16      ///< number of context models for greater than 1 flag of luma
#define NUM_ONE_FLAG_CTX_CHROMA        8      ///< number of context models for greater than 1 flag of chroma
#define NUM_ABS_FLAG_CTX               6      ///< number of context models for greater than 2 flag
#define NUM_ABS_FLAG_CTX_LUMA          4      ///< number of context models for greater than 2 flag of luma
#define NUM_ABS_FLAG_CTX_CHROMA        2      ///< number of context models for greater than 2 flag of chroma

// 用于MVP索引的上下文模型的数量
#define NUM_MVP_IDX_CTX               1       ///< number of context models for MVP index

// 用于SAO merge的上下文模型的数量
#define NUM_SAO_MERGE_FLAG_CTX        1       ///< number of context models for SAO merge flags
// 用于SAO 类型索引的上下文模型的数量
#define NUM_SAO_TYPE_IDX_CTX          1       ///< number of context models for SAO type index

// 用于变换skip的上下文模型的数量
#define NUM_TRANSFORMSKIP_FLAG_CTX    1       ///< number of context models for transform skipping
#define NUM_CU_TRANSQUANT_BYPASS_FLAG_CTX  1
#define CNU                          154      ///< dummy initialization value for unused context models 'Context model Not Used'

// ====================================================================================================================
// Tables
// ====================================================================================================================

// initial probability for cu_transquant_bypass flag
// cu_transquant_bypass标志的上下文模型
static const UChar
	INIT_CU_TRANSQUANT_BYPASS_FLAG[3][NUM_CU_TRANSQUANT_BYPASS_FLAG_CTX] =
{
	{ 154 },
	{ 154 },
	{ 154 },
};

// initial probability for split flag
// split标志的上下文模型
static const UChar
	INIT_SPLIT_FLAG[3][NUM_SPLIT_FLAG_CTX] =
{
	{ 107,  139,  126, },
	{ 107,  139,  126, },
	{ 139,  141,  157, },
};

// skip标志的上下文模型
static const UChar
	INIT_SKIP_FLAG[3][NUM_SKIP_FLAG_CTX] =
{
	{ 197,  185,  201, },
	{ 197,  185,  201, },
	{ CNU,  CNU,  CNU, },
};

// merge模式的标志的上下文
static const UChar
	INIT_MERGE_FLAG_EXT[3][NUM_MERGE_FLAG_EXT_CTX] =
{
	{ 154, },
	{ 110, },
	{ CNU, },
};

// merge模式的索引的上下文
static const UChar
	INIT_MERGE_IDX_EXT[3][NUM_MERGE_IDX_EXT_CTX] =
{
	{ 137, },
	{ 122, },
	{ CNU, },
};

// part_size的上下文
static const UChar
	INIT_PART_SIZE[3][NUM_PART_SIZE_CTX] =
{
	{ 154,  139,  154,  154 },
	{ 154,  139,  154,  154 },
	{ 184,  CNU,  CNU,  CNU },
};

// 预测模式的上下文
static const UChar
	INIT_PRED_MODE[3][NUM_PRED_MODE_CTX] =
{
	{ 134, },
	{ 149, },
	{ CNU, },
};

// 帧内预测的模式(亮度)的上下文
static const UChar
	INIT_INTRA_PRED_MODE[3][NUM_ADI_CTX] =
{
	{ 183, },
	{ 154, },
	{ 184, },
};

// 帧内预测的模式(色度)的上下文
static const UChar
	INIT_CHROMA_PRED_MODE[3][NUM_CHROMA_PRED_CTX] =
{
	{ 152,  139, },
	{ 152,  139, },
	{  63,  139, },
};

// 帧间预测方向(前后两个方向)
static const UChar
	INIT_INTER_DIR[3][NUM_INTER_DIR_CTX] =
{
	{  95,   79,   63,   31,  31, },
	{  95,   79,   63,   31,  31, },
	{ CNU,  CNU,  CNU,  CNU, CNU, },
};

// MV残差上下文
static const UChar
	INIT_MVD[3][NUM_MV_RES_CTX] =
{
	{ 169,  198, },
	{ 140,  198, },
	{ CNU,  CNU, },
};

// 参考帧上下文
static const UChar
	INIT_REF_PIC[3][NUM_REF_NO_CTX] =
{
	{ 153,  153 },
	{ 153,  153 },
	{ CNU,  CNU },
};

// dQP
// 量化步长上下文
static const UChar
	INIT_DQP[3][NUM_DELTA_QP_CTX] =
{
	{ 154,  154,  154, },
	{ 154,  154,  154, },
	{ 154,  154,  154, },
};

// CBF(编码块标志)上下文
static const UChar
	INIT_QT_CBF[3][2*NUM_QT_CBF_CTX] =
{
	{ 153,  111,  CNU,  CNU,   149,   92,  167,  154 },
	{ 153,  111,  CNU,  CNU,   149,  107,  167,  154 },
	{ 111,  141,  CNU,  CNU,    94,  138,  182,  154 },
};

static const UChar
	INIT_QT_ROOT_CBF[3][NUM_QT_ROOT_CBF_CTX] =
{
	{  79, },
	{  79, },
	{ CNU, },
};

// 最后一个系数的位置
static const UChar
	INIT_LAST[3][2*NUM_CTX_LAST_FLAG_XY] =
{
	{ 125,  110,  124,  110,   95,   94,  125,  111,  111,   79,  125,  126,  111,  111,   79,
	108,  123,   93,  CNU,  CNU,  CNU,  CNU,  CNU,  CNU,  CNU,  CNU,  CNU,  CNU,  CNU,  CNU,
	},
	{ 125,  110,   94,  110,   95,   79,  125,  111,  110,   78,  110,  111,  111,   95,   94,
	108,  123,  108,  CNU,  CNU,  CNU,  CNU,  CNU,  CNU,  CNU,  CNU,  CNU,  CNU,  CNU,  CNU,
	},
	{ 110,  110,  124,  125,  140,  153,  125,  127,  140,  109,  111,  143,  127,  111,   79,
	108,  123,   63,  CNU,  CNU,  CNU,  CNU,  CNU,  CNU,  CNU,  CNU,  CNU,  CNU,  CNU,  CNU,
	},
};

static const UChar
	INIT_SIG_CG_FLAG[3][2 * NUM_SIG_CG_FLAG_CTX] =
{
	{ 121,  140,
	61,  154,
	},
	{ 121,  140,
	61,  154,
	},
	{  91,  171,
	134,  141,
	},
};

// 整数符号的标志
static const UChar
	INIT_SIG_FLAG[3][NUM_SIG_FLAG_CTX] =
{
	{ 170,  154,  139,  153,  139,  123,  123,   63,  124,  166,  183,  140,  136,  153,  154,  166,  183,  140,  136,  153,  154,  166,  183,  140,  136,  153,  154,  170,  153,  138,  138,  122,  121,  122,  121,  167,  151,  183,  140,  151,  183,  140,  },
	{ 155,  154,  139,  153,  139,  123,  123,   63,  153,  166,  183,  140,  136,  153,  154,  166,  183,  140,  136,  153,  154,  166,  183,  140,  136,  153,  154,  170,  153,  123,  123,  107,  121,  107,  121,  167,  151,  183,  140,  151,  183,  140,  },
	{ 111,  111,  125,  110,  110,   94,  124,  108,  124,  107,  125,  141,  179,  153,  125,  107,  125,  141,  179,  153,  125,  107,  125,  141,  179,  153,  125,  140,  139,  182,  182,  152,  136,  152,  136,  153,  136,  139,  111,  136,  139,  111,  },
};

// 1标志上下文
static const UChar
	INIT_ONE_FLAG[3][NUM_ONE_FLAG_CTX] =
{
	{ 154,  196,  167,  167,  154,  152,  167,  182,  182,  134,  149,  136,  153,  121,  136,  122,  169,  208,  166,  167,  154,  152,  167,  182, },
	{ 154,  196,  196,  167,  154,  152,  167,  182,  182,  134,  149,  136,  153,  121,  136,  137,  169,  194,  166,  167,  154,  167,  137,  182, },
	{ 140,   92,  137,  138,  140,  152,  138,  139,  153,   74,  149,   92,  139,  107,  122,  152,  140,  179,  166,  182,  140,  227,  122,  197, },
};

// 帧内预测索引
static const UChar
	INIT_ABS_FLAG[3][NUM_ABS_FLAG_CTX] =
{
	{ 107,  167,   91,  107,  107,  167, },
	{ 107,  167,   91,  122,  107,  167, },
	{ 138,  153,  136,  167,  152,  152, },
};

// MVP索引
static const UChar
	INIT_MVP_IDX[3][NUM_MVP_IDX_CTX] =
{
	{ 168 },
	{ 168 },
	{ CNU },
};

// SAO merge标志
static const UChar
	INIT_SAO_MERGE_FLAG[3][NUM_SAO_MERGE_FLAG_CTX] =
{
	{ 153,  },
	{ 153,  },
	{ 153,  },
};

// SAO 类型索引
static const UChar
	INIT_SAO_TYPE_IDX[3][NUM_SAO_TYPE_IDX_CTX] =
{
	{ 160, },
	{ 185, },
	{ 200, },
};

// 变换分割标志
static const UChar
	INIT_TRANS_SUBDIV_FLAG[3][NUM_TRANS_SUBDIV_FLAG_CTX] =
{
	{ 224,  167,  122, },
	{ 124,  138,   94, },
	{ 153,  138,  138, },
};

// 变换skip标志
static const UChar
	INIT_TRANSFORMSKIP_FLAG[3][2*NUM_TRANSFORMSKIP_FLAG_CTX] =
{
	{ 139,  139},
	{ 139,  139},
	{ 139,  139},
};
//! \}

上下文模型在工程中是ContextModel3DBuffer类型,为了弄清楚这个结构,我们先看TEncSbac的构造函数:

TEncSbac::TEncSbac()
	// new structure here
	: m_pcBitIf                   ( NULL )
	, m_pcSlice                   ( NULL )
	, m_pcBinIf                   ( NULL )
	, m_uiCoeffCost               ( 0 )
	, m_numContextModels          ( 0 )		//context model的计数值,接下来的所有除了assert的语句都是对句法元素对应的context进行初始化
	, m_cCUSplitFlagSCModel       ( 1,             1,               NUM_SPLIT_FLAG_CTX            , m_contextModels + m_numContextModels, m_numContextModels )
	, m_cCUSkipFlagSCModel        ( 1,             1,               NUM_SKIP_FLAG_CTX             , m_contextModels + m_numContextModels, m_numContextModels)
	, m_cCUMergeFlagExtSCModel    ( 1,             1,               NUM_MERGE_FLAG_EXT_CTX        , m_contextModels + m_numContextModels, m_numContextModels)
	, m_cCUMergeIdxExtSCModel     ( 1,             1,               NUM_MERGE_IDX_EXT_CTX         , m_contextModels + m_numContextModels, m_numContextModels)
	, m_cCUPartSizeSCModel        ( 1,             1,               NUM_PART_SIZE_CTX             , m_contextModels + m_numContextModels, m_numContextModels)
	, m_cCUPredModeSCModel        ( 1,             1,               NUM_PRED_MODE_CTX             , m_contextModels + m_numContextModels, m_numContextModels)
	, m_cCUIntraPredSCModel       ( 1,             1,               NUM_ADI_CTX                   , m_contextModels + m_numContextModels, m_numContextModels)
	, m_cCUChromaPredSCModel      ( 1,             1,               NUM_CHROMA_PRED_CTX           , m_contextModels + m_numContextModels, m_numContextModels)
	, m_cCUDeltaQpSCModel         ( 1,             1,               NUM_DELTA_QP_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
	, m_cCUInterDirSCModel        ( 1,             1,               NUM_INTER_DIR_CTX             , m_contextModels + m_numContextModels, m_numContextModels)
	, m_cCURefPicSCModel          ( 1,             1,               NUM_REF_NO_CTX                , m_contextModels + m_numContextModels, m_numContextModels)
	, m_cCUMvdSCModel             ( 1,             1,               NUM_MV_RES_CTX                , m_contextModels + m_numContextModels, m_numContextModels)
	, m_cCUQtCbfSCModel           ( 1,             2,               NUM_QT_CBF_CTX                , m_contextModels + m_numContextModels, m_numContextModels)
	, m_cCUTransSubdivFlagSCModel ( 1,             1,               NUM_TRANS_SUBDIV_FLAG_CTX     , m_contextModels + m_numContextModels, m_numContextModels)
	, m_cCUQtRootCbfSCModel       ( 1,             1,               NUM_QT_ROOT_CBF_CTX           , m_contextModels + m_numContextModels, m_numContextModels)
	, m_cCUSigCoeffGroupSCModel   ( 1,             2,               NUM_SIG_CG_FLAG_CTX           , m_contextModels + m_numContextModels, m_numContextModels)
	, m_cCUSigSCModel             ( 1,             1,               NUM_SIG_FLAG_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
	, m_cCuCtxLastX               ( 1,             2,               NUM_CTX_LAST_FLAG_XY          , m_contextModels + m_numContextModels, m_numContextModels)
	, m_cCuCtxLastY               ( 1,             2,               NUM_CTX_LAST_FLAG_XY          , m_contextModels + m_numContextModels, m_numContextModels)
	, m_cCUOneSCModel             ( 1,             1,               NUM_ONE_FLAG_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
	, m_cCUAbsSCModel             ( 1,             1,               NUM_ABS_FLAG_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
	, m_cMVPIdxSCModel            ( 1,             1,               NUM_MVP_IDX_CTX               , m_contextModels + m_numContextModels, m_numContextModels)
	, m_cSaoMergeSCModel          ( 1,             1,               NUM_SAO_MERGE_FLAG_CTX   , m_contextModels + m_numContextModels, m_numContextModels)
	, m_cSaoTypeIdxSCModel        ( 1,             1,               NUM_SAO_TYPE_IDX_CTX          , m_contextModels + m_numContextModels, m_numContextModels)
	, m_cTransformSkipSCModel     ( 1,             2,               NUM_TRANSFORMSKIP_FLAG_CTX    , m_contextModels + m_numContextModels, m_numContextModels)
	, m_CUTransquantBypassFlagSCModel( 1,          1,               NUM_CU_TRANSQUANT_BYPASS_FLAG_CTX, m_contextModels + m_numContextModels, m_numContextModels)
{
	assert( m_numContextModels <= MAX_NUM_CTX_MOD );
}

可以看到TEncSbac的构造函数调用的都是ContextModel3DBuffer的构造函数,ContextModel3DBuffer的构造函数定义如下:

ContextModel3DBuffer::ContextModel3DBuffer( UInt uiSizeZ, UInt uiSizeY, UInt uiSizeX, ContextModel *basePtr, Int &count )
	: m_sizeX  ( uiSizeX )
	, m_sizeXY ( uiSizeX * uiSizeY )
	, m_sizeXYZ( uiSizeX * uiSizeY * uiSizeZ )
{
	// allocate 3D buffer
	m_contextModel = basePtr;		//  m_contextModel由basePtr赋值,即指向指定的context的内存区
	count += m_sizeXYZ;				// count记录的是到目前为止所有context的尺寸
}

结合ContextModel3DBuffer和TEncSbac的构造函数可以看到,实际的上下文数据都存放在ContextModel中(或者ContextModel类型的指针指向的内存中),ContextModel3DBuffer只是一个便于访问的接口类。

上下文模型内容初始化的函数ContextModel3DBuffer::initBuffer定义如下:

Void ContextModel3DBuffer::initBuffer( SliceType sliceType, Int qp, UChar* ctxModel )
{
	ctxModel += sliceType * m_sizeXYZ;   // 根据当前slice的类型(I,P,B)选择对应的context,为什么这么做,下面会解释
	// 根据sliceType计算initType并将context指针移动到正确的位置上,这个initType用于索引context model,且由slice_type来决定

	for ( Int n = 0; n < m_sizeXYZ; n++ )
	{
		m_contextModel[ n ].init( qp, ctxModel[ n ] );		// 完成context的各个状态变量的初始化工作
		m_contextModel[ n ].setBinsCoded( 0 );
	}
}
Void ContextModel::init( Int qp, Int initValue )
{
    // 选取中间值
	qp = Clip3(0, 51, qp);

	// 具体的意思可能需要看一些文档,我现在还没弄清
	Int  slope      = (initValue>>4)*5 - 45;			// m
	Int  offset     = ((initValue&15)<<3)-16;		// n
	Int  initState  =  min( max( 1, ( ( ( slope * qp ) >> 4 ) + offset ) ), 126 );		// preCtxState
	UInt mpState    = (initState >= 64 );				// MPS
	m_ucState       = ( (mpState? (initState - 64):(63 - initState)) <<1) + mpState;
}
时间: 2024-10-12 20:20:42

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

HM编码器代码阅读(21)——熵编码的概念以及在HEVC中应用

熵编码把一系列用于表示视频序列的元素符号转变为一个用来传输或存储的压缩码流. 信息的多少用信息量来度量,显然,信息量与不确定性的消除程度有关,消除的不确定性越大,信息量就越大.不确定性的大小与事件发生的概率相关,因此不确定性可以度量,更进一步信息量也可以度量. 假设某一个信源(就是产生信息的地方)的概率空间是: X(表示信源产生的符号的集合),P(x)表示符号产生的概率的集合. 那么,某一个信源符号Xi的信息量就定义为:I(Xi)=log(1/P(Xi)). 那么这个信源的信息熵(即这个信源的包

HM编码器代码阅读(18)——变换以及量化(一)

入口函数:encodeResAndCalcRdInterCU. 这个函数的作用是根据预测值,求出残差,然后进行TU的划分,然后进行变换.量化等操作以及RD代价的计算. 流程: (1)如果是帧内预测,那么直接返回 (2)判断是否使用skip模式,如果使用了: 1)对所有的子分割设置skip标志 2)清理残差 3)把预测的CU直接设置为重建的CU 4)计算率失真 5)加载SBAC熵编码器,并重置比特数 6)如果使用了跳过变换量化的标志(TransquantBypassEnableFlag),那么就对

HM编码器代码阅读(14)——帧间预测之二predInterSearch(inter模式)

predInterSearch主要的工作是ME(运动估计)和MC(运动补偿). 函数中有一个bTestNormalMC变量,它表示是否进行正常的MC过程,正常的MC过程就是进行ME再进行MC. 正常的MC流程是,遍历所有的参考帧,进行ME(运动估计:xEstimateMvPredAMVP和xMotionEstimation),然后记录AVP或者MV的信息,进行MC(运动补偿,目的是选出最优的参数),然后更新最优的参数,遍历完所有的参考帧之后,就选出了最优的参数了:然后循环结束,接着进行正式的MC

代码阅读问题

---恢复内容开始--- 下面列举阅读代码过程中遇到的问题和相应的资料查询: 1.namespace的用途:http://www.kuqin.com/language/20080107/3532.html 2.enum 的用途:http://pcedu.pconline.com.cn/empolder/gj/c/0502/562347.html 3.SFML:http://www.sfml-dev.org/ 4.双冒号的用法:http://blog.csdn.net/zimingjushi/ar

NRE代码阅读记录

本来是为了论证自己的观点,把安全标签打在RunningConfig里,就写了个代码分析,结果写着写着发现的确不应该是在RunningVM里.意外的发现看代码的时候这么写写还是挺不错的,也避免了看了后面的忘记前面的.这种底层的代码实在是很难理解,对我来说就像是小学生去算高数一样,也只能硬着头皮去看了. vmmng.cc对应的就是如下界面(回头放图上来,ubuntu下没有什么截图工具,总不能把整个屏幕放上来)然后"3"键可以新建tiny-core虚拟机,对应到代码里,也就是input_th

Mangos代码阅读

Mangos代码阅读 2010-12-14 15:51:07|  分类: mangos研究|举报|字号 订阅 逻辑层: 类World实现了wow的World,所有的逻辑处理 MaNGOS 下载,编译,配置和运行的基本步骤 下载和安装msysgit,用于代码管理我使用的是Git-1.6.5.1-preview20091022.exe  下载和安装tortoisegit,用于代码管理我使用的是TortoiseGit-1.3.2.0-32bit.msi  使用git://github.com/mang

Xv6代码阅读报告之进程调度

Xv6代码阅读报告-Topic3 @肖剑楠 20111013223 Xv6代码阅读报告-Topic3 1. 序 2. 上下文切换 2.1 defs.h 2.2 swtch.S 3. 进程调度 4. 管道 5. 进程调度流程 6. Pipe实现概述 7. 阅读心得 1. 序 Xv6为了实现CPU多进程化需要解决一系列问题.1. 如何在进程间切换?2. 如何让这一切换变得透明?3. 需要锁机制来避免竞争.4. 内存.资源的自动释放. Xv6通过实现上下文切换(Context Switching),时

MediaInfo代码阅读

? MediaInfo是一个用来分析媒体文件的开源工具. 支持的文件非常全面,基本上支持所有的媒体文件. 最近是在做HEVC开发,所以比较关注MediaInfo中关于HEVC的分析与处理. 从MeidaInfo的官网上下载下来的代码比较庞大,工程比较多,但是代码阅读的一个关键在于,先要抓住主干,然后再不断的深入.先找到自己关注的地方,然后分析,之后再进行分析一些相关的代码. 此处下载的是mediainfo 0.7.72版本. 从下图可以看出,mediaInfo中包括了诸多的工程. ? 其中,Me

Spring源码阅读:Spring WebApplicationContext初始化与消亡

使用SpringMVC时,需要不论是使用注解配置,还是使用XML配置Bean,他们都会在Web服务器启动后就初始化.根据J2ee的知识可以知道,肯定是使用了ServletContextListener才完成的这个功能.那Spring又是如何实现的呢?还有我们在Web.xml配置的那些applicationContext.xml相关的XML文件的位置(配置方式多样),又是如何读取到相应的文件的呢,读取到这些文件后,是如何初始化类的呢?我们能不能自定义初始化过程或者自定义WebApplication