基于DXVA和OpenCL的硬解码H.264技术的研究和实现

2015-10-27 12:15唐咏
电脑知识与技术 2015年21期
关键词:解码运算速度

唐咏

摘要:该文以H.264编码的图像为例,研究了基于DXVA和OpenCL的硬解码方案;利用DXVA2以及OpenCL的API,设计了一套硬解码流程,并利用该流程测试出数据,验证了方案的可行性。

关键词:dxva2;OpenCL;h.264;硬解码

中图分类号:TP312 文献标识码:A 文章编号:1009-3044(2015)21-0068-02

Research and Implementation of Hard Decoding H.264 Technology Based on DXVA and OpenCL

TANG Yong

(Changzhou Institute of Engineering Technology, Intelligent of equipment and Information Engineering, Changzhou 213164, China)

Abstract: In this paper, we researched the hardware-decoding based on DXVA and OpenCL which using a encoded image in H.264 as an example. We designed a hardware decoding process using DXVA2 and the OpenCL API, and we got the testing data to verify the possible solutions.

Key words: dxva2;OpenCL;h.264;hardware decoding

图像在计算机上的解码通常分为两种,一种称为软解码(CPU处理),一种称为硬解码(GPU处理)。GPU相对于CPU而言,更专注于图像的处理。对于大分辨率的图像运算使用硬解码速度可以更快,也可以更节省资源。

1 硬解码方案研究

通用硬解码技术DXVA2 (DirectX Video Acceleration)最终硬解只是在显卡的显存层次,解码后的数据一般都为YUV格式中的NV12,这种格式并不通用。本文采用全程的GPU对H.264编码的视频图像进行运算。DXVA2负责将H.264硬解码到显存,OpenCL(Open Computing Language,开放运算语言)负责YUV类型的转换以及显存到内存的拷贝[1]。

目前图像编码是H.264的比较常见。H.264是国际标准化组织(ISO)和国际电信联盟(ITU)共同提出的继MPEG4之后的新一代数字视频压缩格式。它本身的运算复杂度较高,分辨率越大,运算复杂率越高,耗时也越多。所以能够更方便体现DXVA和OpenCL相结合进行硬解码的优越性。

2 硬解码方案的设计与实现

方案设计的系统流程图如图1。从图1可以看出,硬解码的总体流程其实主要分为三块,一是数据的分析。这里主要是针对H264数据的分析,GPU硬解码由硬件完成了各种运算操作,但这些运算操作所需要的参数,是需要用户自己分析数据,从而得出的;二是DXVA硬解数据到显存Surface表面。这里已经解码成YUV数据NV12,但这种数据并不是我们所需要的格式以及CPU也无法直接访问显存;三是OpenCL进行YUV格式转换以及把数据的存储位置转移。这里主要指由GPU完成NV12到YV12的转化以及由显存转移到内存的过程[2]。

2.1 H.264数据分析

H.264数据分析主要参考H.264的压缩编码标准,在H.264码流中提取一些结构体参数,如PPS,SPS,NALU信息等。其中,SPS序列参数集和PPS序列参数集包含了初始化H.264解码器所需要的信息参数,包括解码所需要的profile, level, 图像的宽和高,deblock滤波器等[3]。而Non-IDR Slice_without_partition和IDR Slice则是包含了真正的H264图像原始数据。

2.2 Dxva2硬解码

进行DXVA2硬解码之前,首先要判断测试机的显卡是否支持h264的硬解码,以及支持的最大分辨率是多少。

DXVA2的硬解码步骤主要分为以下四步:第一步打开D3D设备句柄,包括了创建D3D9对象,创建D3D9设备,创建D3D设备管理器,打开设备句柄,获取硬解码服务对象等步骤[4]。第二步找到支持的解码配置,包括了找到视频服务转换的GUID,获取解码支持的配置等步骤;第三步分配未压缩的缓冲,即分配显存中的原始YUV缓冲表面。包括了创建表面,涉及的API有CreateSurface等;最后一步即是解码。

2.3 OpenCL的YUV转换以及YUV存储转移

OpenCL是一门可以运行在支持这个标准的所有硬件,目前的主流GPU都支持这个标准。

