首页 > 知识百科

浅析英特尔QSV技术在FFmpeg中的具体实现与使用

admin 知识百科 2023-05-16 00:50:18

本文来自英特尔高级软件工程师张华在LiveVideoStackCon 2018预热分享,由LiveVideoStack整理。在分享中,张华介绍了英特尔GPU的硬件架构,并详细分析了英特尔QSV技术在FFmpeg中的实现和使用。

1、处理器整体架构

众所周知,英特尔的图形处理GPU被称为“芯显卡”,与CPU集成在一起,封装在同一个芯片上。上图是芯片的内部结构。

1.1发展

Intel从lvy Bridge架构开始尝试将GPU和CPU集成在中央处理芯片中,一代一代发展到Skylake架构。在早期的Ivy Bridge架构中,GPU所占的面积非常小,但时至今日,第五代处理器架构Skylake已经实现了非常成熟的GPU集成技术,GPU在芯片中所占的面积已经超过一半。未来我们将推出基于PCI-E的独立显卡,为PC带来更大的图像性能提升。

1.2基本功能模块

上图是一个GPU的一些基本功能模块。英特尔的核心显卡分为普通的英特尔HD显卡和强大的英特尔Iris (Pro)显卡,其中硬件结构的变化决定了性能。我们知道GPU中的切片越多,组织的处理单元就越多,性能就越强大。英特尔高清显卡,即GT2,只有一片,而GT3在虹膜系列有两片。与GT3相比,GT3e增加了eDRAM,使其具有更快的内存访问速度,而GT4e增加到三片。GPU的基本功能模块主要由EU和相关媒体处理(MFX)组成。一个切片中有三个子切片。子片包含特定的EU和媒体采样器模块作为最基本的可编程处理单元,GPU相关的任务都在EU上进行。媒体处理还集成了一个名为MFX的独立模块,主要由媒体格式编解码器(MFX)和VQE组成。MFX可以通过Fix函数将一些处理任务打包,固定在一个执行单元中进行统一编解码处理,而不需要调用EU,从而提高EU处理3D图形等任务的速度。文章质量引擎(VQE)提供文章处理任务,如去隔行和去噪声,EU用于编解码器,以获得更高的文章编码质量。

1.3结构演变

上图是几代英特尔酷睿显卡的结构变化。最早的Haswell架构,也就是v3系列的EU数量比较少,最多40个;然而,当两个切片被集成到Broadwell架构的GT3中时,EU的数量增加到48,并且图像处理性能也得到增强。从Broadwell architecture到Skylake architecture,除了EU和Slice格式的增加,MFX的组织也有了相应的改进。Broadwell架构把MFX整合成一个切片,一个切片整合一个MFX;在Skylake建筑之后,切片的数量增加了,但是MFX的数量没有增加。这时,MFC被集成在片外。随着组织模式的改变,核心显卡的功能也发生了变化:Skylake增加了HEVC的解码器,PAK增加了基于HEVC的处理功能,其他的改进也显著提升了核心显卡的整体处理性能。第六代之后,核心显卡主要由GT3组织。

上面介绍了核心显卡硬件的模块结构,接下来我会具体介绍快速同步文章加速。驱动返回的命令流通过多条路径在GPU上执行:如果命令属于编解码器的Fix函数,则由MFX执行,一些与文章处理相关的命令由VQE执行,其他命令由EU执行。编码过程主要分为两部分:ENC和PAK。ENC主要通过硬件实现码率控制、运动估计、帧内预测、模式判决等功能;PAK执行运动补偿、帧内预测、前向量化、像素重建、熵编码和其他功能。在目前的Intel架构下,Media SDK通过API统一调度和使用硬件,我们提供了一个底层接口——灵活编码器接口(FEI),实现更好的底层调度和更好的处理效果。

2、软件政策

