本文继续讨论编码器的初始化过程,即draft 9.3.1.1。
上一篇介绍的是各个context对应到标准相应表格的值,以及相关变量和函数,前面提到initBuffer函数对context进行初始化,但是没有深入解析这个函数的实现,这就是本文的主要任务。
首先介绍下面讨论过程中会涉及到的一个类ContextModel3DBuffer,重点关注该类的构造函数:
/// context model 3D buffer class
class ContextModel3DBuffer
{
protected:
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
public:
ContextModel3DBuffer ( UInt uiSizeZ, UInt uiSizeY, UInt uiSizeX, ContextModel *basePtr, Int &count ); //!< 构造函数
~ContextModel3DBuffer () {}
... ...
... ...
// initialization & copy functions
Void initBuffer( SliceType eSliceType, Int iQp, UChar* ctxModel ); ///< initialize 3D buffer by slice type & QP
... ...
};
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的尺寸
}
下面再看类TEncSbac的构造函数,因为实际熵编码就是该类定义的一个对象来完成的,重点关注该类的私有数据成员是如何初始化的:
TEncSbac::TEncSbac()
// new structure here
: m_pcBitIf ( NULL )
, m_pcSlice ( NULL )
, m_pcBinIf ( NULL )
, m_uiCoeffCost ( 0 )
, m_numContextModels ( 0 ) //!< context model的计数值,接下来的所有除了ass