天天看点

【HEVC学习与研究】29、解码第一个Coding Quadtree结构(1)

在开始研究这部分代码之前,重新回顾一下理论部分。

众所周知,H.264及其之前的编码标准中,VCL层的核心结构称作“宏块”(MacroBlock, MB),大小为16×16像素。一个宏块里面包含着一个16×16分辨率的亮度采样矩阵和两个8×8分辨率的色度采样矩阵。相应的,在HEVC中,编码所采用的块结构为树形编码单元(Coding Tree Unit, CTU),每个CTU的大小由编码器决定,并且通常要大于宏块的16×16大小。比CTU更小的单位称为树形编码块(Coding

Tree Block, CTB),一个CTU由一个亮度信号CTB及其相应的色度CTB,以及其他一些语法元素构成。一个正方形的亮度CTB的边长(以像素为单位)可能取16、32或者64个像素,CTB越大则压缩效率越高。HEVC标准支持将一个CTB按照四叉树的方法分割为多个更小的块结构。

采用了四叉树分割的方法后,这个树结构保存了亮度和色度编码单元(Coding Unit, CU)的位置和大小。这个四叉树结构的根与当前的这个CTU对应,也就是说,一个亮度CU最大可能的大小就是亮度CTB的大小。通常,一个CU的组成包括一个亮度编码块(Coding Block, CB),一个色度CB以及其他相应的语法元素。一个CTB可能包含一个CU,也可能被分割成多个CU,每一个CU进一步分割成预测单元(Prediction

Unit, PU)和树结构的变换单元(Transform Unit, TU)。

判断采用帧内预测还是帧间预测在CU层完成。PU的分割结构就以CU为根,根据基本的预测模式判定,亮度和色度CB被进一步分割,由亮度和色度预测块(Prediction Block, PB)中获取预测值。每一个PB的大小可能由64×64到4×4不等。预测的残差信号由TU进行编码。同PU类似,TU树形结构的根节点也是CU,一个亮度CB的残差信号可能由一个完整的变换块(Transform Block,

TB)表示,也可能树形分割成多个子TB。对4×4、8×8、16×16和32×32的正方形TB块,HEVC依然采用整数变换;当TB大小为4×4,且采用帧内编码的残差信号则采用了一种类离散正弦变换的方法。

标准文档的7.3.8.4节给出了Coding quadtree的语法结构:

【HEVC学习与研究】29、解码第一个Coding Quadtree结构(1)

该结构中的第一个语法元素split_cu_flag[x0][y0]表明这个Coding quadtree是否继续四等分,下标x0和y0表示当前拟作为cu的像素块左上角像素相对于该帧左上角的坐标。从该结构的定义来看,Coding

quadtree采用了递归的结构,只要split_cu_flag[x0][y0]为1,则这个Coding quadtree就会继续分割下去,直到split_cu_flag[x0][y0]为0时,这个Coding

quadtree进一步处理为一个coding unit。

回到代码中。实现解析Coding

quadtree的函数由Void TDecCu::xDecodeCU( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth, UInt& ruiIsLast)实现:

TDecEntropy::decodeSplitFlag   ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )函数调用m_pcEntropyDecoderIf->parseSplitFlag( pcCU, uiAbsPartIdx, uiDepth )来解析split_cu_flag[x0][y0]的值。在这个过程中,由于规定了最大的CUDepth为4,所以只进行了4次分割便返回。其后,将处理coding

block数据。

继续阅读