2020年VVC视频编码进入标准化最后阶段,有望在年底正式成为国际标准。
文 / Christian Feldmann
译 / 元宝
原文 https://bitmovin.com/compression-standards-vvc-2020/
2020年是属于VVC的一年,至少是在标准化的最后阶段。在最近一次布鲁塞尔会议举行之后,VVC委员会的草案获得了通过。因此,VVC有望在2020年底最终成为国际标准。这也意味着标准化过程正在慢慢地接近尾声,标准草案没有添加任何新的主要特性。然而,标准化是一个持续进行的过程,包括对文本的清理和错误修复、对现有工具的简化以及高级语法的完成。
那么,VVC到底有什么新特性呢?对于视频编码来说,这是一次真正的革命吗?简而言之:不是的。虽然它在技术上非常先进,但它也只是HEVC的一个进化产物。它仍然使用基于块的混合视频编码方法,这是自H.261 (1988年起)以来所有主要视频编码标准的基础概念。在这个概念中,视频的每一帧都被分割成块,然后按顺序依次去处理所有块。
在解码器端,解码器会在一次循环中处理每一个块,循环从码流的熵解码开始。然后对解码后的变换系数进行反量化和反变换运算。输出是像素域中的误差信号,然后进入编码循环,并添加到预测信号中。有两种预测类型:帧间预测和帧内预测。帧间预测是从先前编码的图像中复制块(运动补偿),而帧内预测只使用解码图像中的已解码的像素信息。加法器的输出是经过一些过滤器的重构块。这通常包括一个过滤器,用来删除发生在块边界上的块伪像,但也可以使用更高级的过滤器。最后,该块被保存到一个图片缓冲区中,以便在解码完成后可以将其输出到屏幕上,并且循环可以继续处理下一个块。
在编码器端,情况稍微复杂一些,因为编码器必须执行相应的正向操作,以及来自解码器的反向操作才能获得相同的信息以进行预测。
混合视频解码器的通用架构图
虽然VVC也使用了这些基本概念,但所有的组件都已经用新思想和新技术做了改进或修改。在这篇博文中,我将展示VVC引进的一些改进。然而,这只是VVC中新工具的一小部分,所有细节和工具的完整列表可以轻松地填满整本书(有人可能已经开始在写这本书了)。
VVC编码结构
切片图块和子图片
如上所述,视频中的每一帧都被分割成一个规则的网格块。在VVC中,这些所谓的编码树单元(Coding Tree Units, CTU)的大小从HEVC中的64×64增加到128×128像素。多个块可以被排列成逻辑区域。这些被定义为tile、slice和Subpictures。虽然这些技术在早期的编解码器中就已经广为人知,但是它们的组合方式是全新的。
图片被分割成四个大小相等的小块(蓝色)。有四片(绿色)。左边的这个包含两个小块。在右上角,小块被分成两部分。CTUs用灰色标记。
这些区域的关键特性在于它们在码流中从逻辑上是分开的,并支持各种用例:
- 由于每个区域是独立的,因此编码器和解码器都可以实现并行处理。
- 解码器可以选择只对它需要的视频区域进行部分解码。一个可能的应用是传输360个视频,用户只能看到完整视频的一部分。
- 码流可以被设计成允许在不重新编码的情况下动态提取视频流的裁剪部分。(JVET-Q2002)
块分区
让我们回到128×128的CTU块。正如前面所述,每个块都要经过编码循环。然而,只处理128×128像素的块,效率是非常低的,因此每个CTU被灵活地拆分成更小的子块,而且有关如何进行分割的信息会被编码到码流中。编码器可以根据块的内容选择CTU的最佳分区。在一个相对平坦的区域,块越大,效率越高。而在有边缘或更多细节的区域,通常选择较小的块。VVC中的划分是使用两个后续的层次树来完成的:
- 四元树:每个区块有两种选择。不再是把它分成四个正方形的子块,每个子块的宽度和高度各占一半。而是对每个子块以递归方式再次做出相同的决策。如果有一个块没有被进一步分割,则应用后三个块。
- 多类型树:在第二棵树中,每个区块都有多个选项。它可以使用单一的垂直或水平拆分将其分成两半。或者,它可以被垂直或水平分割成三个部分(三元拆分)。对于第一个树,这个也是递归的,每个子块可以再次使用相同的四个选项进行分割。这棵树上的没有进一步分割的叶子节点,它们被称为编码单元(CUs),他们在编码循环中会进行处理。
每个块被分成两个阶段。首先使用层次二叉树(左),然后使用层次三元树(右)。
将VVC与其他视频编解码器区别开来的一个因素是,CTU可以被分割成许多块,其大小和形状都具有很高的灵活性。这样,编码器可以灵活地适应各种视频特性,从而提高编码性能。当然,这种高度的灵活性是有代价的。编码器必须考虑所有可能的分割选择,这需要更多的计算时间。(JVET-Q2002)
区块预测
帧内预测
在帧内预测中,它是根据当前图像中已经解码的部分来预测当前块。更精确地说,只将离邻域一个像素宽的条带用于正常的帧内预测。关于如何从这些参考像素中来预测一个块有多种模式。VVC中常见的模式有平面模式、直流模式和角度模式。在VVC中,角度的离散方向数由33个增加到65个,与HEVC相比变化不大。所以,让我们来关注一下真正的新工具:
- 广角帧内预测:由于VVC中的预测块可以是非正方形的,因此某些方向预测的角度会发生偏移,从而可以使用更多的参考像素进行预测。这有效地将方向预测角扩展到正常的45°以上和-135°以下的值。(JVET-P0111)
- 跨色彩分量预测:在许多情况下(例如,当块中有一条边时),luma和chroma组件携带信息是非常相似的。在交叉分量预测中,利用重构像素与两个参数(一个因子和一个偏移量)的线性组合,直接从重构的luma块中预测色度分量。如有必要,还可以执行块的缩放。(JVET-Q2002)
多参考线预测:如前所述,之前通常是仅使用一行相邻的像素进行帧内预测。在VVC中,这个限制稍微放宽了一些,这样就可以从不直接靠近当前块的两条线进行预测。但是,这有几个限制,因为一次只能使用一条线路,并且不允许跨越CTU边界进行预测。这些限制对于高效的硬件实现是必要的。(JVET-L0283)
在传统的帧内预测中,只有一行(第0行)用于预测当前块。在多参考线预测中,这一约束被放宽,行1或行3也可以用于预测。
当然,这个列表并不完整,还有更多的帧内预测方案可以进一步提高编码效率。对模型的模内预测和编码方法也进行了改进和完善。
帧间预测
在帧间预测方面,VVC对HEVC的基本工具进行了继承和调整。例如,一幅或两幅参考图片的单向和双向运动补偿的基本概念基本不变。然而,以前在视频编码标准中还没有像这样使用过下面一些新的工具:
双向光流(BDOF):如果预测块使用双向预测,其中一个参考在过去的时间内,另一个参考在未来的时间内,BDOF可以用来细化预测块的运动场。为此,将预测块划分为4×4像素的网格子块。对于这4×4块中的每一块,利用两个参考值来计算光流用来细化运动矢量。虽然这增加了光流计算的解码器的复杂度,但精细的运动向量场不需要传输,从而降低了码率。(JVET-J0024)
解码器端运动矢量细化:另一种允许在解码器上自动细化运动矢量而无需传输额外的运动数据的方法是在解码器端执行实际的运动搜索。虽然这一基本思想已经存在了一段时间,但在解码器端进行搜索的复杂性一直被认为过高,直到现在,这个过程分为三个步骤:
- 首先进行正常的双向预测,将两个预测信号加权到初步的预测块中。
- 使用这个初始块,在每个参考帧中搜索原始块的位置。然而,这不是编码器执行的完整搜索,而是一个具有固定位置数量的非常有限的搜索。
- 如果找到了更好的位置,原始的运动矢量也会相应更新。最后,再次使用更新后的运动矢量进行双向预测,以获得最终的预测结果。(JVET-J1029)
几何分区:在有关块分区的这一节中,会介绍如何将每个CTU分割成更小的块。所有这些分割操作都只是将矩形块分割成更小的矩形块。不幸的是,自然视频内容通常包含更多的弯曲边缘,这些弯曲的边缘只能用矩形块来近似。在这种情况下,几何分区允许将一个块非水平分割为两个部分。对这两部分分别使用独立的运动矢量进行运动补偿,并在边缘采用混合的方法将两个预测信号合并在一起。
一些使用几何分区的例子
在当前的实现中,有82种不同的几何分区模式。它们由分区线的24个斜率和4个偏移值组成。然而,确切的模式数目仍在讨论中,并且可能仍会改变。[JVET-P0884, JVET-P0085]
仿射运动:传统的单运动矢量运动补偿只能表示二维平面运动。这意味着任何块只能在图像平面上的x和y方向上移动。然而,在一个自然的视频中,严格的平面运动是非常罕见的,物体往往会更自由地移动(如旋转和缩放)。VVC实现了一个仿射运动模型,该模型使用两个或三个运动矢量来支持一个块具有四或六个自由度的运动。为了保持较低的实现复杂度,参考块没有以像素为单位进行变换,而是采用了一种重用现有运动补偿和插值方法的方法。将预测块分割成4×4像素块的网格。从两个(或三个)控制点运动矢量中,每个4×4像素块计算一个运动矢量。然后,对这4×4块进行常规的二维平面运动补偿。虽然这个实现不是一个真正的仿射运动补偿,但它是一个很好的近似,并允许有效的实现在硬件和软件中。(JVET-O0070)
对于每4×4个子块,从控制点运动矢量(蓝色)中计算出单个运动矢量(绿色)。 然后按4×4块进行常规运动补偿。
变换和量化
转码阶段也经历了一些重大的重构。现在,通过对每个方向分别执行变换,可以在变换阶段支持由三元拆分引入的矩形块。最大变换块大小也增加到64×64像素。当涉及到高清和超高清内容时,这些更大的变换尺寸特别有用。此外,还添加了另外两种类型的变换。虽然变体2 (DCT- ii)中的离散余弦变换已经从HEVC中得到了很好的理解,但是此外还增加了一个DCT变体(DCT- viii),以及一个离散正弦变换(DST-VII)。根据预测模式,编码器可以根据哪一个工作得最好来选择不同的变换方式。
量化阶段最大的变化是最大量化参数(QP)从51增加到了63。这是很有必要的,因为人们发现,即使在尽可能高的QP设置下,VVC的编码工具也能高效地工作,因此不可能将某些编码的码率和质量降低到所需的水平。
另一个更有趣的新工具叫做相关量化。量化阶段的目的是将连续变换的输出值映射到可以编码的码流的离散值中。这种操作本身就伴随着信息的丢失。量化越大(QP值越高),丢失的信息越多。在下面的图中,显示了一个简单的量化方案,其中每对线之间的所有值都量化为标记的蓝色叉号的值。只有蓝色叉号的索引才会被编码到码流中,然后解码器才能重建相应的值。
基本的量化。每条垂直线都标志着一个决策阈值。将两个阈值之间的所有值量化为一个重构值。重构值用蓝色叉号标记。
通常,在视频编解码器中,只使用一种固定的量化方案。但在相关量化中,它里面有两个量化方案是用略微偏移的重构值定义的。
在嵌入式量化中,使用两组重构值。解码器根据先前解码的值在这些值之间自动切换。
在两个量化器之间的切换是通过使用微型状态机隐式进行的,该状态机使用的是已编码系数的奇偶校验。编码器可以通过故意改变一些重构值在量化器之间切换。可以使用码率失真权衡来找到这个开关的最佳位置,在这个位置引入的误差最小,并且开关提供了最大的增益。在某种程度上,这与标志数据隐藏(在HEVC中使用)有关,其中信息也“隐藏”在其他数据中。(JVET-K0070)
其他
目前讨论的所有工具都是针对传统的二维视频编码进行构建和优化的。然而,其名称中的“通用的”一词表明VVC适用于各种各样的应用程序。实际上,VVC包含了一些可以用于更具体任务的一些特性,这些特性使得它非常通用。以前的编解码器通常将这些专用工具放入单独的标准或单独的扩展中。其中一种工具是水平环绕运动补偿。传播360内容的一种普遍方法是使用等矩形投影将360视频映射到二维平面上。然后可以使用传统的2D视频编码方法对2D视频进行编码。然而,视频有一些特殊的属性是可以被编码器使用的。一个属性是在视频中没有左边框或右边框。由于360视角的环绕,因此这可以用于运动补偿。因此,当从左外边界进行运动补偿时,预测将环绕并使用图像右侧的像素值。
从问题左侧以外的位置进行的预测也将环绕并使用图片右侧的像素。
虽然这个工具增加了压缩性能,但由于普通的视频编解码器往往会在2D视频的左右两边缝合在一起的直线上产生可见的边缘,因此它也有助于提高视觉质量。(JVET-L0231)
视频编码的另一个应用是对计算机生成的视频内容(也称为屏幕内容)进行编码。这种类型的内容通常具有一些特殊的特征,如非常尖锐的边缘和非常均匀的区域,这对于自然视频内容来说是非典型的。在这种情况下一个非常强大的工具是帧块内复制,它可以从同一帧的已解码区域执行复制操作。这与运动补偿非常相似,但关键的区别在于,所表示的向量并不是指时间运动,而是指向当前帧中用于复制操作的源区域。(JVET-J0042)
编码性能
在每次标准化会议上,VVC测试模型软件(VTM)都会更新,并会运行一个测试,将VTM的最新版本与HEVC参考软件(HM)进行比较。这个测试是纯粹的客观使用PSNR值和Bjøntegaard增量来比较的。在测试多种不同的配置时,我们将重点放在了所谓的随机访问配置,这是与视频传输和流媒体最相关的配置。
VTM 7.0与HM 16.20的BD速率比较。[Q0003]
就BD速率性能而言,VTM在得到差不多的PSNR值时,同时也能将所需带宽降低约35%。虽然编码时间并不是衡量复杂性的完美标准,但它可以提供一个良好的初始指示。编码器端的VVC复杂度大约增加了10倍,而解码器的复杂度只增加了1.7倍。请注意,这些结果都是基于PSNR的结果。众所周知,PSNR值与实际主观感知质量的耦合不是很好,一些初步的实验表明,主观结果似乎比降低35%的码率要高。正式的主观测试计划在今年晚些时候进行。
结论
那么在了解了所有这些技术细节之后,VVC的未来会是怎样的呢?从技术上讲,VVC是用钱能买到的最高效、最先进的编码标准。然而,目前还不清楚这到底要花多少钱。一旦标准化过程在2020年10月正式完成,就可以开始为新标准建立许可条款。在以前的标准中,我们了解到这是一个复杂的过程,可能需要一段时间。与此同时,还有其他一些高效的编解码器,它们的应用程序和实现正在日趋成熟和不断发展。
来源:oschina
链接:https://my.oschina.net/u/3521704/blog/3186568