VVC 之块划分
跟 HEVC 相比,VVC 把 CTU 大小增加到了 128 × 128 128 \times 128 128×128,并且除了四叉树(QT)之外采用了 二叉树(BT)划分以及三叉树(TT)划分。
QT 加 MTT
上图是 QT 和 BT、TT 的示意图。对于 BT、TT,⼀般想法是除了 QT 之外,额外进行 BT、TT 以便提供更多的 CU 划分选择,可以更好地捕捉内容特性。但是,这样会导致额外的头信息(side information)数量大大增加。只对 QT 节点进行 BT、TT 划分则可以在快速捕捉局部内容特征的同时使用较少的比特数来表示头信息。另外,实验表明,如果进一步允许在 BT、TT 节点处递归 QT,则编码效率改善小且复杂性增加巨大。
因此,根据上述情况,每个 CTU 先进行递归的 QT 划分,然后对每个 QT 节点进行递归的多类型树(MTT)划分。当进行 MTT 划分时,只做 QT、BT 的划分,不做 QT。
与 HEVC 不同,VVC 中取消了 PU 和 TU 的概念,将 CU 、PU 和 TU 统一。这简化了编码结构以及减少了 PU 和 TU 的信令开销。
Virtual Pipeline Data Unit
Virtual Pipeline Data Unit 是图像中不重叠的
M
×
M
M \times M
M×M 亮度/
N
×
N
N \times N
N×N 色度单元。如上所示,在硬件视频解码器中,连续 VPDU 由多个流水线级同时处理,不同的流水线级同时处理不同的 VPDU 。在大多数流水线阶段,VPDU 大小大致与缓冲区大小需求成正比,因此保持其较小是至关重要的。
在 HEVC 中,VPDU 大小设置为 TU 允许的最大大小
32
×
32
32 \times 32
32×32。而 VVC 则是
64
×
64
64 \times 64
64×64。为此,必须满足以下 2 个条件:
- 对于每一个包含一个或多个 CU 的 64 × 64 64 \times 64 64×64 VPDU,所有 CU 必须完全包含在这个 VPDU 内。
- 对于每一个包含一个或多个
64
×
64
64 \times 64
64×64 VPDU 的 CU,所有 VPDU 必须完全包含在这个 CU 内。
因此,为了遵守上述原则,VVC 规定: - 禁止对任何宽度或高度大于 64 的亮度编码树节点应用 TT 划分。
- 禁止将 VBT 划分应用于 64 × 128 64 \times 128 64×128 的亮度编码树节点。
- 禁止将 HBT 划分应用于
128
×
64
128 \times 64
128×64 的亮度编码树节点。
即禁止下图的划分方式:
有了这些约束,可以显著节省硬件解码器的成本。与此同时,分别在 AI、RA、LDB 下造成了 0.00%, 0.15%, 0.06% 的BD-rate性能损失。
CTU Dual Tree
对于 HEVC 而言,亮度和色度的划分方式相同。而对于 VVC 而言,只有 P 和 B slice 的相同。I slice 的亮度、色度划分方式可以不同。如上图所示,亮度的纹理大多比色度更细节,这导致亮度中的小 CU 数量比色度中更多。因此,在 I slice 中对亮度和色度分量使用单独的编码树是合理的。
图像边界处理
在 HEVC 中,每个包含当前图像外的样本的编码树节点都被强制使用QT分割,而完全位于当前图像外的 CU 则不被编码。这种方案可能会导致沿图像边界出现小的 CU 行或列,导致部分 CTU 的编码效率较低。而 VVC 根据编码树与一些条件选择进行 QT 或者 BT 的划分方式。
VTM中的编码算法和加速方法
从编码树的根节点开始递归调用函数 xCompressCU()
,并访问所有其他的编码树节点。在 xCompressCU()
中:
- 不划分2. 按顺序进行 HBT,VBT,HTT,VTT 和 QT 划分,分别调用 2, 2, 3, 3 和 4 次的
xCompressCU()
编码树节点的最佳划分模式通过在上述方式中寻找最小 RD 代价来更新。其中,一些划分模式可能会被跳过。在上述编码流程的基础上,为了缩短编码时间,在VTM中采用了六种编码器加速方法。这些加速方法总结如下: - 最小 QT 深度和最大 QT 深度由左侧、左下、上方、右上位置的相邻 CU 的 QT 深度推导而来。如果推导出的最小 QT 深度减 m m m 大于当前节点的 QT 深度,则强制执行 QT 拆分(即跳过当前节点的 HBT、VBT、HTT、VTT 划分)。这里,如果推导出的最小 QT 深度大于 0, m = 1 m=1 m=1,否则, m = 0 m = 0 m=0。如果推导的最大 QT 深度加 n 小于或等于当前节点的 QT 深度,则禁止 QT 划分。这里,如果推导的最大 QT 深度小于允许的最大 QT 深度,则 n = 1 n = 1 n=1,否则, n = 0 n = 0 n=0。
- 如果当前节点已经测试过 HBT 划分,并且该节点的最佳划分模式为不划分且残差为零,则跳过 HTT 划分。同样,如果当前节点已经测试过 VBT 划分,并且该节点的最佳划分模式为不划分且残差为零,则跳过 VTT 划分。
- 如果当前 slice 是非 intra 或允许 intra block copy,并且,对于父(parent)节点和 grandparent 节点,skip 模式是不划分中的最佳模式,则跳过 HBT、VBT、QT 划分。
- 如果 a)HBT 和 VBT 划分已经进行过了,该节点的最佳划分模式不会导致较大的 BT 深度; b)当前节点所表示的 CU 大小不超过亮度 64 × 64 64 \times 64 64×64。则跳过当前节点的 QT 划分。
- 如果符合以下条件,则在测试当前节点的不划分模式后,立即测试 QT 划分:
- 以下两个条件至少有一个是满足: 在当前节点的左侧或上方至少有一个 CU 具有大于当前节点的 QT 深度;
当前节点表示的 CU 亮度宽度大于等于 S,其中,QP 层索引为 0 / 1 / 2 0/1/2 0/1/2 时 S = 32 / 64 / 128 S = 32/64/128 S=32/64/128; - 允许对当前节点进行 QT 划分。
HBT、VBT、HTT、VTT 划分在以下情况下跳过:- QT 划分在测试当前节点的不划分模式后立即进行测试; - 对于当前节点来说,最好的划分模式是 QT 划分。
- 以下两个条件至少有一个是满足: 在当前节点的左侧或上方至少有一个 CU 具有大于当前节点的 QT 深度;
- 在测试不同的划分模式时,可能对同一个 CU 进行多次测试。因此,为了减少计算复杂度,可以按照如下方式复用以前获得的一些编码结果。如果之前测试过当前节点,则可以有条件地应用以下两个规则。a)始终测试相同的划分模式,等于当前节点的最佳划分模式。b)如果先前测试的当前节点的最佳划分模式是不划分,则跳过 HBT、VBT、HTT、VTT、QT 拆分;否则,跳过不划分模式。
reference
[1] Huang Y W, An J, Huang H, et al. Block partitioning structure in the VVC standard[J]. IEEE Transactions on Circuits and Systems for Video Technology, 2021, 31(10): 3818-3833.