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