接下来,我将介绍英特尔的软件战略。最低的FFmpeg允许开发者将QSV集成到FFmpeg中,便于开发,而Media SDK主要用于编解码处理,可以有效地结合整个多媒体处理。如果开发者认为传统媒体SDK的处理质量达不到要求或者速率控制不符合某些特定场景,那么可以通过调用FEI等底层接口来优化控制算法。顶层OpenCL接口使用GPU函数实现边缘计算等处理任务,常见的混合编码方式使用OpenCL。此外,OpenCL还可以实现一些其他的并行处理功能,比如一些与AI相关的计算。

2.1媒体SDK

Media SDK分为以下几个版本:社区版是部分免费版,功能基本,而精华版和专业版是付费版,功能更多,可以实现混合HEVC编码、音频编解码、文章质量卡尺工具等诸多高级功能和分析工具的集合

1)软件架构

上图主要介绍了Media Server Studio软件栈的软件架构,我们基于该架构实现了FFmpeg的加速。

这里需要强调的是:

A)OpenGL (mesa)和linux内核一直都是开源项目,但MSS之前版本有一些私有内核补丁,对操作系统或Linux内核版本有特殊要求。

Linux的HD图形驱动以前是闭源解决方案,现在MSDK和用户态驱动(iHD驱动)都实现了开源。现在我们正在做一个基于开源版本的发布,未来你可以通过这个开源平台获得更好的技术支持。

2)编解码器支持

关于编解码器的支持,我想强调HEVC 8位和10位的编解码器。Gen 9(即Skylake)不支持硬件级HEVC 10位解码。在这种情况下,我们可以通过混合模式实现HEVC 10 bit的编解码功能。最新的E3v6(Kabylake)虽然只有低性能的GPU配置,但可以支持HEVC 10位解码,未来的芯片中也会提供HEVC 10位编码功能。

2.2从qsv到FFmpeg的集成思路

FFmpeg集成的主要思想如下:

1)FFmpeg QSV插件:SDK封装为FFmpeg的一部分,包括解码器、编码器和VPP滤波处理。

2) VAPPI插件:整个Intel GPU软件架构的媒介,从底层linux内核开始,中间有一个用户态驱动,对外统一接口是VAAPI。媒体SDK的硬件加速是基于VAAPI开发,同时增加了很多相关的功能,代码也比较复杂。现在增加的VAAPI插件会直接调用LibAV,让软硬件结合更加紧密。

接下来我将介绍如何将SDK集成到FFmpeg中,分为三个部分:AVDecoder,AVEncoder,AVFilter。

1)AVFilter

AVFilter主要利用硬件GPU实现文章处理器的功能,包括vpp_qsv、overlay_qsv和hwupload_qsv,其中我们主要开发overlay_qsv、vpp_qsv和hwupload_qsv。如果在一个文章处理管道中运行多个VPP实例,将会对性能产生很大影响。我们的方案是将所有函数集成在一个大的VPP滤波器中,通过设置参数来调用它,从而避免了多个VPP实例的存在。但是为什么要把vpp_qsv和overlay_qsv分开呢?这是因为无法完成合成器和一些文章处理功能(如去隔行等。)同时在一个VPP实例中。英特尔酷睿显卡内部显存的存储格式是NV12。使用非硬件加速模块时,有必要将帧缓冲区从系统内存复制到显卡的文章内存中。hwupload_qsv提供系统存储器和文章存储器之间的快速帧转换功能。

2)AVEncoder

AVEncoder目前支持H264、HEVC、MPEG-2等解码的硬件加速。

3)av解码器

AVDecoder目前支持H264、HEVC、MPEG-2等协议的硬件加速。

