, ,
(1.電子科技大學 航空航天學院,成都 611731; 2.國家新聞出版廣電總局五四二臺,北京 100866)
2003年,ITU(International Telecommunication Union)與ISO (International Organization for Standardization)組成的JVT(Joint Video Team)制定了H.264/AVC標準。其中,為了在保證其圖像質量的同時盡可能降低碼率,H.264/AVC標準采用了的許多新創(chuàng)的編解碼技術,如改進的去塊效應濾波器、塊的多種劃分方式、像素運動估計(幀間預測)以及根據塊劃分的多模式幀內預測等;但是,H.264解碼時的計算復雜度是MP4的2.2~4.1倍,并且H.264各個對應部分的計算量比H.263均高出了1.2~2.1倍。
在H.264/AVC標準中,多模式幀內預測與去塊效應濾波器兩種技術是保證碼率與圖像質量的關鍵。在多模式幀內預測技術中,率失真優(yōu)化是幀內預測的本質;為了更好的協(xié)調碼率與失真,H.264/AVC標準對所有預測模式進行計算,選擇率失真代價最小的模式作為最優(yōu)解。其中,文獻[1]提出了9種不同處理順序;采用多級流水線方式,改變預測塊順序,使不相關的塊可以并行執(zhí)行,實現(xiàn)幀內預測模塊的并行執(zhí)行,但是并沒有達到最好的效果;為了提高并行效率,文獻[2]在其基礎上改變了預測模式,這雖然減少了處理時間,但是所對應的影響則是很大程度上降低了圖像質量。
而對于H.264/AVC標準中的濾波器,其主要的作用,是去除了編碼過程中所產生的方塊效應。其中,對于去塊濾波器的并行實現(xiàn),文獻[3]直接提出了一種基于CUDA的并行實現(xiàn)方法,文獻[4-5]提出了通過局部減少分支條件來提高濾波器效率。上述兩種算法在一定程度上提高了效率,但在流程上并沒有進行足夠的改進,且在執(zhí)行順序上沒有很好的突破。
本文主要研究H.264/AVC標準中的幀內預測與濾波器模塊的并行算法,在文獻[2]基礎上對幀內預測模塊進行優(yōu)化處理,對濾波器模塊提出新的Bs值并行求取算法,另外在文獻[3]的所提出的奇偶邊界執(zhí)行算法的基礎上提出一種新的濾波執(zhí)行并行算法。
FFmpeg(Fast Forward Mpeg)使用的H.264解碼器,主要通過對幀一級的圖像解碼來實現(xiàn)多線程并行工作:
1)從網絡抽象層(Network Abstraction Layer (NAL))獲取碼流數據,將其放入解碼和重排序模塊進行解析,可得一系列量化系數X,繼續(xù)將獲得的數據進行反量化與反變換處理,得殘差數據D。
2)從NAL獲取的碼流,通過解析能得出幀內預測模式與幀間預測模式中所需要的MV等信息,將此信息作為幀內預測或幀間運動補償參考數據進行幀內/幀間預測。
3)由殘差數據與預測數據相結合得到重建的圖像數據,因為圖像中存在塊效應,所以需要通過濾波器進行濾波,形成真正的解碼幀,此解碼幀也作為之后解碼用的參考幀。
本文僅對幀內預測與濾波器做并行化處理,因此其框架如圖1所示。

圖1 解碼框架圖
在H.264/AVC標準中,當圖像中各個宏塊經過反量化與反變換之后,所形成的圖像根據規(guī)則被分為I幀與P幀,I幀是指在編碼過程中,預測所采用的是幀內預測,P幀是指在編碼過程中,預測所采用的是幀間預測(運動估計)。而在本文的框架中,主要對I幀進行討論。
GPU中處理的主要包括兩個部分,其中,“處理部分1”為幀內預測部分;“處理部分2”為濾波器部分。具體處理流程如圖2所示。

