VVC的编码结构
同HEVC类似,VVC的编码结构从大到小,分别是 Slice、Tile、Brick、CTU和CU,但是CU的尺寸从128到4,因此VVC并不区分TU、PU和CU的概念。
VVC支持两类Slice,分别是 raster-scan slice mode 和 rectangular slice mode,分别如图所示(粗实线划分的灰色区域是一个Slice,细实线划分的矩形是一个Tile,虚线表示一个Brick)
其中只有raster-scan slice 可能不是矩形,Tile和Brick也不一定都是正方形。
VVC 块划分准则
多类型树(Multi-type tree,MTT),包括 二叉树(binary tree,BT)和 三叉树(ternary tree,TT)和四叉树(QT)。
一个CTU首先按四叉树方式进行一次划分(128→64),四叉树的每个叶子节点可以进一步按照多类型树方式进行划分,有4种多类型树划分方式水平二叉树划分(SPLIT_BT_HOR),垂直二叉树划分(SPLIT_BT_VER),水平三叉树划分(SPLIT_TT_HOR),垂直三叉树划分(SPLIT_TT_VER)。
三叉树划分是按照1:2:1的比例划分的
在VTM5中支持亮度和色度块使用不同的划分结构。目前,对于P和B slice,同一个CTU的亮度和色度CTB划分结构相同,对于I slice同一个CTU的亮度和色度CTB可以按不同的结构进行划分。
但是,因为考虑到色度信号的亚采样,色度信号在单独划分时禁止出现2×2、2×4和4×2的尺寸。
VVC针对边界处CU划分的处理
当一个块超过图像的右边界或下边界时,该块会被强制进行进一步划分直到所有CU都在图像内部。下面是VTM5内的划分规则:
-
如果一个块的一部分超过了下边界或者右边界,但是因为块尺寸的限制,不能进行任何三叉树、二叉树和四叉树划分,此时进行四叉树划分
-
如果一个块既超出了下边界也超出了右边界
- 如果该块是一个四叉树节点且尺寸大于最小四叉树节点尺寸,则该块被强制进行四叉树划分
- 否则该块被强制进行SPLIT_BT_HOR模式划分
-
如果一个块只超出了下边界
- 如果该块是一个四叉树节点且尺寸大于最小四叉树节点尺寸,且该块尺寸大于最大的二叉树节点尺寸,该块被强制进行四叉树划分
- 如果该块是一个四叉树节点且尺寸大于最小四叉树节点尺寸,且该块尺寸小于等于最大的二叉树节点尺寸,该块被强制进行四叉树划分或SPLIT_BT_HOR模式划分
- 否则(该块是一个二叉树节点或尺寸小于等于最小四叉树节点尺寸),该块被强制进行SPLIT_BT_HOR模式划分
-
如果一个块只超出了右边界
- 如果该块是一个四叉树节点且尺寸大于最小四叉树节点尺寸,且该块尺寸大于最大的二叉树节点尺寸,该块被强制进行四叉树划分
- 如果该块是一个四叉树节点且尺寸大于最小四叉树节点尺寸,且该块尺寸小于等于最大的二叉树节点尺寸,该块被强制进行四叉树划分或SPLIT_BT_VER模式划分
- 否则(该块是一个二叉树节点或尺寸小于等于最小四叉树节点尺寸),该块被强制进行SPLIT_BT_VER模式划分
总结:1)判断该块是否是四叉树节点很重要,决定了是否要尝试QT划分,如果不是QT节点,后续都进行MTT划分,2)四叉树节点存在最小尺寸,二叉树节点存在最大尺寸 3)边界情况不涉及TT划分 4)边界处的CTU有可能划分深度大于MaxMttDepth(在SPS参数层定义,默认等于3)
VVC针对CU冗余划分的限制
VVC禁止在三叉树划分的中间部分进行同方向的二叉树划分,因为这和在该方向进行两次连续的二叉树划分效果相同。
VVC从硬件效率的角度对CU Size的限制
VPDU(Virtual Pipeline data units)是图像中不重叠的单元,在硬件解码器中,连续的VPDU要同时被多阶段流水线并行处理,而只有当VPDU size和buffer size的尺寸相同的时候,硬件效率最高。
在大部分硬件解码器中VPDUsize被设置为最大的TB size (64)。但是VVC内三叉树(TT)和二叉树(BT)划分模式可能导致VPDU size变大。
为了使VDPU size保持在64x64亮度块的大小,VTM5做了如下限制:
- 如果CU的宽或高等于128,则不进行TT划分
- 对于128xN的CU,N<=164,不进行水平BT划分
- 对于Nx128的CU,N<=164,不进行垂直BT划分
以上都是不允许的划分模式。总结一下,只要宽或高大于128,就不能使用TT划分;如果是128×128的CTU经过BT划分后,则不能在同方向再使用BT划分。
总结一下,只要宽或高大于128,就不能使用TT划分;如果是128×128的CTU经过BT划分后,则不能在同方向再使用BT划分。
相关语法元素
VVC通过四个划分标识控制划分类型,分别是split_cu_flag
(是否划分)、split_qt_flag
(是否划分成四叉树)、mtt_split_cu_binary_flag
(是否是二叉树划分)和mtt_split_cu_vertical_flag
(是否是竖直MTT划分),后两者共同决定了MTT划分类型,如下表所示
mtt_split_cu_binary_flag | mtt_split_cu_vertical_flag | |
---|---|---|
水平三叉树划分 | 0 | 0 |
水平二叉树划分 | 0 | 1 |
竖直三叉树划分 | 1 | 0 |
数值二叉树划分 | 1 | 1 |
在SPS参数集中,对CU的MTT划分进行了限制,包括QT划分的最小允许尺寸、MTT划分的最大允许尺寸、从QT Leaf Node开始的MTT划分最大深度MaxMttDepth
。