虽然熵解码的过程并不是很复杂,但是因为涉及太多的文档和函数比较让人心烦,所以稍微进行一下整理
熵解码一般一开始就是需要对上下文模式进行一定得初始化
在HEVC中
因为是类结构,所以在声明对象的时候,基本就完成了一般的初始化工作,下面详细介绍一下:
在类TDecSbac当中包含所有的上下文模式,但是在HM中有两个对应的结构
ContextModel m_contextModels[MAX_NUM_CTX_MOD]; //<一共512个 元素
Int m_numContextModels;
ContextModel3DBuffer m_cCUSplitFlagSCModel;
ContextModel3DBuffer m_cCUSkipFlagSCModel;
ContextModel3DBuffer m_cCUMergeFlagExtSCModel;
ContextModel3DBuffer m_cCUMergeIdxExtSCModel;
ContextModel3DBuffer m_cCUPartSizeSCModel;
ContextModel3DBuffer m_cCUPredModeSCModel;
ContextModel3DBuffer m_cCUIntraPredSCModel;
ContextModel m_contextModels[MAX_NUM_CTX_MOD]; HEVC一共有512个上下文模式
然后m_numContextModels 这个类成员变量用于记录每一个语法元素有多少的上下文模式
ContextModel3DBuffer类型对应的是每一个语法元素的上下文模式
m_numContextModels中比较重要的两个变量
UChar m_ucState; //<当前slice中对应的状态 state
UInt m_binsCoded; //<当前对应的bin的数量,具体还不是很清楚,后续继续解释
ContextModel3DBuffer
ContextModel* m_contextModel; ///< array of context models
const UInt m_sizeX; ///< X size of 3D buffer
const UInt m_sizeXY; ///< X times Y size of 3D buffer
const UInt m_sizeXYZ; ///< total size of 3D buffer
一共有512个上下文模式,在每一个3D模式中,ContextModel指向512中的模式,三个Size变量是对应在一个语法元素中模式有多少,
再通过具体偏移量得到对应的ContextModel
初始化:
在创建对象的时候就进行初始化
<span style="color:#ff0000;">ContextModel3DBuffer::ContextModel3DBuffer</span>( UInt uiSizeZ, UInt uiSizeY, UInt uiSizeX, ContextModel *basePtr, Int &count )
: m_sizeX ( uiSizeX )
, m_sizeXY ( uiSizeX * uiSizeY )
, m_sizeXYZ( uiSizeX * uiSizeY * ui