一、CTU
HEVC中引入了树形编码单元(Coding Tree Unit),即一帧图像可以划分为若干个互不重叠的CTU,如下图所示。
CTU的宽度和高度以一个序列参数集表示,这意味着视频序列中的所有CTU都具有相同的大小:64×64、32×32或16×16。
每个CTU由同一位置处的一个亮度CTB和两个色度CTB再加上相应的语法元素组成,尺寸由编码器指定,且可大于宏块尺寸,如下图所示。
对于一个LxL的CTU,包括一个LxL的亮度CTB和两个L/2 x L/2的色度CTB,L的值可以等于16、32或64,由SPS中指定的编码语法元素确定。
二、CTB
在高分辨率视频编码中,使用较大的CTB可以获得更好的压缩性能。一个CTB可以直接作为一个编码块CB,也可以进一步通过四叉树形式划分为多个小的CB,如下图所示。
CB的大小是可变的,亮度CB最大为64x64,最小为8x8。大CB可以提高平滑区域的编码效率,小CB可以很好的处理图像局部细节,使复杂图像的预测更加准确。
三、CU
一个亮度CB和相应的两个色度CB及对应的语法元素组成一个编码单元CU。CTU到采用基于四叉树循环分层结构进行划分,一个CTU可能只包含一个CU(没有进行划分),也可能被划分为多个CU。
四、PU和PB
CB对于预测类型决策来说已经足够好了,但它仍然可能太大,无法存储运动矢量(帧间预测)或帧内预测模式。因此,进行预测时,可以将CB进一步划分为PB,划分方式由预测方式决定。如下图所示,Skip是帧间预测的一种。
PU由亮度PB和相应的两个色度PB和相应的语法元素共同构成,预测单元PU规定了编码单元的所有预测模式,包含了一切于预测相关的信息,如帧内预测方向、帧间预测的分割方式、运动矢量预测,以及帧间预测参考图像索引号等。PU是进行预测的基本单元。
对于帧内PU来说,仅8x8 PU存在SIZE_NxN模式,即仅8x8PU有可能进行四叉树划分,其余PU均不会进一步划分。
五、TU和TB
预测结束后,我们需要用对残差(预测图像和实际图像之间的差异)进行变换。同样,CB对于这个可能太大了,因为CB可能包含一个详细的部分(高频)和一个平坦的部分(低频)。因此,每个CB可以不同地划分为TBs(转换块)。
TU由亮度TB和两个色度TB及相应的语法元素组成,TU是进行变换和量化的基本单元。
PU和TU的关系:由于PU和TU都是直接由CU划分得到,因此二者大小没有确定的关系,一个PU可以包含多个包含多个TU,一个TU可以跨越多个PU,但是二者大小都必须小于CU。对于帧内编码,由于相邻PU之间存在依赖关系,即当前PU进行预测时候需要参考相邻已经编码的PU,因此一个PU可以包含多个TU,但是一个TU最多只能对应一个PU。
在帧内编码时,进行预测的基本单位是TU,在帧内RDO时,会对TU进行四叉树划分决策,决定TU是否进一步划分。
六、slice
一幅图像可以被划分为一个或多个片或称为条带(Slice),每个片的数据编码都是独立的。
如下图,一幅图像被划分为N个Slice,Slice成条带形。在编码时,每一个Slice中的CTU按光栅扫描顺序进行编码。
Slice头信息无法通过前一个Slice的头信息推断得到,这就要求Slice不能跨过它的边界来进行帧内或帧间预测,但环路滤波器可以跨越Slice进行滤波。使用Slice的主要目的是当数据丢失后能再次保证解码同步。
根据编码类型,Slice可以分为:
(1)I Slice:该Slice中所有CU的编码过程都使用帧内预测。
(2)P Slice:在I Slice的基础上,该Slice中的CU还可以使用帧间预测,每个预测块(PB)使用至多一个运动补偿预测信息。P Slice只使用图像参考列表list0。
(3)B Slice:在P Slice的基础上,B Slice中的CU也可以使用帧间预测,但是每个PB可以使用至多两个运动补偿预测信息。B Slice可以使用图像参考列表list 0和list 1。
一个独立的Slice可以进一步划分为若干个条带片段Slice segment(SS),包括一个独立SS和若干个依赖SS。
如图Slice以独立SS作为开始,一个SS包含整数个CTU(至少一个)。预测过程不可以跨越Slice边界,但是可以跨越依赖SS边界,一个Slice中的SS之间可以相互参考。
七、Tiles
在HEVC中一幅图像可以划分为若干个Tile(这是相比AVC的优化改进),即从从水平和垂直方向将图像分割为若干个矩形区域,把这些矩形区域称为Tile。通常每个Tile包含的CTU数据近似相等。
每个Tile包含整数个CTU,其可以独立编码,在编码时,每一个Tile包含的CTU按照扫描顺序进行编码。划分Tile的主要目的是增强并行处理能力而不引入新的错误扩散。
一幅图像可以被划分为若干个Slice,也可以划分为若干个Tile,两者划分的目的都是为了进行独立编码。某些Slice中可以包含多个Tile,同样某些Tile中也可以包含多个Slice。Tile包含的CTU个数和Slice中的CTU个数互不影响。