圖2 運行流程圖
如圖2所示,當前幀為I幀的時候才通過CUDA調用GPU進行幀內預測解碼,否則當前幀為P幀,調用CPU進行幀間預測(運動估計)解碼。當幀內預測與幀間預測都執(zhí)行完成后,將兩個模塊的數據統(tǒng)一傳到濾波器模塊,調用GPU進行濾波模塊的處理。
在H.264/AVC標準中,幀內預測主要包括四種方式:PCM預測方式、4×4亮度塊的幀內預測方式、16×16亮度塊的幀內預測方式、8×8色度塊的幀內預測方式。
本文主要研究四種模式中的4×4亮度塊的幀內預測方式,其傳統(tǒng)處理順序如圖3所示。由圖3可見,此方式以一個16×16亮度塊為單位,其中MB0、MB1、MB2、MB3、MB4為16×16亮度塊,每個16×16像素的宏塊有16個4×4像素的子宏塊,單個16×16亮度塊內4×4像素子宏塊的處理順序如圖中字母順序所標示。

圖3 16×16亮度宏塊圖
16×16像素的宏塊MB4中子宏塊的幀內預測所依賴的全部子宏塊分別為:塊1的j、k、o、p子塊;塊3的g、m、n、p子塊;塊0的p子塊;塊2的j子塊。以塊4的16個4×4子宏塊中,需要其他16×16塊做支持的子塊為例:a子塊的預測需要塊0標記為p子塊,塊1標記為j、k子塊,塊3標記為g的子塊;g子塊的預測需要塊4標記為f子塊,塊1標記為p子塊,塊2標記為j的子塊;j子塊的預測需要塊3標記為p子塊,塊4中標記為d、i的子塊。而對于16×16宏塊的執(zhí)行的順序為0~4,每一個16×16宏塊中的4×4子塊的執(zhí)行順序則是為a~p。
若直接將傳統(tǒng)的幀內預測解碼順序在GPU上實現(xiàn),那么傳統(tǒng)模式所采用的固定順序會導致GPU的運行效率極低。為了解決該問題,文獻[1]中提到了9種更改的處理順序,文獻[2]在其基礎上從中選擇一種處理順序并在其基礎上提出一種流水線解碼方案,該方案的并行處理順序如圖4,其中數字為并行處理順序,數字相同的則是可以被并行處理的子塊。

圖4 文獻[2]中4×4塊處理順序圖
該方案在原先基礎上將4×4塊的處理順序進行了較好的并行化處理,對一個16×16的宏塊,總計需要10個計算單個子塊的時間;本文在文獻[1-2]基礎上,提出了一種以4×4亮度塊為最小單位、去除模式3與模式7的并行優(yōu)化方案,如圖5,圖中數字仍為并行處理順序,數字相同的是可以被并行處理的子塊;每行的間隔從2減少為1。

圖5 本文4×4塊處理順序圖
如圖5所示,本文算法的并行粒度進一步提高,使得每行的宏塊都能流水線的進行并行處理,對于一幀內的16×16塊中屬于同一行的4×4塊進行順序處理,對一個16×16宏塊,總計僅需要7個計算單個子塊的時間。
假定一幀圖像的寬為W、高為H;對于所處理的塊,其基礎單位為 4×4像素塊。使用本文所提出的執(zhí)行順序,每一幀I幀至少需要GPU對其進行M次運算;而N是該執(zhí)行順序所能達到最大理論并行粒度。M、N計算方式如式(1)~(2):
M=(H/1-4)+W/4
(1)
N=min(W/4,2×(H/4))
(2)
每次運算所能同時進行的宏塊數量由list[i]表示。list[i]計算方式如式(3),其上限即為N:

(3)
因為編碼階段仍然會將模式3和模式7作為預測模式,若在解碼階段直接去除模式3與模式7會使得最終的圖像質量受到影響。因此,為了保證最終圖像質量,本文在進行幀內預測并行處理的同時,選擇添加一個分支的方式,此分支可以在基本不影響并行粒度的同時,保證模式3和模式7的正常解碼,其處理流程如圖6。

圖6 處理順序分支流程圖
如圖6所示,該分支主要作用是為了防止模式3和模式7的出現(xiàn),等待前一個線程的宏塊處理,使得當前模塊所需要的左上模塊得以被處理完成。
1)在H.264/AVC標準中,圖像邊界分為虛假邊界、真實邊界,根據式(4)~(6)辨別圖像邊界偉哪種邊界。其中,通過查QP表得出α和β的值。真實邊界是指所求值不滿足以下條件;虛假邊界是值滿足以下條件;濾波器將對存在虛假邊界的宏塊進行濾波。
|p0-q0|<α
(4)
|p1-q0|<β
(5)
|q1-q0|<β
(6)
2)濾波強度Bs值是根據圖7所描述規(guī)則來求取。在濾波的過程中,分別會對圖像進行水平濾波、垂直濾波,因此要分別求取水平邊界與垂直邊界的Bs值。
Bs值的求取規(guī)則如圖7所示:

