周建政,劉華平
(1.天格科技(杭州)有限公司,浙江 杭州 310011;2.上海格譜信息科技有限公司,上海 200072)
H.265同H.264/AVC一樣采用的變換算法是基于宏塊的DCT算法,因此,當(dāng)壓縮率很高時(shí),就會(huì)導(dǎo)致嚴(yán)重的塊效應(yīng)。為了提高主觀和客觀視覺效果,H.265中同樣引入去塊效應(yīng)濾波系統(tǒng),可以很好地消除塊效應(yīng)的影響,并且濾波后的幀可用于后續(xù)幀的運(yùn)動(dòng)補(bǔ)償預(yù)測(cè),從而避免了由于虛假邊界積累誤差而導(dǎo)致的圖像質(zhì)量進(jìn)一步降低,但同時(shí),去塊效應(yīng)濾波系統(tǒng)也帶來了大量的復(fù)雜運(yùn)算[1-2],特別是大分辨率視頻,去塊效應(yīng)相關(guān)參數(shù)都是跨越多行,這樣導(dǎo)致對(duì)數(shù)據(jù)讀寫內(nèi)存Cache Miss,對(duì)于1 080p視頻去塊效應(yīng)濾波計(jì)算量占據(jù)H.265解碼器25%~30%,因此去塊效應(yīng)濾波系統(tǒng)成為H.265在實(shí)時(shí)應(yīng)用中的主要瓶頸之一。
近一年,移動(dòng)終端設(shè)備CPU技術(shù)朝高主頻,多核和低功耗方向發(fā)展,這就為大視頻在移動(dòng)設(shè)備上的流暢播放提供硬件資源基礎(chǔ)。H.265是最新一代視頻編解碼器技術(shù),其市場(chǎng)應(yīng)用響應(yīng)相應(yīng)比H.264要快速,目前互聯(lián)上就有很多H.265壓制的視頻源,H.265解碼性能優(yōu)化就成為一件急迫的事。
本文先對(duì)H.265標(biāo)準(zhǔn)中的去方塊濾波進(jìn)行詳細(xì)的介紹,分析在HM14.0現(xiàn)在的架構(gòu)中不能并行化處理的原因,然后對(duì)HM14.0的軟件結(jié)構(gòu)進(jìn)行設(shè)計(jì),讓H.265去塊效應(yīng)濾波能做到基于CU行并行處理,這樣就可以充分利用移動(dòng)終端多核并行處理,大大提升解碼器的速度。在每個(gè)宏塊行內(nèi)每個(gè)像素行,進(jìn)一步用ARMv7 SIMD匯編指令去優(yōu)化,最后給出性能優(yōu)化前后的數(shù)據(jù)。
H.265去方塊效應(yīng)濾波采用與H.264/AVC類似的方法,但H.265邊界情況比H.264要復(fù)雜,所以考慮所有邊界條件的情況下,H.265整體去方塊效應(yīng)濾波復(fù)雜度比H.264高一點(diǎn)。H.265去方塊效應(yīng)濾波處理單元是CU,其處理順序與解碼過程一致,所有垂直邊緣先做濾波處理,然后再做所有水平邊緣的濾波處理。去方塊效應(yīng)濾波流程圖如圖1所示[2-4]。
圖1 去方塊效應(yīng)濾波流程圖
去方塊效應(yīng)濾波涉及到3類邊界,分別是編碼單元邊界(CU boundary)、變換單元邊界(TU boundary)和預(yù)測(cè)單元邊界(PU boundary),這些邊界都會(huì)直接影響到去方塊效應(yīng)濾波器的操作。例如有時(shí)CU的邊界與PU或TU的邊界重疊,邊界確定后就是計(jì)算邊界的強(qiáng)度,邊界的強(qiáng)度直接影響邊界濾波的選擇。目前這些所有的邊界信息解析和判斷都是嵌入在解碼過程中,往往要整個(gè)幀解碼完成才能知道各個(gè)邊界的消息,這樣導(dǎo)致去方塊效應(yīng)濾波只能放到最后完整的去做,不利于幀內(nèi)宏塊行的并行操作。邊界強(qiáng)度的計(jì)算流程圖如圖2所示。
引入2個(gè)閾值變量β和tC,這2個(gè)變量結(jié)合邊界相鄰的像素決定了濾波器的關(guān)開,強(qiáng)弱濾波器的選擇以及弱濾波處理。β和tC的選擇是根據(jù)相鄰像素,然后查閱參數(shù)文獻(xiàn)[4]。濾波器開關(guān)和強(qiáng)弱判斷涉及到4行邊界左右6個(gè)像素,如圖3所示。
圖2 邊界強(qiáng)度計(jì)算流程圖
圖3 框中的像素用于濾波關(guān)開和強(qiáng)弱選擇(截圖)
H.265去塊效應(yīng)濾波分強(qiáng)濾波和弱濾波,強(qiáng)濾波器會(huì)用到邊界相鄰塊各4個(gè)像素值,通過如下方程式去更新邊界相鄰塊各3個(gè)像素值。方程式如下
式(1)~(3)是強(qiáng)濾波更新垂直邊界左邊或水平邊界上方相鄰3個(gè)像素值,式(4)~(6)是強(qiáng)濾波更新垂直邊界右邊或水平邊界下方相鄰3個(gè)像素值。弱濾波器會(huì)用到邊界相鄰塊各3個(gè)像素值,通過如下方程式去更新邊界相鄰塊各2個(gè)像素值。方程式如下
式(7)、(8)是弱濾波更新垂直邊界左邊或水平邊界上方相鄰二個(gè)像素值,式(9)、(10)弱濾波更新垂直邊界右邊或水平邊界下方相鄰二個(gè)像素值。
其中
圖4是HM14.0編解碼器流程,以LCU為單元,采用遞歸的方式把整個(gè)個(gè)幀解碼出來,然后整幀來進(jìn)行后處理,包括去塊效應(yīng)濾波和自適應(yīng)校點(diǎn)補(bǔ)償處理。
圖4 H.265算法框架圖
這種結(jié)構(gòu)導(dǎo)致無法做幀內(nèi)基于LCU行的并行,去塊效應(yīng)濾波器沒有基于LCU行并行,也會(huì)影響到自適應(yīng)校點(diǎn)補(bǔ)償(SAO)并行處理。去塊效應(yīng)濾波配合整個(gè)解碼器的幀內(nèi)按LCU行的并行處理進(jìn)行修改,處理過程流程圖如圖5所示。
圖5 解碼器流程圖
HM14.0結(jié)構(gòu)就是先把一幀數(shù)據(jù)全部解碼出來,然后整幀進(jìn)入后處理模塊,這個(gè)缺點(diǎn)是不能基于LCU行的并行處理,而基于LCU并行化處理,當(dāng)一個(gè)線程在解碼后面的LCU單元時(shí),另一個(gè)線程就能處理已經(jīng)做好準(zhǔn)備LCU行的去塊效應(yīng)濾波和SAO。基于LCU并行化處理過程說明:解碼器仍然是以LCU為單元進(jìn)行解碼,同時(shí)建立以4×4為最小塊的結(jié)構(gòu)數(shù)組用于存放當(dāng)前最小處理宏塊的邊界情況。去塊效應(yīng)濾波較解碼器要延遲一LCU行去做濾波處理,例如解碼器第一LCU行解碼完成,不會(huì)去做去塊效應(yīng)濾波,因?yàn)闀?huì)影響第二行處理過程。當(dāng)?shù)诙﨤CU解碼完成后才進(jìn)行去塊效應(yīng)處理。幀內(nèi)基于LCU并行去做去塊濾波要注意保留一些數(shù)據(jù),例如幀間預(yù)測(cè)就要保留一行LCU的像素?cái)?shù)據(jù),以備幀間預(yù)測(cè)使用。
ARM Cortex系列的處理器,支持并行的高效指令集(NEON),Cortex-A系列增加了16個(gè)128 bit的Q寄存器單元,這些寄存器單元可以靈活當(dāng)作 8 bit,16 bit,32 bit,64 bit和128 bit單元使用,NEON寄存器結(jié)構(gòu)如圖6所示。
與128 bit寄存器配對(duì),NEON指令集有很多并行的加、減、乘和相關(guān)的邏輯指令,例如處理8 bit像素,通過NEON指令集可以一次性處理16個(gè)像素。通過SIMD指令優(yōu)化,并行的處理指令數(shù)就會(huì)是原來的1/16。
圖6 NEON寄存器結(jié)構(gòu)圖
從本文的第二部分詳細(xì)分析了H.265去塊效應(yīng)濾波器,例如水平強(qiáng)濾波器會(huì)用到邊界上下各4個(gè)像素點(diǎn),然后通過一系列的并行運(yùn)算后,最后更新邊界上下各3個(gè)像素點(diǎn),這種結(jié)構(gòu)很利于應(yīng)用NEON并行指令,其數(shù)據(jù)讀取和存儲(chǔ)如下:
vld1.32 {d6[0]},[r4],r1 @p10,p20,p30,p40
vld1.32 {d7[0]},[r4],r1 @p11,p21,p31,p41
vld1.32 {d8[0]},[r4],r1 @p12,p22,p32,p42
vld1.32 {d9[0]},[r4],r1 @p13,p23,p33,p43
vld1.32 {d10[0]},[r4],r1 @p14,p24,p34,p44
vld1.32 {d11[0]},[r4],r1 @p15,p25,p35,p45
vld1.32 {d12[0]},[r4],r1 @p16,p26,p36,p46
vld1.32 {d13[0]},[r4] @p17,p27,p37,p47
這幾條指令就把4行,每行左右各4個(gè)共8個(gè)像素都取到寄存器中,接下來的所有運(yùn)行都是一次處理4個(gè)像素,最后處理完用vst1.32一次存儲(chǔ)4個(gè)像素,這樣4個(gè)像素并行處理,所有的指令處理周期數(shù)是原來的1/4。
進(jìn)一步優(yōu)化,濾波器的關(guān)開和強(qiáng)弱是基于4行像素內(nèi)容去判斷,這樣的結(jié)果是4×4的塊間可能去塊效應(yīng)濾波器的強(qiáng)弱不致,如果在上面加個(gè)判斷,如相鄰的8行像素都是使用強(qiáng)濾波或都是弱濾波,這樣就可以將上面的并行處理擴(kuò)展到基于8行8個(gè)像素并行處理,這樣處理速度會(huì)提升8倍。
H.265主要應(yīng)用場(chǎng)景是大視頻和高幀率,算法復(fù)雜增加,同時(shí)處理數(shù)據(jù)量多,這樣就要充分利用處理器多核并行去處理數(shù)據(jù)。本文就是闡述如何將原來在視頻幀全部解碼出來后整幀做去塊效應(yīng)濾波處理,通過解碼處理過程中,并行化處理得到各個(gè)處理單元的邊界信息,實(shí)現(xiàn)了幀內(nèi)基于宏塊行級(jí)的并行化處理。同時(shí)針對(duì)ARM平臺(tái)進(jìn)行了SIMD匯編優(yōu)化,使得去塊效應(yīng)濾波在整個(gè)解碼器算法復(fù)雜度降低了一半,大大提升了解碼器處理能力。圖7是優(yōu)化前后,去塊效應(yīng)濾波在整個(gè)解碼器復(fù)雜度的比例優(yōu)化前后比較圖。
圖7 去塊效應(yīng)濾波占解碼器時(shí)間比例
測(cè)試序列覆蓋H.265 ClassA~ClassE,分析統(tǒng)計(jì)去塊效應(yīng)濾波在對(duì)應(yīng)序列中占整個(gè)解碼器優(yōu)化前后比倒的變化。
從圖7可以看出,并行化優(yōu)化去塊效應(yīng)濾波性能能整體提升解碼器近13%的性能,使得解碼器能在移動(dòng)設(shè)備上能實(shí)現(xiàn)更大分辨率的視頻播放。
[1]FRANK B,BENJAMIN B,KARSTEN S,et al.HEVC complexity and implementation analysis[J].IEEE Trans.Circuits and Systems for Video Technoligy,2012,22(12):1685-1696.
[2] 唐添,王進(jìn),劉運(yùn)強(qiáng),等.去塊效應(yīng)方法的研究[J].電視技術(shù),2008,32(2):16-18.
[3] SULLIVAN G J,OHM J R,HAN W J,et al.Overview of the high efficiency video coding(HEVC)standard[J].IEEE Trans.Circuits and System for Video Technology,2012,22(12):1649-1668.
[4] Recommendation ITU-T H.265,Audiovisual and multimedia systems,infrastructure of audiovisual services coding of moving vide,high efficiency video coding[S].2013.
[5]HAN W J,OHM J R,SULLIVAN G J,et al.High efficiency video coding(HEVC)text specification draft 6[C]//Proc.8th JCT-VC Meeting.San Jose,CA,USA:[s.n.],2012:56-59.
[6] Cortex-A8 Technical Reference Manual[EB/OL].[2014-09-28].http://www.docin.com/p-97569305.htm l.