转自:https://zhuanlan.zhihu.com/p/108792210
本文将分为四个部分对下一代视频编码标准Versatile Video Coding(VVC)的变化模块进行介绍。第一部分简单介绍一下视频编码的发展历程以及VVC的编码框架;第二部分重点介绍VVC变换相比于以往的视频编码标准(HEVC、AVC)所新增加的一些特性;第三部分介绍了国内外对VVC变换硬件设计的研究现状;第四部分总结了我们当前的研究思路。
- 背景介绍
图1. 视频编码标准发展历程
上图展示了视频编码国际标准的发展历程,我们可以看到目前主要以VVC、AV1和AVS3为主流发展趋势。人们对高分辨率视频(4K、8K)的需求越来越大,因此需要更加高效的视频压缩标准来提升压缩效率降低带宽压力。按照下图所示的压缩率提升规律,编码效率每提升50%以上就会成为新一代标准,如早前的H.261、HAV1等,其性能基本持平所以我们将其称为第一代。而像AVS和H.264等比前一代提升50%就可称其为第二代,至于AVS2、H.265等相对于第二代的提升达到50%我们就将其称为第三代。现在我们正在探索的AVS3/VVC/H.266则会成为最新一代的压缩标准。
图2. 各代视频编码标准的压缩性能提升
和之前的标准类似,VVC采用基于块结构的混合编码框架,融合了帧内和帧间预测、变化编码和熵编码等模块。如下图:
图3. 视频编码框架
那么VVC有什么特别之处呢?我将VVC所引入的新技术以及其带来的性能提升整理成下表,我们可以看到蓝色与红色高亮的技术所带来的性能提升非常显著,但毫无疑问,这也带来了巨大的计算复杂度,从编码时间的增加上就可以看出。
表1. VVC关键技术
2. VVC变换的新特性
这一节我们重点来介绍VVC变换所增加的新特性,其可以概括为三个方面:1)更灵活的变换尺寸;2)舍弃高频变换系数;3)多变换核选择(Multiple Transform Selection, MTS)。首先,我们先简单介绍一下变换原理。
对于2D变换,都可以拆分为行方向和列方向上的1D变换。所有变换类型的1D变换计算公式如下:
其中X是表示一帧图像的输入行向量(1×N),TN是N×N整数变换矩阵,Y是经过变换计算所获得的输出列向量(N×1)。那么我们可以知道变换的实质就是矩阵计算。
2.1 更灵活的变换尺寸
由于Multiple Type Tree(MTT)的引入,VVC支持四叉树+二叉树+三叉树划分(如图4),导致变换不仅支持正方形的尺寸(MxM)还支持长方形尺寸(MxN,M≠N)。除此之外,VVC还支持在行列方向上采用不同的变换类型。
图4. 灵活的块划分方式
2.2 舍弃高频变换系数
在VVC的官方测试软件VTM中,允许变换的最大尺寸为64x64。对于长或宽等于64的大尺寸变换块,直接舍弃高频变换系数,仅保留低频变换系数。例如,对于长x宽为MxN的块,若M等于64,则只保留左边的32列,若N等于64,则只保留上方的32行。如果当前为变换跳过模式,则保留所有变换系数。
2.3 多变换核选择(MTS)
除了HEVC中的DCT-II变换,VVC引进了两种新的变换方式DST-VII 和DCT-VIII,帧内帧间编码块从这三种变换方式中进行选择。下表为三种变换方式的基函数。
表2. 变换基函数
为了控制MTS的复杂度,分别在帧内和帧间的SPS level对是否使用MTS进行标记,若SPS level标记表示可以使用MTS,则每个CU也有一个Flag标记当前CU是否使用MTS。MTS在CU级别的flag只有在满足以下两种情况时才会存在:
1)长和宽都小于等于32; 2)CBF Flag等于1;
这里值得注意的是,MTS仅仅适用于亮度分量。具体可参考链接:https://blog.csdn.net/baidu_28446365/article/details/90174414
3. 国内外研究现状
每一代视频编码标准的出现,都会促进其软件加速和硬件优化方面的研究。在残差编码、率失真优化(RDO)过程中,变换都是高频使用、计算量大的一个模块。目前,国内外有很多学者针对变换操作,提出了一些area-efficient、low-power的硬件架构。在过去几年里,大量的工作都是围绕HEVC的DCT-II展开的,而这些工作的核心都离不开Chen等人所提出的矩阵分解算法,这是一种迭代的分解方式,就是将DCT-II变换矩阵分解成两部分(偶部分AN/2和奇部分RN/2),AN/2可以按照上述继续分解,如下式所示。通过这种方式可以有效地降低计算复杂度,化大为小。
由于VVC是一个正在发展、不断完善的新标准,目前针对VVC变换的相关研究很少。并且,由于变换尺寸和类型的差异,之前关于HEVC变换的相关工作无法直接应用于VVC变换。有少量研究是针对JEM(HEVC向VVC过渡的版本)做的,JEM变换包含五种可供选择的变换核,除VVC的三种外,增加了DCT-V和DST-I。
A. Kammoun等人【3】【4】面向五种变换核,使用无乘法器的多常量乘法(Multiplierless Multiple Constant Multiplication,MCM)为每一种变换核都设计了相应的1D 4-point和8-point计算单元,并且统计了所使用的加法器和移位操作数,发现硬件资源消耗有效降低。下图是他们给出的1D 8-point变换实现的整体框架。
图5. 1D 8-point AMT实现【4】
A. C. Mert等人【5】首次实现了5种变换核的2D变换,并且可以根据输入信号(TR_Type_Vertical、TR_Type_Horizontal)选择变换类型进而对相应数据通路进行重构。这种可重构的架构大大减少了area,是一种高性能架构,美中不足的是变换尺寸仅支持4×4和8×8。
图6. 2D可重构架构【5】
随后A. Kammoun等人【6】为五种变换核提出了一个统一的2D变换架构,可支持最大变换尺寸为32×32,采用折叠型框架并且设计了流水线,图8给出了4×4块变换的流水线处理时序图。该实现以大量的硬件资源消耗为代价来换取设计的统一完整性。
图7. 2D AMT实现【6】
图8. 4×4块流水线处理时序图【6】
4. 研究思路
在做变换模块的硬件设计时,如何减少硬件代价、降低能耗是研究的一个重点。我们的研究主要从以下几个方面开展:
1)降低计算单元的硬件复杂度。对于1D变换(实质就是矩阵乘法),我们需要设计核心计算单元(乘法块),而有效地减少计算单元的硬件资源消耗才能降低整个2D实现的area。我们发现MCM仅通过加法和移位操作就能完成乘法块的设计。而移位操作的硬件消耗很少,通过rewire就可以实现,那么如何减少加法器的数目就是研究之重。我们采用了RAG-n算法——一种有效减少加法器数目的算法来进行我们核心计算单元的设计。
2)支持长方形变换尺寸(M×N,M≠N)的中间数据存储。我们知道,2D变换过程可以分解为先行变换再列变换,那行变换得到的中间结果存至转置存储器,再由列变换读取数据进行计算最终完成2D变换。高效的数据存储模式可以大大提高计算效率,减少不必要的数据读取时间。我们针对了长方形变换块设计了对角线式的数据存储模式,使流水线设计成为可能。
3)支持混合块尺寸的流水线设计。我们知道变换块尺寸有大有小,形状各异,那么在混合的块尺寸输入下,如何使整个设计流水线化?我们通过下面这张图来说明。以(a)为例,当我们完成16×16块的行变换,并将数据存至转置存储器(Transpose Memory, TM)后,我们开始从TM中读数据并同时进行下一个块(32×32)的行变换,当我们完成了前一个块的列读取后,当前的32×32块并没有完成行变换,因此还不能读取列数据,需要等待(A timing gap)。而我们的设计以经过高频系数舍弃所支持的最大变换尺寸32×32为范围,进行流水化,当完成32×32块范围(可以由很多不同的子块组成)内的所有行变换再开启列变换,如(c)所示。
(a)Case 1: A timing gap.
(b)Case 2: A reading data collision.
(c)The timing chronogram of proposed pipelined architecture (different colors mean that these TUs belong to different 32×32 block ranges). 图9. 混合块尺寸的流水线化
4)寻找不同变换类型的共性。我们发现DST-VII和DCT-VIII之间有着非常奇妙的关系,与DST-VII变换矩阵(3)相比,DCT-VIII(4)的每一行都和它有着相同的系数,只是顺序相反,并且在第偶数行符号相反。这样的话,我们仅需反转输入顺序并分配合适的输出符号,便可以在不增加计算复杂度的基础上轻松在DST-VII架构中实现DCT-VIII变换。
如果想了解更多,欢迎阅读我们的论文:
来源:oschina
链接:https://my.oschina.net/u/4409432/blog/4428287