圖7 Bs值確定規(guī)則圖
3)虛假邊界進行濾波操作,其中Bs值越大,濾波越強。
3.2.1 Bs值的并行求取
濾波強度Bs值求取的過程是以16×16塊為計算單位,一幀圖像的邊數為(W/H×H/16)×8=W×H/32條,共有W×H/32×16=W×H/2個邊界點。這些邊界點求取所需的值已經在之前的過程中獲得,因此沒有相關性,可以并行求取。
在濾波強度Bs值的求取過程中,總計需要的參數為:熵解碼所解出的CBP值、運動矢量MV、編碼過程中的整數變換矩陣系數、反變換后所得殘差數據、幀內預測模式等;在熵解碼中,CBP值與整數變換矩陣系數已經被轉換為CBP_BLK值。
本文將這些參數存放在全局存儲器中,不需要額外調用CPU相GPU傳遞這些參數;另外需要額外處理的參數為CBP_BLK數組,將其傳入到GPU內的紋理存儲器中,以便于減少讀寫訪問;同時給GPU分配一定大小的空間用以存放各個邊界點的濾波強度Bs值,以便于濾波執(zhí)行時的直接調用。
在GPU中的每個block所處理的最小單位為16×16像素塊,即1個block需對128個邊界點進行處理;本文為每個點分配一一對應的thread進行計算,以保證讀寫的效率與精準度。線程調度方式為:
grid(W/16,H/16),block(16,4,2)
即將一幀分為W/16×H/16個block,每個block負責16×4×2個thread。
3.2.2 優(yōu)化的并行求取算法
對于同一個4×4像素塊中的運動矢量MV、幀內預測模式、反變換后所得殘差數據以及CBP_BLK等參數是一樣的,因此根據同樣參數所計算出的Bs值也應該相同。基于該情況,本文對進一步優(yōu)化Bs值求取算法,其所需的存儲空間與時間都為原來的1/4,計算效率為原來的4倍。優(yōu)化后的線程調度為:
grid(W/16,H/16),block(4,4,2)
即將一幀分為W/16×H/16個block,每個block負責4×4×2個thread。算法執(zhí)行時,僅需要對同一個4×4像素塊的多個邊界點進行一次計算,所計算出的Bs值就是該宏塊所有全部邊界點的濾波強度Bs值。
對于傳統(tǒng)的濾波執(zhí)行如圖8所示,濾波首先對從水平方向對各個垂直邊界進行濾波,執(zhí)行的順序從1~4;然后從垂直方向對各個水平邊界執(zhí)行濾波,執(zhí)行順序為5~8。

圖8 傳統(tǒng)濾波執(zhí)行順序圖
從H.264/AVC標準中的濾波原理所知,塊與塊間的濾波是沒有關聯(lián)性的,其所需要的像素點都已經在之前的過程中被計算出,官方所給出的H.264/AVC標準給出順序是為了提高數據訪問的精確性,以便于串行操作;受文獻[3]中對并行濾波執(zhí)行的啟發(fā),徹底的打破原先的執(zhí)行順序,本文提出一種優(yōu)化環(huán)路濾波并行算法。
該算法在奇偶邊界并行濾波算法基礎上進一步的提高并行粒度:首先從水平角度執(zhí)行,對一個16×16塊的全部垂直邊界同時進行濾波;然后從垂直角度執(zhí)行,對一個16×16塊的全部水平邊界同時進行濾波。因為是先水平后垂直的執(zhí)行順序,并不會對存儲器的讀寫造成訪問沖突。
在本文提出的并行濾波算法中,以16×16塊為單位進行濾波,1個block對應處理一個16×16塊;由于從水平角度到垂直角度的濾波順序是串行的,所以每次濾波過程僅并行的處理4條邊界,對于一個16×16塊的每條執(zhí)行邊界有16個像素點,為得到更好的并行粒度,為每個邊界一一對應的分配thread。其thread與邊界點所對應的關系如圖9。

