, ,
(1.電子科技大學(xué) 航空航天學(xué)院,成都 611731; 2.國家新聞出版廣電總局五四二臺(tái),北京 100866)
2003年,ITU(International Telecommunication Union)與ISO (International Organization for Standardization)組成的JVT(Joint Video Team)制定了H.264/AVC標(biāo)準(zhǔn)。其中,為了在保證其圖像質(zhì)量的同時(shí)盡可能降低碼率,H.264/AVC標(biāo)準(zhǔn)采用了的許多新創(chuàng)的編解碼技術(shù),如改進(jìn)的去塊效應(yīng)濾波器、塊的多種劃分方式、像素運(yùn)動(dòng)估計(jì)(幀間預(yù)測)以及根據(jù)塊劃分的多模式幀內(nèi)預(yù)測等;但是,H.264解碼時(shí)的計(jì)算復(fù)雜度是MP4的2.2~4.1倍,并且H.264各個(gè)對(duì)應(yīng)部分的計(jì)算量比H.263均高出了1.2~2.1倍。
在H.264/AVC標(biāo)準(zhǔn)中,多模式幀內(nèi)預(yù)測與去塊效應(yīng)濾波器兩種技術(shù)是保證碼率與圖像質(zhì)量的關(guān)鍵。在多模式幀內(nèi)預(yù)測技術(shù)中,率失真優(yōu)化是幀內(nèi)預(yù)測的本質(zhì);為了更好的協(xié)調(diào)碼率與失真,H.264/AVC標(biāo)準(zhǔn)對(duì)所有預(yù)測模式進(jìn)行計(jì)算,選擇率失真代價(jià)最小的模式作為最優(yōu)解。其中,文獻(xiàn)[1]提出了9種不同處理順序;采用多級(jí)流水線方式,改變預(yù)測塊順序,使不相關(guān)的塊可以并行執(zhí)行,實(shí)現(xiàn)幀內(nèi)預(yù)測模塊的并行執(zhí)行,但是并沒有達(dá)到最好的效果;為了提高并行效率,文獻(xiàn)[2]在其基礎(chǔ)上改變了預(yù)測模式,這雖然減少了處理時(shí)間,但是所對(duì)應(yīng)的影響則是很大程度上降低了圖像質(zhì)量。
而對(duì)于H.264/AVC標(biāo)準(zhǔn)中的濾波器,其主要的作用,是去除了編碼過程中所產(chǎn)生的方塊效應(yīng)。其中,對(duì)于去塊濾波器的并行實(shí)現(xiàn),文獻(xiàn)[3]直接提出了一種基于CUDA的并行實(shí)現(xiàn)方法,文獻(xiàn)[4-5]提出了通過局部減少分支條件來提高濾波器效率。上述兩種算法在一定程度上提高了效率,但在流程上并沒有進(jìn)行足夠的改進(jìn),且在執(zhí)行順序上沒有很好的突破。
本文主要研究H.264/AVC標(biāo)準(zhǔn)中的幀內(nèi)預(yù)測與濾波器模塊的并行算法,在文獻(xiàn)[2]基礎(chǔ)上對(duì)幀內(nèi)預(yù)測模塊進(jìn)行優(yōu)化處理,對(duì)濾波器模塊提出新的Bs值并行求取算法,另外在文獻(xiàn)[3]的所提出的奇偶邊界執(zhí)行算法的基礎(chǔ)上提出一種新的濾波執(zhí)行并行算法。
FFmpeg(Fast Forward Mpeg)使用的H.264解碼器,主要通過對(duì)幀一級(jí)的圖像解碼來實(shí)現(xiàn)多線程并行工作:
1)從網(wǎng)絡(luò)抽象層(Network Abstraction Layer (NAL))獲取碼流數(shù)據(jù),將其放入解碼和重排序模塊進(jìn)行解析,可得一系列量化系數(shù)X,繼續(xù)將獲得的數(shù)據(jù)進(jìn)行反量化與反變換處理,得殘差數(shù)據(jù)D。
2)從NAL獲取的碼流,通過解析能得出幀內(nèi)預(yù)測模式與幀間預(yù)測模式中所需要的MV等信息,將此信息作為幀內(nèi)預(yù)測或幀間運(yùn)動(dòng)補(bǔ)償參考數(shù)據(jù)進(jìn)行幀內(nèi)/幀間預(yù)測。
3)由殘差數(shù)據(jù)與預(yù)測數(shù)據(jù)相結(jié)合得到重建的圖像數(shù)據(jù),因?yàn)閳D像中存在塊效應(yīng),所以需要通過濾波器進(jìn)行濾波,形成真正的解碼幀,此解碼幀也作為之后解碼用的參考幀。
本文僅對(duì)幀內(nèi)預(yù)測與濾波器做并行化處理,因此其框架如圖1所示。
圖1 解碼框架圖
在H.264/AVC標(biāo)準(zhǔn)中,當(dāng)圖像中各個(gè)宏塊經(jīng)過反量化與反變換之后,所形成的圖像根據(jù)規(guī)則被分為I幀與P幀,I幀是指在編碼過程中,預(yù)測所采用的是幀內(nèi)預(yù)測,P幀是指在編碼過程中,預(yù)測所采用的是幀間預(yù)測(運(yùn)動(dòng)估計(jì))。而在本文的框架中,主要對(duì)I幀進(jìn)行討論。
GPU中處理的主要包括兩個(gè)部分,其中,“處理部分1”為幀內(nèi)預(yù)測部分;“處理部分2”為濾波器部分。具體處理流程如圖2所示。
圖2 運(yùn)行流程圖
如圖2所示,當(dāng)前幀為I幀的時(shí)候才通過CUDA調(diào)用GPU進(jìn)行幀內(nèi)預(yù)測解碼,否則當(dāng)前幀為P幀,調(diào)用CPU進(jìn)行幀間預(yù)測(運(yùn)動(dòng)估計(jì))解碼。當(dāng)幀內(nèi)預(yù)測與幀間預(yù)測都執(zhí)行完成后,將兩個(gè)模塊的數(shù)據(jù)統(tǒng)一傳到濾波器模塊,調(diào)用GPU進(jìn)行濾波模塊的處理。
在H.264/AVC標(biāo)準(zhǔn)中,幀內(nèi)預(yù)測主要包括四種方式:PCM預(yù)測方式、4×4亮度塊的幀內(nèi)預(yù)測方式、16×16亮度塊的幀內(nèi)預(yù)測方式、8×8色度塊的幀內(nèi)預(yù)測方式。
本文主要研究四種模式中的4×4亮度塊的幀內(nèi)預(yù)測方式,其傳統(tǒng)處理順序如圖3所示。由圖3可見,此方式以一個(gè)16×16亮度塊為單位,其中MB0、MB1、MB2、MB3、MB4為16×16亮度塊,每個(gè)16×16像素的宏塊有16個(gè)4×4像素的子宏塊,單個(gè)16×16亮度塊內(nèi)4×4像素子宏塊的處理順序如圖中字母順序所標(biāo)示。
圖3 16×16亮度宏塊圖
16×16像素的宏塊MB4中子宏塊的幀內(nèi)預(yù)測所依賴的全部子宏塊分別為:塊1的j、k、o、p子塊;塊3的g、m、n、p子塊;塊0的p子塊;塊2的j子塊。以塊4的16個(gè)4×4子宏塊中,需要其他16×16塊做支持的子塊為例:a子塊的預(yù)測需要塊0標(biāo)記為p子塊,塊1標(biāo)記為j、k子塊,塊3標(biāo)記為g的子塊;g子塊的預(yù)測需要塊4標(biāo)記為f子塊,塊1標(biāo)記為p子塊,塊2標(biāo)記為j的子塊;j子塊的預(yù)測需要塊3標(biāo)記為p子塊,塊4中標(biāo)記為d、i的子塊。而對(duì)于16×16宏塊的執(zhí)行的順序?yàn)?~4,每一個(gè)16×16宏塊中的4×4子塊的執(zhí)行順序則是為a~p。
若直接將傳統(tǒng)的幀內(nèi)預(yù)測解碼順序在GPU上實(shí)現(xiàn),那么傳統(tǒng)模式所采用的固定順序會(huì)導(dǎo)致GPU的運(yùn)行效率極低。為了解決該問題,文獻(xiàn)[1]中提到了9種更改的處理順序,文獻(xiàn)[2]在其基礎(chǔ)上從中選擇一種處理順序并在其基礎(chǔ)上提出一種流水線解碼方案,該方案的并行處理順序如圖4,其中數(shù)字為并行處理順序,數(shù)字相同的則是可以被并行處理的子塊。
圖4 文獻(xiàn)[2]中4×4塊處理順序圖
該方案在原先基礎(chǔ)上將4×4塊的處理順序進(jìn)行了較好的并行化處理,對(duì)一個(gè)16×16的宏塊,總計(jì)需要10個(gè)計(jì)算單個(gè)子塊的時(shí)間;本文在文獻(xiàn)[1-2]基礎(chǔ)上,提出了一種以4×4亮度塊為最小單位、去除模式3與模式7的并行優(yōu)化方案,如圖5,圖中數(shù)字仍為并行處理順序,數(shù)字相同的是可以被并行處理的子塊;每行的間隔從2減少為1。
圖5 本文4×4塊處理順序圖
如圖5所示,本文算法的并行粒度進(jìn)一步提高,使得每行的宏塊都能流水線的進(jìn)行并行處理,對(duì)于一幀內(nèi)的16×16塊中屬于同一行的4×4塊進(jìn)行順序處理,對(duì)一個(gè)16×16宏塊,總計(jì)僅需要7個(gè)計(jì)算單個(gè)子塊的時(shí)間。
假定一幀圖像的寬為W、高為H;對(duì)于所處理的塊,其基礎(chǔ)單位為 4×4像素塊。使用本文所提出的執(zhí)行順序,每一幀I幀至少需要GPU對(duì)其進(jìn)行M次運(yùn)算;而N是該執(zhí)行順序所能達(dá)到最大理論并行粒度。M、N計(jì)算方式如式(1)~(2):
M=(H/1-4)+W/4
(1)
N=min(W/4,2×(H/4))
(2)
每次運(yùn)算所能同時(shí)進(jìn)行的宏塊數(shù)量由list[i]表示。list[i]計(jì)算方式如式(3),其上限即為N:
(3)
因?yàn)榫幋a階段仍然會(huì)將模式3和模式7作為預(yù)測模式,若在解碼階段直接去除模式3與模式7會(huì)使得最終的圖像質(zhì)量受到影響。因此,為了保證最終圖像質(zhì)量,本文在進(jìn)行幀內(nèi)預(yù)測并行處理的同時(shí),選擇添加一個(gè)分支的方式,此分支可以在基本不影響并行粒度的同時(shí),保證模式3和模式7的正常解碼,其處理流程如圖6。
圖6 處理順序分支流程圖
如圖6所示,該分支主要作用是為了防止模式3和模式7的出現(xiàn),等待前一個(gè)線程的宏塊處理,使得當(dāng)前模塊所需要的左上模塊得以被處理完成。
1)在H.264/AVC標(biāo)準(zhǔn)中,圖像邊界分為虛假邊界、真實(shí)邊界,根據(jù)式(4)~(6)辨別圖像邊界偉哪種邊界。其中,通過查QP表得出α和β的值。真實(shí)邊界是指所求值不滿足以下條件;虛假邊界是值滿足以下條件;濾波器將對(duì)存在虛假邊界的宏塊進(jìn)行濾波。
|p0-q0|<α
(4)
|p1-q0|<β
(5)
|q1-q0|<β
(6)
2)濾波強(qiáng)度Bs值是根據(jù)圖7所描述規(guī)則來求取。在濾波的過程中,分別會(huì)對(duì)圖像進(jìn)行水平濾波、垂直濾波,因此要分別求取水平邊界與垂直邊界的Bs值。
Bs值的求取規(guī)則如圖7所示:
圖7 Bs值確定規(guī)則圖
3)虛假邊界進(jìn)行濾波操作,其中Bs值越大,濾波越強(qiáng)。
3.2.1 Bs值的并行求取
濾波強(qiáng)度Bs值求取的過程是以16×16塊為計(jì)算單位,一幀圖像的邊數(shù)為(W/H×H/16)×8=W×H/32條,共有W×H/32×16=W×H/2個(gè)邊界點(diǎn)。這些邊界點(diǎn)求取所需的值已經(jīng)在之前的過程中獲得,因此沒有相關(guān)性,可以并行求取。
在濾波強(qiáng)度Bs值的求取過程中,總計(jì)需要的參數(shù)為:熵解碼所解出的CBP值、運(yùn)動(dòng)矢量MV、編碼過程中的整數(shù)變換矩陣系數(shù)、反變換后所得殘差數(shù)據(jù)、幀內(nèi)預(yù)測模式等;在熵解碼中,CBP值與整數(shù)變換矩陣系數(shù)已經(jīng)被轉(zhuǎn)換為CBP_BLK值。
本文將這些參數(shù)存放在全局存儲(chǔ)器中,不需要額外調(diào)用CPU相GPU傳遞這些參數(shù);另外需要額外處理的參數(shù)為CBP_BLK數(shù)組,將其傳入到GPU內(nèi)的紋理存儲(chǔ)器中,以便于減少讀寫訪問;同時(shí)給GPU分配一定大小的空間用以存放各個(gè)邊界點(diǎn)的濾波強(qiáng)度Bs值,以便于濾波執(zhí)行時(shí)的直接調(diào)用。
在GPU中的每個(gè)block所處理的最小單位為16×16像素塊,即1個(gè)block需對(duì)128個(gè)邊界點(diǎn)進(jìn)行處理;本文為每個(gè)點(diǎn)分配一一對(duì)應(yīng)的thread進(jìn)行計(jì)算,以保證讀寫的效率與精準(zhǔn)度。線程調(diào)度方式為:
grid(W/16,H/16),block(16,4,2)
即將一幀分為W/16×H/16個(gè)block,每個(gè)block負(fù)責(zé)16×4×2個(gè)thread。
3.2.2 優(yōu)化的并行求取算法
對(duì)于同一個(gè)4×4像素塊中的運(yùn)動(dòng)矢量MV、幀內(nèi)預(yù)測模式、反變換后所得殘差數(shù)據(jù)以及CBP_BLK等參數(shù)是一樣的,因此根據(jù)同樣參數(shù)所計(jì)算出的Bs值也應(yīng)該相同?;谠撉闆r,本文對(duì)進(jìn)一步優(yōu)化Bs值求取算法,其所需的存儲(chǔ)空間與時(shí)間都為原來的1/4,計(jì)算效率為原來的4倍。優(yōu)化后的線程調(diào)度為:
grid(W/16,H/16),block(4,4,2)
即將一幀分為W/16×H/16個(gè)block,每個(gè)block負(fù)責(zé)4×4×2個(gè)thread。算法執(zhí)行時(shí),僅需要對(duì)同一個(gè)4×4像素塊的多個(gè)邊界點(diǎn)進(jìn)行一次計(jì)算,所計(jì)算出的Bs值就是該宏塊所有全部邊界點(diǎn)的濾波強(qiáng)度Bs值。
對(duì)于傳統(tǒng)的濾波執(zhí)行如圖8所示,濾波首先對(duì)從水平方向?qū)Ω鱾€(gè)垂直邊界進(jìn)行濾波,執(zhí)行的順序從1~4;然后從垂直方向?qū)Ω鱾€(gè)水平邊界執(zhí)行濾波,執(zhí)行順序?yàn)?~8。
圖8 傳統(tǒng)濾波執(zhí)行順序圖
從H.264/AVC標(biāo)準(zhǔn)中的濾波原理所知,塊與塊間的濾波是沒有關(guān)聯(lián)性的,其所需要的像素點(diǎn)都已經(jīng)在之前的過程中被計(jì)算出,官方所給出的H.264/AVC標(biāo)準(zhǔn)給出順序是為了提高數(shù)據(jù)訪問的精確性,以便于串行操作;受文獻(xiàn)[3]中對(duì)并行濾波執(zhí)行的啟發(fā),徹底的打破原先的執(zhí)行順序,本文提出一種優(yōu)化環(huán)路濾波并行算法。
該算法在奇偶邊界并行濾波算法基礎(chǔ)上進(jìn)一步的提高并行粒度:首先從水平角度執(zhí)行,對(duì)一個(gè)16×16塊的全部垂直邊界同時(shí)進(jìn)行濾波;然后從垂直角度執(zhí)行,對(duì)一個(gè)16×16塊的全部水平邊界同時(shí)進(jìn)行濾波。因?yàn)槭窍人胶蟠怪钡膱?zhí)行順序,并不會(huì)對(duì)存儲(chǔ)器的讀寫造成訪問沖突。
在本文提出的并行濾波算法中,以16×16塊為單位進(jìn)行濾波,1個(gè)block對(duì)應(yīng)處理一個(gè)16×16塊;由于從水平角度到垂直角度的濾波順序是串行的,所以每次濾波過程僅并行的處理4條邊界,對(duì)于一個(gè)16×16塊的每條執(zhí)行邊界有16個(gè)像素點(diǎn),為得到更好的并行粒度,為每個(gè)邊界一一對(duì)應(yīng)的分配thread。其thread與邊界點(diǎn)所對(duì)應(yīng)的關(guān)系如圖9。
圖9 邊界濾波中線程和邊界點(diǎn)對(duì)應(yīng)關(guān)系圖
以圖9為例,邊界a、b、c、d子邊界的濾波所分配的64個(gè)線程進(jìn)行處理,當(dāng)完整的一輪濾波執(zhí)行完后,再由同樣的64個(gè)線程對(duì)邊界e、f、g、h子邊界濾波進(jìn)行處理。這樣能保證各個(gè)邊界點(diǎn)之間為線性的一對(duì)一存儲(chǔ)訪問,從而提高讀寫的精準(zhǔn)度。
在GPU上的內(nèi)核函數(shù)線程調(diào)度如下:
for(i=0;i<2;i++){
filter<<
}
在本文算法執(zhí)行前,所需要的參數(shù)已經(jīng)經(jīng)Bs求取模塊處理完成并存放在了GPU的本地存儲(chǔ)器中,因此沒有額外的參數(shù)傳遞時(shí)間損耗。當(dāng)執(zhí)行完全部濾波后,調(diào)用GPU將最終所計(jì)算出的圖像傳回CPU中。由于本文提出的算法完全打破了原有的執(zhí)行順序,因此,最終的圖像結(jié)果可能會(huì)與串行解碼所得的圖像結(jié)果有略微不同。
實(shí)驗(yàn)的運(yùn)行環(huán)境采用的GPU是 NVIDIA GeForce GTX 950顯卡,CPU的型號(hào)為Inter?CoreTMi5-4590處理器,操作系統(tǒng)是 windows 10,編譯環(huán)境為 CUDA8.1。
實(shí)驗(yàn)中,選取了四種不同尺寸的H.264視頻碼流,分別為Foreman_QCIF序列(176*144)、Mobile_625SD序列(720*576)、Parkrun_720P序列(1280*720)、Tortoise_1080P序列(1920*1280)。在實(shí)驗(yàn)過程中取每個(gè)序列200幀亮度幀進(jìn)行50次實(shí)驗(yàn),計(jì)算平均每幀耗時(shí)。
本文算法、文獻(xiàn)[2]中算法以及FFmpeg算法對(duì)比如圖10所示。
圖10 幀內(nèi)預(yù)測解碼對(duì)比圖
由圖10可知在四種序列下,序列的像素點(diǎn)越多,并行加速效果越明顯。其中本文所提出的幀內(nèi)預(yù)測與文獻(xiàn)[2]中并行幀內(nèi)預(yù)測相比有1.2~1.4倍的加速效果,這是因?yàn)樵诰幋a中去掉了模式3和模式7,使得并行架構(gòu)更緊湊合理;且因加入了分支判斷,對(duì)圖像質(zhì)量沒有影響。
本文算法、文獻(xiàn)[4]中算法以及FFmpeg算法對(duì)比如圖11所示。
圖11 濾波強(qiáng)度Bs值求取對(duì)比圖
由圖11可知,隨著被處理圖像尺寸的增加,加速效果也隨之提高。本文所提出的對(duì)濾波強(qiáng)度Bs值并行求取算法的優(yōu)化表現(xiàn)出了明顯的效果。雖然原并行算法的加速比已經(jīng)很明顯,本文算法比文獻(xiàn)[4]中并行算法也有1.8~2倍的明顯加速比。
本文算法、文獻(xiàn)[5]中算法以及FFmpeg算法對(duì)比如圖12所示。
圖12 濾波執(zhí)行對(duì)比圖
由圖12可知,本文所提出的對(duì)全并行濾波執(zhí)行算法有很明顯加速的效果,雖然原并行算法的加速比已經(jīng)很明顯,但是經(jīng)過優(yōu)化后的算法比文獻(xiàn)[5]中并行算法也有1.2~1.5倍的明顯加速比。對(duì)比1280×720的parkrun序列,1920×1280的tortoise序列,可以看出尺寸更小的parkrun序列的加速比反而比尺寸更大的tortoise序列更高,這是因?yàn)閜arkrun序列中的運(yùn)動(dòng)過程更多;具體原因是在CPU串行執(zhí)行時(shí)候,所有的邊界處理時(shí)間之和才是環(huán)路濾波所消耗的運(yùn)算時(shí)間,對(duì)運(yùn)動(dòng)越劇烈的圖像序列,所需要的邊界點(diǎn)數(shù)規(guī)模更大。
為了對(duì)最終圖像質(zhì)量進(jìn)行比較分析,本文采用兩種評(píng)價(jià)標(biāo)準(zhǔn)PSNR與SSIM,對(duì)形成的圖像進(jìn)行比較分析。
表1 串并行成像效果對(duì)比
由表1可知,PSNR、SSIM兩種標(biāo)準(zhǔn)中,四種不同尺寸的序列中,僅存在十分微小的差異;所以本文提出的并行濾波算法在有很大加速比的同時(shí),也不會(huì)對(duì)成像效果有很大影響。
本文基于GPU分別提出了一種的幀內(nèi)預(yù)測并行算法與一種濾波器并行算法;幀內(nèi)預(yù)測算法主要對(duì)文獻(xiàn)[1,2]算法進(jìn)行了優(yōu)化,實(shí)驗(yàn)中優(yōu)化后的算法是原算法加速比的1.2~1.4倍,加速效果明顯;本文將濾波器分為兩個(gè)部分,對(duì)于Bs值求取是在文獻(xiàn)[4]基礎(chǔ)上做出了優(yōu)化,對(duì)濾波執(zhí)行在文獻(xiàn)[3]基礎(chǔ)上提出一種全并行算法,使得濾波器加速優(yōu)勢更明顯。通過實(shí)驗(yàn)可以看出GPU非常適合進(jìn)行視頻解碼處理。