ICIP2020:VVC实时解码器实现

本文来自论文《 A LIVEFOR THEVIDEO (VVC) CODEC》
引言
VVC参考软件VTM实现了VVC编码器和解码器 , 它的主要焦点是新技术的实验和一些粗略的复杂性分析 。并且作为一个参考实现它的目标主要是正确性、完整性和可读性 , 不考虑用于商业和消费系统 。基于这些原因VTM并没有很好的优化 , 仅实现了一些基本的SIMD算法 , 并且在解码端不支持任何并行操作 。VTM解码复杂度是HM的两倍 。本文提出针对VVC解码器的优化方法 。
VVC复杂度
上图Fig.1是VVC解码器的概要图 。码流首先通过CABAC熵解码器 , 解析出块划分信息、预测信息和残差数据 。然后是反量化(iQ) , 接着是二次和初次反变换(iST , iT) 。然后重建残差数据和预测数据相加 , 然后经过一系列环路滤波操作包括iLMCS , DBLF , SAO和ALF 。复杂度增加来自新技术加入和预测技术复杂度增加(帧内、帧间) 。
实验配置
本文实验都是在笔记本电脑上进行的 , 使用8核Intel处理器 , 32G RAM和1TB SSD存储 , 操作系统是.04 , 编译器是GCC7 。
测试序列包括5个高清序列(Class B)和6个超高清序列(Class A1和A2) , 在RA配置下10比特编码 , QP包括29 , 31 , 33 , 35 , 37 , 39 , 41 , 编码器为VTM5.2 。使用Intel VTune软件分析结果 。
加速结果通过节省的时钟时间计算 , 

ICIP2020:VVC实时解码器实现

文章插图
TS=100%*(T_ref - ) / T_ref
使用SIMD加速像素操作
SIMD(data)允许同时在多条数据上执行单条指令 。现在的x86处理器可以在128位宽(SSE42)、256位宽(AVX2)、512位宽()上实现SIMD指令 。本文SIMD操作是在SSE42和AVX2上实现(并没有获得CPU大范围支持) 。
上图Fig.2是实现部分特殊工具获得的加速 。可以看见实现SIMD并没有加速运动解析()和运动信息生成(Mi-Der) , 这是因为它们本质是串行过程不依赖于像素操作 , 而是逻辑元数据处理(像CU等) 。类似的 , LMCS也没有提升太多 , 这是因为LMCS通过查找表实现像素映射 , SIMD实现起来并不高效 。去方块滤波(DBLF)加速也非常少 , 这是因为本文实现的DBLF的大部分时间都用在参数生成上而不是实际的像素操作(加速很高) 。
解码过程中的运动补偿、帧间预测工具、反变换、SAO和ALF加速比较高 。但是加速还是比一些state-of-art的方法小 , 这是因为统计中不仅包括像素操作 , 也包括可以与特定处理阶段相关联的第一个函数调用的时间 , 还包含与该阶段相关联的一些准备逻辑 。
在SSE42上帧间预测阶段节省了大约70%的时间 。对于实际的运动补偿插值滤波(IF) , 通过启用AVX2 , 可以节省超过30%的剩余时间 。仿射预测是基于4 x 4样本块预测 , 难以有效地优化 , 但可以采用与非仿射预测相似的因子来加速 。为了克服这个 , 设计了一个4x4的6抽头和4抽头IF滤波器 。优化的实现不会将中间结果保存在内存中 , 而是直接对每个读取像素使用水平和垂直过滤 。类似的方法开发了16x16的8抽头(亮度)和8x8的4抽头(色度)滤波器用来减少中间结果的缓存 。DMVR操作会将大块划分为16x16的子块 , 这使得特定的块大小(16x16)对于优化的解码器至关重要 。对于DMVR块尺寸 , 由于SIMD寄存器大小越大 , 可用空间就越大 , 所以只提供AVX2非缓冲实现 。