H.265中的Block Partition Structure

2021年2月8日 / 28次阅读 / Last Modified 2021年2月8日
图像处理

本文尝试总结H.265(HEVC)涉及到的Block Partition Structure技术,并与H.264(AVC)进行对比。

H.265相比它的“前任”,最显著的变化,恐怕就是放弃了MB(macro block)这个概念,提出了新的CTU(Coding Tree Unit)。在CTU,CU,CTB,CB,PU,TU等一些列新名词的基础上,画面block的划分方式更灵活更一致,也能够更加适应更大分辨率的画面。

回顾H.264的MB技术

  • MB的大小固定为16x16,这个尺寸在4K画面(3840x2160)下,一个MB只占到整个画面的0.003%:
>>> f'{(16*16)/(3840*2160):.6f}'
'0.000031'

这个占比就太小了,不能够很好的把握高分辨率画面中的空间相关性,进而带来编码效率的下降。

  • 在H.264中,MB是确定prediction mode 的最小单位,当一个MB确定了执行的预测模式后,其划分方式也就确定了,如下:

这个图总结的很清楚,如果MB确定做inter prediction,其划分方式就是上图前两行,注意只有8x8x4这个划分,才能够继续划分到4x4这个层面。上图第3行是intra prediction的划分方式。最后一行是transform block的划分方式,如何split与prediction mode有依赖关系。这种划分存在问题是:(1)划分方式不一致,如何划分与如何预测绑定,在代码处理层面会影响性能;(2)transform与prediction相关,当使用inter的时候,只有在至少有一个block小于8x8时,才能够使用4x4的transform block;当使用intra的时候,the size of transform should be equal to the block size except 16x16,当使用intra 16x16的时候,又不一样,先用4x4的transform处理整个16x16的区域,然后再使用Hadamard transform,对4x4的DC values做再次处理。(代码处理这部分的时候,只能使用if...else...来区分不同的case,没有一致性,也影响效率)

H.265的Block Partition

先搞清楚概念:

CTU,Coding Tree Unit,这个概念对应原MB概念,但是有3种尺寸可以在encode的时候选择,64x64,32x32,16x16。CTU的尺寸不是自适应的,而是encoder的一个选择!一定确定下来,就不变了。(A slice contains an integer multiple of CTU, which is an analogous term to the macroblock in AVC. Inside a slice, a raster scan method is used for processing the CTU.)

对CTU的划分,采用quadtree的方式进行,划分的最大深度,maximum depth,从1到4。depth=1时,等于不划分,整个CTU成为了一个CU,作为一个整体处理。maximum depth也是encoder的一个选择!注意,CTU到CU层面的划分,都是正方形块的划分。如下图:

CTU通过quadtree的方式,划分成CU,划分基于区域画面的性质。这种划分同时对多个颜色通道进行,因此CTU和CU,对应的都是多个通道的数据,或者说对应的3D数据。CTB和CB对应的就是单通道的2D数据。(XXU对应多通道数据,XXB对应单通道数据,还有PB和TB)

从上图还可以看出,对CTU的划分是一致的,代码的递归处理,清晰自然。

对CTU尺寸和maximum depth的选择,给encoder提供了很大的灵活性,可以针对不同视频内容的性质,来做相应的选择。比如以静止画面为主的大分辨率视频,可以选择64x64的CTU,depth选择2,这样最小CU为32x32;如果画面有较多细节,可以将depth定为4,这样最小CU就是8x8。对于小分辨率视频,CTU可以选择16x16,此时CTU与MB大小一样,depth设置为2,能够得到8x8的CU。(CU还要继续划分PU)

CU是确定使用inter或intra的最小单元!PU的划分,从CU开始:

CU分成3种类型:(1)skipped CU;(2)inter coded CU;(3)intra coded CU。(A skipped CU is a special form of inter coded CU where both the motion vector difference and the residual energy are equal to zero)

如上图,对于intra coded CU,有2种划分方式;对于inter coded CU,有8种划分方式,PU只能划分一次!

下面是一些特殊情况:

  • 大部分情况下,chroma block shares the same splitting of luma prediction,当CU为8x8并且使用了NxN的PU划分方式时,chroma block采用2Nx2N的方式,以防止chroma PB的size小于4x4;
  • HEVC disallows the use of PART_NxN except when the CU size is equal to the minimum CU size. It was observed that this design choice can reduce the encoding complexity significantly while the coding efficiency loss is marginal.
  • Moreover, asymmetric shapes for inter coded CU are only allowed when the CU size is not equal to the minimum CU size.

最后来看看TU,同样,从CU开始,划分TU。

与PU只能分一次不同的是,TU的划分,是一个nested quadtree,叫做RQT,Residual Quadtree。

貌似HEVC的标准文案种,已经没有了NSRQT(Non Square RQT)这一类TU的划分。参考CTU的quadtree划分,也都是squared!

Transform Across Boundary:只在inter coded CU种存在这种情况,比如TU与CU一样大,不管PU如何split,transform together!(prediction is always coupled with the TU splitting for intra coded CU,如何理解?)

The case when the maximum depth of transform tree is equal to 1 is denoted as implicit TU splitting since there is no need to transmit any information on whether the TU is split. In this case, the transform size is automatically adjusted to be fit inside the PU rather than allowing transform across the boundary. (与transform相关的技术点,为什么都难以理解......)

-- EOF --

本文链接:https://www.pynote.net/archives/3457

留言区

您的电子邮箱地址不会被公开。 必填项已用*标注


前一篇:
后一篇:

More


©Copyright 麦新杰 Since 2019 Python笔记

go to top