在码流中,split_cu_flag 用来控制 CU 是否划分为 4 个 sub-CU ;part_mode 用来控制 CU 是否划分为 4 个 PU;split_tu_flag 用来控制 CU 是否划分为 4 个 TU。
每个 CU 可以划分为一个或多个 PU ,每个 PU 独立持有一个预测模式 (prediction mode)。 PU 的划分不是递归的,一个 CU 要么不划分,要么划分为4个PU,而这些PU不能再划分为多个PU。
对于 8x8 的 CU ,可选两种 PU 划分方式 (part_mode
):
PART_2Nx2N
:不划分,CU本身就是一个PU。PART_NxN
:划分为4个PU。
而 64x64, 32x32 和 16x16 的 CU 只能选择 PART_2Nx2N
,也即只能自身作为一个 PU。即只需要对 8x8 的 CU 编码 part_mode
语法元素。
对于 CU ,在码流中编码一个语法元素 part_mode
来指示它的 PU 划分方式:
part_mode=PART_2Nx2N
时,说明 CU 自身就是一个 PU ,此时码流中的part_mode
后面应该紧跟着1个预测模式 (也即该 PU 的预测模式),然后编码 PU 的其它数据。part_mode=PART_NxN
时,说明 CU 被划分为 4 个 PU ,此时码流中的part_mode
位后面应该紧跟4个预测模式 (也即这4个PU 的预测模式) ,然后先后编码 4 个 PU 的其它数据。
每个 CU 可以按四叉树递归的方式划分为多个 TU 。TU 的尺寸可以是 32x32, 16x16, 8x8, 4x4 。
在帧内编码中,TU 不能大于 PU (不能跨越 PU 的边界),因此 TU 的划分只存在以下几种情况 :
- 对于 64x64 的 CU ,它必须划分为 4 个 32x32 的 TU (因为 TU 的最大尺寸为 32x32) 。当然,这些 TU 也可以继续递归划分。划分出的所有小 TU 都共享同一个预测模式,也即这个 64x64 CU 所对应的 64x64 PU 的预测模式。
- 对于 32x32, 16x16 的 CU 或 TU , 它可以不划分 (自身就是一个 TU),也可以继续划分为更小的 TU 。当然,这些 TU 也可以继续递归划分。划分出的所有小 TU 都共享同一个预测模式,也即它们所在的 32x32 CU 或 16x16 CU 所对应的 PU 的预测模式。
- 对于一个 8x8 CU,若它没有划分为 4 个 4x4 的 PU (
part_mode=PART_2Nx2N
), 则它可以不划分 (自身就是一个 8x8 的 TU),也可以继续划分为 4 个 4x4 的 TU ,此时 4 个 TU 共享同一个预测模式,也即它们所在的 8x8 CU 所对应的 8x8 PU 的预测模式。图8中最下面的例子就对应了这种情况。 - 对于一个 8x8 CU,若它被划分为 4 个 4x4 的 PU (
part_mode=PART_NxN
) ,则它也必须划分为 4 个 4x4 的 TU ,每个 TU 的预测模式就是他所在的 4x4 PU 的预测模式。
CU 中划分 TU 的最大深度是可以设定的,由 HEVC 码流头部的 SPS 中的 max_transform_hierarchy_depth_intra
语法元素决定。例如,当 max_transform_hierarchy_depth_intra=0
时,表示任何CU都不能划分为更小的TU。再例如,当 max_transform_hierarchy_depth_intra=1
时,表示任何CU最多只能划分成4个TU,而这些 TU 不能再划分为更小的 TU 。
需要在码流中编码一个 split_tu_flag
来决定这个 TU 是否要继续划分为 4 个 sub-TU 。split_tu_flag=1
代表划分;split_tu_flag=0
代表不划分。
在没有歧义的地方不需要编码split_tu_flag
,包括以下4种情况:
- 对于 64x64 的 CU ,不需要编码
split_tu_flag
,因为它一定要划分为 4 个 32x32 TU。 - 对于 4x4 的 TU ,不需要编码
split_tu_flag
,因为它一定不能再划分为更小的 TU。 - 对于被划分为 4 个 4x4 PU 的 8x8 CU ,不需要编码
split_tu_flag
,因为它一定要划分为 4 个 4x4 TU 。 - 当受限于
max_transform_hierarchy_depth_intra
的取值,也即当前 TU 在 CU 中的深度等于设定的最大深度时,不需要编码split_tu_flag
,因为它一定不能再划分为更小的 TU。
HEVC 规定在某些情况时,需要先对边界像素进行平滑滤波,然后再进行预测。对于 U, V 分量块,在任何情况下都不用滤波。而对于 Y 分量块,需要查询表来确定是否需要进行滤波。
对于需要滤波的情况,有两种滤波方式:常规滤波和强滤波。码流头部的 SPS 中的 strong_intra_smoothing_enable_flag
语法元素规定了是否开启强滤波,只有在开启时并满足一定条件时,才使用强滤波。
常规滤波的方法是:把 (4×N+1) 个边界像素“放平”成一个 (4×N+1) 个元素的数组。对于相邻的3个元素,使用3抽头的 FIR 滤波器进行滤波,抽头参数为 [0.25, 0.5, 0.25] 。对于最左下边和最右上边的像素,因为它们两边缺少像素,无法进行滤波,所以不用滤波,直接复制。
标签:预测,PU,代码,TU,滤波,划分,mode,CU From: https://www.cnblogs.com/jhzj/p/17770369.html