最理想的解决方案是在整个文章处理流水线中使用显卡内存,使得内存之间没有帧拷贝,从而达到最快的处理速度,但在实际应用中,我们往往做不到这一点。在将MSDK集成到FFmpeg中时,需要解决内存转换的问题,比如VPP滤波器不支持某些功能或者原码流不在解码器支持的列表中。上图中粉色和绿色的转换代表数据从显存到系统内存再到显存的转换。在实践中,我们经常会遇到处理性能的急剧变化。可能的原因是一些非硬件处理模块和硬件加速模块存在于同一个流水线中,从而影响整体性能。这是因为额外的内存复制过程,一旦优化不足,会极大地影响性能。内存分配我们用的是hwcontext,这是FFmpeg 3.0以后增加的功能。我们基于FFmpeg中的hwcontext机制实现了hwcontext _ QSV,从而很好地管理硬件初始化和内存分配。

3、 MSS和FFmpeg QSV的比较

下面我将分享MSS和FFmpeg QSV的异同。两者都支持相同的编解码器和文章处理。

两者的区别在于:

1)MSS只提供一套库和工具,用户必须基于MSS进行二次开发;FFmpeg是一个流行的多媒体开放框架,QSV的GPU加速只是其中的一部分。

2)2)MSS的库提供了VPP接口,用户必须进行二次开发才能实现部分功能。目前FFmpeg QSV有两个开发的滤波器,MSS支持的所有功能都集成在滤波器中,配置上提供了更简单的选项。这些功能方便了用户。

3)内存管理上,MSS开发者必须自己管理内存;FFmpeg提供了基本的内存管理单元并实现了系统内存的统一调用,集成了硬件级的内存处理机制。

4) FFmpeg提供了一定的容错机制和a/v同步机制;FFmpeg QSV模块充分利用这些机制来提高兼容性,比如使用FFmpeg的解析工具对文章流进行预处理。

5)在处理流程方面,MSS的用户在使用MSS模块之前,必须自己开发Mux/Demux或其他必要的模块;但是,FFmpeg QSV是基于MSS的,并增加了特殊的逻辑,所以每个模块都可以与FFmpeg的其他模块一起工作。

可以说,FFmpeg拥有强大的媒体支持,与传统MSS相比,在保证性能和质量的前提下,为用户节省了大量的工作量,显著提高了开发效率。

4、练习和测试

上图是在Skylake上测试硬件转码能力的结果,是Gen 9。GT2、GT31、GT41三款车型性能提升;Tu1、 Tu2、 Tu4、 TU7表示编解码器性能和图像质量之间的平衡程度,其中TU7表示最快的处理速度和较差的图像质量,TU1表示基于大量计算的较高的图像质量。

上图显示了HEVC sky lake支持的性能数据,分辨率为1080P。其实HEVC 4K60p也能获得不错的性能。随着输出图像质量的提高,转码速度也会相应降低。但在正常使用中,我们主要是根据需求平衡性能和质量,在短时间内实现更高质量的转码输出。

如果侧重于图像质量的分析,在实践中,我们建议使用中等模式,以获得相对更好的性能和质量。随着参数的变化,PSNR和图像的整体细节都会发生明显的变化。

源代码主要有两种方式:可以直接从FFmpeg克隆,也可以访问Intel的Github获取相应的源代码。Intel的github的分支中的FFmpeg qsv模块经过Intel的测试,运行更稳定,问题更少。你也可以在英特尔的Github上提出相关问题,我们会回答一些问题。

上图是实践中可能需要的一些命令参考,其中我想强调一下叠加滤镜。这里我们支持多种模式,包括插入logo、电视墙等。并且我们还可以在文章会议等场景中实现手动指定和确定图片中每张图片的位置的效果。

版权声明

本站文章收集于互联网,仅代表原作者观点,不代表本站立场,文章仅供学习观摩,请勿用于任何商业用途。
如有侵权请联系邮箱tuxing@rediffmail.com,我们将及时处理。本文地址:https://www.wuliandi.com/zhishi/2023-2126.html

中学网 - 让教育更简单

https://www.wuliandi.com/

蜀ICP备19007375号

Powered By 中学网版权所有