定义函数Kernel,用来进行YUV的转换,参数首先设置好,再把运行函数告诉硬件GPU,最后调用OpenCL的函数将运算结果(位于显存)输出到预先分配的内存就完成了存储位置的转移。在OpenCL执行时, GPU会多线程并行运算这个Kernel,从而完成整个YUV转换过程。

3 验证及性能测试

完成设计与实现后就需要用数据来对方案进行验证说明。本文的测试参数如下:

测试对象:一段1080P的h.264高清视频以及4K的h.264超高清视频:

测试环境:Win7 32位系统,AMD及Intel分别选取两种显卡。

测试目的:验证方案的正确性和优越性。

首先给出一段软解码的数据,在CPU上软解码一帧1080P的图像平均在20毫秒左右,CPU使用率会在10%~20%波动,而GPU硬解码时,CPU的使用率只会在0%~3%左右波动。下面先给出AMD独立显卡下的硬解数据,如表1。

从表1 显卡型号的对比可以看出,随着工艺的进步,显卡的升级,GPU解码的效率是越来越高的。不能解码4K的超高清也说明了GPU的解码是受硬件和驱动限制的。另外和CPU解码相比,虽然CPU使用率节省了不少,但每一帧的解码速度快的不多,这也是因为物理结构导致,众所周知,显卡是插在PCI-E插槽的,距离CPU距离比较远,中间传输的各个器件的速度不一,导致了硬解码CPU和GPU交互的过程速度大大减慢,从而消耗了更多的时间。

接下来选取Intel的。数据如表2。

Intel的CPU现在基本都是带核显的,也就是说CPU和GPU集成在同一块芯片上,一般来说,都以CPU的型号来统称。上述表格中,酷睿为普通用户级别的CPU,至强则是服务器级别的CPU(核数会更多)。横向对比,解码一路消耗的时间相差不大,但由于至强的核数要多,所以在解码多路视频上会更有优势。但和CPU软解码对比,时间缩短为1/4,是一个很大的进步。

Intel和AMD的相比,速度也快了很多,原因也很好理解了,因为CPU和GPU就在同一块芯片上,交互速度大大增强了,AMD公司也有一款两者集成在同一芯片上的CPU,叫APU,硬解码速度也是很快的。

从测试数据来看,GPU硬解码确实节省了CPU的资源,从而能够让CPU去更好更快的去做其他的事情,比如一边看高清视频,一边玩游戏等,另一方面,GPU解码也确实比CPU速度更快,时间用得更少,更擅长对图像的解码运算处理。从而验证了整个方案正确性和优越性。

4 结束语

随着电视电影的分辨率标准越来越高,CPU由于要协调整个硬件及软件系统,已经难以跟上变化,交给专职的GPU来做图像运算是一个不错的选择。而DXVA和OpenCL作为一个业内的通用标准,能够让专业人员专注于标准本身,而不用专注GPU是哪个公司的,不用为每个公司的GPU都分别开发一套硬解码代码。仅需要一套代码,就可以运行在各种GPU上。

本文以H.264编码的视频为例,进行硬解码方案的研究和实施,并最终测试验证了整个方案的可行性和优越性。

参考文献:

[1] Mircrosoft.Supporting DXVA 2.0 in Media Foundation[EB/OL]. (2012-11-28).https://msdn.microsoft.com/en-us/library/aa965266.aspx.

[2] Munshi A,Gaster B R,Mattson T G,et al. OpenCL编程指南[M]. 苏金国,译. 北京: 机械工业出版社, 2013.

[3] Scarpino M. OpenCL实战[M]. 陈睿,译. 北京: 人民邮电出版社, 2014.

[4] 毕厚杰, 王健. 新一代视频压缩编码标准——H.264/AVC[M]. 2版.北京: 人民邮电出版社, 2009.

猜你喜欢
解码运算速度
《解码万吨站》
行驶速度
重视运算与推理,解决数列求和题
速度
有趣的运算
解码eUCP2.0
NAD C368解码/放大器一体机
Quad(国都)Vena解码/放大器一体机
“整式的乘法与因式分解”知识归纳
拨云去“误”学乘除运算