上一篇中主要介绍了编码中的原理,这里主要是结合HM中的代码介绍读残差系数的方法
HM变换系数熵解码简介:
初始一个TU对象
成员变量介绍:
public:
typedef enum TU_SPLIT_MODE { DONT_SPLIT=0, VERTICAL_SPLIT=1, QUAD_SPLIT=2, NUMBER_OF_SPLIT_MODES=3 } SPLIT_MODE; //<TU在递归过程中的三种劈分方式
static const UInt NUMBER_OF_SECTIONS[NUMBER_OF_SPLIT_MODES];
protected:
ChromaFormat mChromaFormat;
Bool mbProcessLastOfLevel; // if true, then if size n/2 x n/2 is invalid, the nxn block for a channel is processed only for the last block, not the first.
UInt mCuDepth; //<CU是TU的根节点,记录CU深度
UInt mTrDepthRelCU[MAX_NUM_COMPONENT]; //<记录TU相对于CU的深度
UInt mSection;//<如果进行劈分,那么劈分后处理SubCU的index
TU_SPLIT_MODE mSplitMode;//< the split mode
TComRectangle mRect[MAX_NUM_COMPONENT]; //<当前TU的位置信息 Bool mCodeAll[MAX_NUM_COMPONENT];
UInt mOrigWidth[MAX_NUM_COMPONENT];
UInt mOffsets[MAX_NUM_COMPONENT];//<cur TU 与 CU左上角的偏移量,比如TU 为8*8,那么处理第二个TU则偏移64个bit
UInt mAbsPartIdxCU;//<the abs index of CU in LCU
UInt mAbsPartIdxTURelCU;//<the abs index of TU in cur CU
UInt mAbsPartIdxStep;//<if split, the added index
TComDataCU *mpcCU;
UInt mLog2TrLumaSize;//< relative to the size of Cur TU
TComTU *mpParent; //<如果劈分进行递归,对应父节点
下面是解码的这个外围的流程图
其中涉及到两个比较重要得函数:
pareseCBF 和 parseCoeffNxN,前一个函数比较简单,后面将重点分析一下第二个函数
因为涉及好多的表格,这里不好编辑,我就直接把截图放上来
文档下载链接
http://download.csdn.net/detail/xietingcandice/8329321