HEVC之tiles、slice、slice segment、CU、PU、TU分析

(一)

(1)   编码树单元(CTU)和编码树块(CTB)结构:

在之前的标准中,编码层的核心是宏块,一个宏块包含一个16×16的亮度块,以及对于常用的4:2:0采样格式来说还包含两个8×8的色度块;而在HEVC中类似的结构为编码树单元(CTU),其尺寸由编码器进行指定且可以比传统的宏块大。一个CTU包含一个亮度CTB和两个对应的色度CTB及句法元素。一个L×L的亮度CTBL可以设置为16,32或者64。一般来说,L越大,可以获得越好的压缩性能。HEVC支持使用树结构和类四叉树的标志来将CTB划分成更小的块。

(2)   编码单元(CU)和编码块(CB):

CTU的四叉树句法指定了它所属的亮度和色度CB的尺寸和位置。四叉树的根与CTU相关联。因此,亮度CB的最大尺寸为其所属的亮度CTB的尺寸。对于一个CTU来说,其亮度CB和色度CB的划分标志都是使用的同一个。一个亮度CB通常和两个色度CB及它们相关的句法共同组成一个编码单元(CU)。一个CTB可能只包含一个CU,也可能被划分成多个CU,每个CU包含着与之相关联的预测单元(PU)和变换单元(TU)。

(3)   预测单元(PU)和预测块(PB):

决定一个图像区域是以帧间还是帧内方式进行预测是在CU层进行的。一个PU划分结构的根在CU层。根据基本的预测类型,亮度CB和色度CB可以继续进行划分并利用其它的亮度PB和色度PB进行预测。HEVC支持多种PB尺寸,最大为64×64到最小4×4

(4)   变换单元(TU)和变换块(TB):

预测残差以块变换的方式进行编码。一个变换单元树结构的根在CU层。亮度CB残差的尺寸可能与亮度变换块TB的尺寸相等,也可能会被划分成更小的亮度TB。色度CB的情况也是一样的。定义了与离散余弦变换(DCT)类似的整数变换的基本函数提供给尺寸为4×48×816×1632×32TB。对于尺寸为4×4且残差由帧内预测得到的TB来说,一种以离散正弦变换(DST)为基础的整数变换可供采用。

(二)!!!

HEVC中的图像的分块分割方法

1、条带与区块

在HEVC的视频编解码过程中,一帧图像会被分割成条带(slice),条带片段(slice segment)和区块(tiles)进行处理。条带和区块都是可采取的独立分割形式之一。而条带则是由条带片段组成的元素,包括独立条带元素和依赖性条带元素两类。



上图即为一帧图像分割成条带的示意图。在该图中,该帧图像被分割成两个条带,其中第一个条带包含一个独立条带片段(包含4个树形编码单元CTU)和两个依赖条带片段;第二个条带包含一个独立条带片段。

区块是另一种区域分割方法,某个区块必须为矩形,由整数个CTU组成。对于条带和区块,或者所有同一个条带的CTU均属于一个区块(tiles),或者同属于一个区块的CTU均属于一个条带;类似的,或者同属于一个条带片段的CTU需属于一个区块,或者同属于一个区块的CTU必须属于同一个条带片段。下图是某一帧分割成左右两个区块的示例图,分别表示整帧图像仅包含一个条带以及每个区块分别包含多个条带的情况。



2、块与四叉树结构

树形编码块(Coding Tree Blocks, CTBs)是一帧中像素组织的基本结构。亮度CTB的边长、色度CTB的长和宽分别由参数CtbSizeY、CtbWidthC和CtbHeightC指定。对于每个CTB,都有一个块分割标识,用来表示预测和变换编码块的大小。分割从根(CTB)开始,进行四叉树分割,直至到达叶子节点(CB)。而CB又是预测树(Prediction tree)和变换树(Transform tree)的根节点,这两个树分别表示预测块和变换块的位置大小。

像素块和相应语法元素的封装格式可能有如下情况:

(1)三个预测块(亮度和色度)或者单一一个预测块(单色图像或separate_colour_plane_flag为1,也就是三个分量当做三个独立图像分别编码),与相应的语法结构组成一个预测单元Prediction unit(PU);

(2)一个或三个变换快(情况与以上类似),与相应的语法结构组成一个变换单元Transform unit(TU);

(3)一个或三个编码块CB,与相应的语法元素组成为一个编码单元coding unit(CU);

(4)一个或三个树形编码与相应的语法元素组成一个树形编码单元coding tree unit(CTU)

 (三)HEVC的条带头解析 

一个条带由整数个coding tree units组成的编码视频流的结构,包含一个非依赖性条带元素和0到多个依赖性条带元素。若当前某个条带元素属于非依赖性条带元素,或者是按照解码顺序在 当前的依赖性条带元素之前的第一个非依赖性条带元素的slice element header被称作当前条带的条带头。另一方面, 条带元素头中的数据应用于该条带元素中的第一个或者所有的coding tree units

以下是我们的实例中,一些参数的取值情况和意义
first_slice_sement_in_pic_flag: 当前为1,表示当前的slice element为该帧内按照解码顺序的第一个slice element;
no_output_of_prior_pic_flag: 决定是否输出非首帧IDR或BLA之后的图像数据;
slice_pic_parameter_set_id : 指定该slice参考的PPS的id值,取值范围为[0,63];当前值取0;
slice_type : 指定slice的类型,可能取值为0,1,2,分别表示B,P,I条带,当前为2,表示slice的编码类型为I;
slice_sao_luma_flag : 此处取1,表示对当前slice中的亮度分量启用SAO;
slice_sao_chroma_flag : 此处取1,表示对当前slice中的色度分量启用SAO;
slice_qp_delta : 决定了该slice中CB的初始量化参数,QP可能被coding unit层的参数修改;此处该参数为6,因此CB的初始QP为SliceQPY = 26+init_qpminus26+slice_qp_delta=26+0+6=32;
slice_loop_filter_across_slices_enabled_flag : 此处取1,表示环路滤波器可以跨越slice边界进行操作;否则只能在slice内部操作;

你可能感兴趣的:(技巧)