圖9 邊界濾波中線程和邊界點對應關系圖
以圖9為例,邊界a、b、c、d子邊界的濾波所分配的64個線程進行處理,當完整的一輪濾波執(zhí)行完后,再由同樣的64個線程對邊界e、f、g、h子邊界濾波進行處理。這樣能保證各個邊界點之間為線性的一對一存儲訪問,從而提高讀寫的精準度。
在GPU上的內核函數線程調度如下:
for(i=0;i<2;i++){
filter<<
}
在本文算法執(zhí)行前,所需要的參數已經經Bs求取模塊處理完成并存放在了GPU的本地存儲器中,因此沒有額外的參數傳遞時間損耗。當執(zhí)行完全部濾波后,調用GPU將最終所計算出的圖像傳回CPU中。由于本文提出的算法完全打破了原有的執(zhí)行順序,因此,最終的圖像結果可能會與串行解碼所得的圖像結果有略微不同。
實驗的運行環(huán)境采用的GPU是 NVIDIA GeForce GTX 950顯卡,CPU的型號為Inter?CoreTMi5-4590處理器,操作系統(tǒng)是 windows 10,編譯環(huán)境為 CUDA8.1。
實驗中,選取了四種不同尺寸的H.264視頻碼流,分別為Foreman_QCIF序列(176*144)、Mobile_625SD序列(720*576)、Parkrun_720P序列(1280*720)、Tortoise_1080P序列(1920*1280)。在實驗過程中取每個序列200幀亮度幀進行50次實驗,計算平均每幀耗時。
本文算法、文獻[2]中算法以及FFmpeg算法對比如圖10所示。

圖10 幀內預測解碼對比圖
由圖10可知在四種序列下,序列的像素點越多,并行加速效果越明顯。其中本文所提出的幀內預測與文獻[2]中并行幀內預測相比有1.2~1.4倍的加速效果,這是因為在編碼中去掉了模式3和模式7,使得并行架構更緊湊合理;且因加入了分支判斷,對圖像質量沒有影響。
本文算法、文獻[4]中算法以及FFmpeg算法對比如圖11所示。

圖11 濾波強度Bs值求取對比圖
由圖11可知,隨著被處理圖像尺寸的增加,加速效果也隨之提高。本文所提出的對濾波強度Bs值并行求取算法的優(yōu)化表現(xiàn)出了明顯的效果。雖然原并行算法的加速比已經很明顯,本文算法比文獻[4]中并行算法也有1.8~2倍的明顯加速比。
本文算法、文獻[5]中算法以及FFmpeg算法對比如圖12所示。

圖12 濾波執(zhí)行對比圖
由圖12可知,本文所提出的對全并行濾波執(zhí)行算法有很明顯加速的效果,雖然原并行算法的加速比已經很明顯,但是經過優(yōu)化后的算法比文獻[5]中并行算法也有1.2~1.5倍的明顯加速比。對比1280×720的parkrun序列,1920×1280的tortoise序列,可以看出尺寸更小的parkrun序列的加速比反而比尺寸更大的tortoise序列更高,這是因為parkrun序列中的運動過程更多;具體原因是在CPU串行執(zhí)行時候,所有的邊界處理時間之和才是環(huán)路濾波所消耗的運算時間,對運動越劇烈的圖像序列,所需要的邊界點數規(guī)模更大。
為了對最終圖像質量進行比較分析,本文采用兩種評價標準PSNR與SSIM,對形成的圖像進行比較分析。

表1 串并行成像效果對比
由表1可知,PSNR、SSIM兩種標準中,四種不同尺寸的序列中,僅存在十分微小的差異;所以本文提出的并行濾波算法在有很大加速比的同時,也不會對成像效果有很大影響。
本文基于GPU分別提出了一種的幀內預測并行算法與一種濾波器并行算法;幀內預測算法主要對文獻[1,2]算法進行了優(yōu)化,實驗中優(yōu)化后的算法是原算法加速比的1.2~1.4倍,加速效果明顯;本文將濾波器分為兩個部分,對于Bs值求取是在文獻[4]基礎上做出了優(yōu)化,對濾波執(zhí)行在文獻[3]基礎上提出一種全并行算法,使得濾波器加速優(yōu)勢更明顯。通過實驗可以看出GPU非常適合進行視頻解碼處理。