唐詠
摘要:該文以H.264編碼的圖像為例,研究了基于DXVA和OpenCL的硬解碼方案;利用DXVA2以及OpenCL的API,設(shè)計(jì)了一套硬解碼流程,并利用該流程測(cè)試出數(shù)據(jù),驗(yàn)證了方案的可行性。
關(guān)鍵詞:dxva2;OpenCL;h.264;硬解碼
中圖分類號(hào):TP312 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):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
圖像在計(jì)算機(jī)上的解碼通常分為兩種,一種稱為軟解碼(CPU處理),一種稱為硬解碼(GPU處理)。GPU相對(duì)于CPU而言,更專注于圖像的處理。對(duì)于大分辨率的圖像運(yùn)算使用硬解碼速度可以更快,也可以更節(jié)省資源。
1 硬解碼方案研究
通用硬解碼技術(shù)DXVA2 (DirectX Video Acceleration)最終硬解只是在顯卡的顯存層次,解碼后的數(shù)據(jù)一般都為YUV格式中的NV12,這種格式并不通用。本文采用全程的GPU對(duì)H.264編碼的視頻圖像進(jìn)行運(yùn)算。DXVA2負(fù)責(zé)將H.264硬解碼到顯存,OpenCL(Open Computing Language,開(kāi)放運(yùn)算語(yǔ)言)負(fù)責(zé)YUV類型的轉(zhuǎn)換以及顯存到內(nèi)存的拷貝[1]。
目前圖像編碼是H.264的比較常見(jiàn)。H.264是國(guó)際標(biāo)準(zhǔn)化組織(ISO)和國(guó)際電信聯(lián)盟(ITU)共同提出的繼MPEG4之后的新一代數(shù)字視頻壓縮格式。它本身的運(yùn)算復(fù)雜度較高,分辨率越大,運(yùn)算復(fù)雜率越高,耗時(shí)也越多。所以能夠更方便體現(xiàn)DXVA和OpenCL相結(jié)合進(jìn)行硬解碼的優(yōu)越性。
2 硬解碼方案的設(shè)計(jì)與實(shí)現(xiàn)
方案設(shè)計(jì)的系統(tǒng)流程圖如圖1。從圖1可以看出,硬解碼的總體流程其實(shí)主要分為三塊,一是數(shù)據(jù)的分析。這里主要是針對(duì)H264數(shù)據(jù)的分析,GPU硬解碼由硬件完成了各種運(yùn)算操作,但這些運(yùn)算操作所需要的參數(shù),是需要用戶自己分析數(shù)據(jù),從而得出的;二是DXVA硬解數(shù)據(jù)到顯存Surface表面。這里已經(jīng)解碼成YUV數(shù)據(jù)NV12,但這種數(shù)據(jù)并不是我們所需要的格式以及CPU也無(wú)法直接訪問(wèn)顯存;三是OpenCL進(jìn)行YUV格式轉(zhuǎn)換以及把數(shù)據(jù)的存儲(chǔ)位置轉(zhuǎn)移。這里主要指由GPU完成NV12到Y(jié)V12的轉(zhuǎn)化以及由顯存轉(zhuǎn)移到內(nèi)存的過(guò)程[2]。
2.1 H.264數(shù)據(jù)分析
H.264數(shù)據(jù)分析主要參考H.264的壓縮編碼標(biāo)準(zhǔn),在H.264碼流中提取一些結(jié)構(gòu)體參數(shù),如PPS,SPS,NALU信息等。其中,SPS序列參數(shù)集和PPS序列參數(shù)集包含了初始化H.264解碼器所需要的信息參數(shù),包括解碼所需要的profile, level, 圖像的寬和高,deblock濾波器等[3]。而Non-IDR Slice_without_partition和IDR Slice則是包含了真正的H264圖像原始數(shù)據(jù)。
2.2 Dxva2硬解碼
進(jìn)行DXVA2硬解碼之前,首先要判斷測(cè)試機(jī)的顯卡是否支持h264的硬解碼,以及支持的最大分辨率是多少。
DXVA2的硬解碼步驟主要分為以下四步:第一步打開(kāi)D3D設(shè)備句柄,包括了創(chuàng)建D3D9對(duì)象,創(chuàng)建D3D9設(shè)備,創(chuàng)建D3D設(shè)備管理器,打開(kāi)設(shè)備句柄,獲取硬解碼服務(wù)對(duì)象等步驟[4]。第二步找到支持的解碼配置,包括了找到視頻服務(wù)轉(zhuǎn)換的GUID,獲取解碼支持的配置等步驟;第三步分配未壓縮的緩沖,即分配顯存中的原始YUV緩沖表面。包括了創(chuàng)建表面,涉及的API有CreateSurface等;最后一步即是解碼。
2.3 OpenCL的YUV轉(zhuǎn)換以及YUV存儲(chǔ)轉(zhuǎn)移
OpenCL是一門(mén)可以運(yùn)行在支持這個(gè)標(biāo)準(zhǔn)的所有硬件,目前的主流GPU都支持這個(gè)標(biāo)準(zhǔn)。
定義函數(shù)Kernel,用來(lái)進(jìn)行YUV的轉(zhuǎn)換,參數(shù)首先設(shè)置好,再把運(yùn)行函數(shù)告訴硬件GPU,最后調(diào)用OpenCL的函數(shù)將運(yùn)算結(jié)果(位于顯存)輸出到預(yù)先分配的內(nèi)存就完成了存儲(chǔ)位置的轉(zhuǎn)移。在OpenCL執(zhí)行時(shí), GPU會(huì)多線程并行運(yùn)算這個(gè)Kernel,從而完成整個(gè)YUV轉(zhuǎn)換過(guò)程。
3 驗(yàn)證及性能測(cè)試
完成設(shè)計(jì)與實(shí)現(xiàn)后就需要用數(shù)據(jù)來(lái)對(duì)方案進(jìn)行驗(yàn)證說(shuō)明。本文的測(cè)試參數(shù)如下:
測(cè)試對(duì)象:一段1080P的h.264高清視頻以及4K的h.264超高清視頻:
測(cè)試環(huán)境:Win7 32位系統(tǒng),AMD及Intel分別選取兩種顯卡。
測(cè)試目的:驗(yàn)證方案的正確性和優(yōu)越性。
首先給出一段軟解碼的數(shù)據(jù),在CPU上軟解碼一幀1080P的圖像平均在20毫秒左右,CPU使用率會(huì)在10%~20%波動(dòng),而GPU硬解碼時(shí),CPU的使用率只會(huì)在0%~3%左右波動(dòng)。下面先給出AMD獨(dú)立顯卡下的硬解數(shù)據(jù),如表1。
從表1 顯卡型號(hào)的對(duì)比可以看出,隨著工藝的進(jìn)步,顯卡的升級(jí),GPU解碼的效率是越來(lái)越高的。不能解碼4K的超高清也說(shuō)明了GPU的解碼是受硬件和驅(qū)動(dòng)限制的。另外和CPU解碼相比,雖然CPU使用率節(jié)省了不少,但每一幀的解碼速度快的不多,這也是因?yàn)槲锢斫Y(jié)構(gòu)導(dǎo)致,眾所周知,顯卡是插在PCI-E插槽的,距離CPU距離比較遠(yuǎn),中間傳輸?shù)母鱾€(gè)器件的速度不一,導(dǎo)致了硬解碼CPU和GPU交互的過(guò)程速度大大減慢,從而消耗了更多的時(shí)間。
接下來(lái)選取Intel的。數(shù)據(jù)如表2。
Intel的CPU現(xiàn)在基本都是帶核顯的,也就是說(shuō)CPU和GPU集成在同一塊芯片上,一般來(lái)說(shuō),都以CPU的型號(hào)來(lái)統(tǒng)稱。上述表格中,酷睿為普通用戶級(jí)別的CPU,至強(qiáng)則是服務(wù)器級(jí)別的CPU(核數(shù)會(huì)更多)。橫向?qū)Ρ?,解碼一路消耗的時(shí)間相差不大,但由于至強(qiáng)的核數(shù)要多,所以在解碼多路視頻上會(huì)更有優(yōu)勢(shì)。但和CPU軟解碼對(duì)比,時(shí)間縮短為1/4,是一個(gè)很大的進(jìn)步。
Intel和AMD的相比,速度也快了很多,原因也很好理解了,因?yàn)镃PU和GPU就在同一塊芯片上,交互速度大大增強(qiáng)了,AMD公司也有一款兩者集成在同一芯片上的CPU,叫APU,硬解碼速度也是很快的。
從測(cè)試數(shù)據(jù)來(lái)看,GPU硬解碼確實(shí)節(jié)省了CPU的資源,從而能夠讓CPU去更好更快的去做其他的事情,比如一邊看高清視頻,一邊玩游戲等,另一方面,GPU解碼也確實(shí)比CPU速度更快,時(shí)間用得更少,更擅長(zhǎng)對(duì)圖像的解碼運(yùn)算處理。從而驗(yàn)證了整個(gè)方案正確性和優(yōu)越性。
4 結(jié)束語(yǔ)
隨著電視電影的分辨率標(biāo)準(zhǔn)越來(lái)越高,CPU由于要協(xié)調(diào)整個(gè)硬件及軟件系統(tǒng),已經(jīng)難以跟上變化,交給專職的GPU來(lái)做圖像運(yùn)算是一個(gè)不錯(cuò)的選擇。而DXVA和OpenCL作為一個(gè)業(yè)內(nèi)的通用標(biāo)準(zhǔn),能夠讓專業(yè)人員專注于標(biāo)準(zhǔn)本身,而不用專注GPU是哪個(gè)公司的,不用為每個(gè)公司的GPU都分別開(kāi)發(fā)一套硬解碼代碼。僅需要一套代碼,就可以運(yùn)行在各種GPU上。
本文以H.264編碼的視頻為例,進(jìn)行硬解碼方案的研究和實(shí)施,并最終測(cè)試驗(yàn)證了整個(gè)方案的可行性和優(yōu)越性。
參考文獻(xiàn):
[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]. 蘇金國(guó),譯. 北京: 機(jī)械工業(yè)出版社, 2013.
[3] Scarpino M. OpenCL實(shí)戰(zhàn)[M]. 陳睿,譯. 北京: 人民郵電出版社, 2014.
[4] 畢厚杰, 王健. 新一代視頻壓縮編碼標(biāo)準(zhǔn)——H.264/AVC[M]. 2版.北京: 人民郵電出版社, 2009.