付永慶,姜靈靈
(哈爾濱工程大學(xué)信息與通信工程學(xué)院,黑龍江 哈爾濱 150001)
責(zé)任編輯:時(shí) 雯
隨著因特網(wǎng)和電子技術(shù)的迅猛發(fā)展,視訊業(yè)務(wù)對(duì)視頻的傳輸速度和播放質(zhì)量的要求也在不斷提升,在已有視頻編碼標(biāo)準(zhǔn)中,新一代視頻編碼標(biāo)準(zhǔn)H.264/AVC因其具有優(yōu)異的解壓縮功能和良好的網(wǎng)絡(luò)親和性而受到歡迎。但H.264的優(yōu)越性能是以算法復(fù)雜度為代價(jià)換取的,據(jù)統(tǒng)計(jì),H.264解碼復(fù)雜度相當(dāng)于H.263的2.5倍,大約是MPEG-2的2~3倍。這種情況下,處理器的計(jì)算能力和解碼速度成為了視頻編解碼應(yīng)用的瓶頸。
目前已有的文獻(xiàn)多致力于H.264解碼算法的軟件優(yōu)化和研究。文獻(xiàn)[1]給出了一種新型基于DSP的H.264解碼器的軟件優(yōu)化,文獻(xiàn)[2]基于影響H.264解碼速度的因素,提出了基于Trimedia DSP平臺(tái)的優(yōu)化方案,文獻(xiàn)[3]研究了H.264在DSP多核平臺(tái)的上的并行性。而基于FPGA的H.264解碼核整體實(shí)現(xiàn)方案的研究尚不多見。局限于C語言的串行執(zhí)行特性,用DSP等純軟件方案實(shí)時(shí)完成H.264解碼的運(yùn)算比較困難,特別是對(duì)于高清視頻很難達(dá)到理想解碼效果,而擁有高速度及并行處理能力的FPGA能很好滿足實(shí)時(shí)性需求?;诖?,本文研究了基于FPGA的H.264解碼核的實(shí)現(xiàn)問題,并給出了一個(gè)具體的實(shí)現(xiàn)方案。同時(shí)提供了相應(yīng)的驗(yàn)證結(jié)果。實(shí)驗(yàn)數(shù)據(jù)顯示本文提出的方法是正確的和有效的。
H.264/AVC并沒有明確規(guī)定編解碼器如何實(shí)現(xiàn),僅規(guī)定了一個(gè)編碼后視頻比特流的句法及解碼方法。H.264編碼通常采用預(yù)測(cè)和變換的混合壓縮法,該編碼流程以宏塊為單位進(jìn)行幀內(nèi)或幀間預(yù)測(cè)處理,然后把預(yù)測(cè)值PRED與當(dāng)前塊相減,產(chǎn)生殘差數(shù)據(jù)塊,之后進(jìn)行塊變換和塊量化,最后將熵編碼后的數(shù)據(jù)與解碼所需頭信息組成一個(gè)壓縮碼流。H.264解碼是編碼流程的逆過程,原理如圖1所示。H.264解碼流由殘差數(shù)據(jù)和預(yù)測(cè)數(shù)據(jù)兩條路徑并行處理。殘差數(shù)據(jù)路徑主要由熵解碼CAVLC和反量化反變換IQIT產(chǎn)生殘差數(shù)據(jù);預(yù)測(cè)數(shù)據(jù)路徑由基于參考像素的幀內(nèi)預(yù)測(cè)(幀間預(yù)測(cè)本文暫未考慮)產(chǎn)生預(yù)測(cè)宏塊。兩條路徑結(jié)果輸出相加構(gòu)成重建圖像,并以該圖像作為下一幀解碼圖像的參考像素進(jìn)行幀內(nèi)預(yù)測(cè)。
為避免傳統(tǒng)浮點(diǎn)型離散余弦變換因解碼端的運(yùn)算精度不足經(jīng)常引起的失配問題[4],H.264采用整數(shù)變換技術(shù),該變換把解碼和量化過程中的乘法合二為一,既減少了解碼的運(yùn)算量,又提高了圖像解壓縮的實(shí)時(shí)性。
圖1 H.264解碼結(jié)構(gòu)圖
根據(jù)整數(shù)變換與反量化過程,H.264在解碼中將逆DCT運(yùn)算中的部分系數(shù)放到反量化中一起處理。與正變換對(duì)應(yīng)的4×4塊像素的逆DCT變換公式為:
式中:Ci為逆變換矩陣;Ei為變換尺度調(diào)整矩陣;a=1/2,b=;Z為逆量化后的結(jié)果,將“Z?Ei”結(jié)合到逆量化的過程中去,根據(jù)當(dāng)前塊類型的不同,H.264的反量化公式可分為3種情況:
1)若當(dāng)前塊是幀內(nèi)16×16預(yù)測(cè)模式的亮度塊時(shí),交流系數(shù)由反量化公式(4)計(jì)算,直流系數(shù)反量化公式為
式中:i,j=0,1,2,3
2)若當(dāng)前塊是色度塊時(shí),交流系數(shù)由反量化公式(4)計(jì)算,直流系數(shù)反量化公式為
式中:i,j=0,1,2,3
3)若當(dāng)前塊是非幀內(nèi)16×16預(yù)測(cè)模式的亮度塊時(shí),不需要考慮直流系數(shù)時(shí)的反量化由公式為
式中:QPy和QPc分別為亮度塊和色度塊的量化參數(shù);WD(i,j)為直流系數(shù)的逆Hadamard變換結(jié)果;Vij是融合在反量化過程中的逆DCT的比例變換系數(shù);Zij為j交流殘差系數(shù)矩陣。相對(duì)應(yīng)于直流系數(shù)的逆Hadamard變換公式為見式(5),其中ZD為直流殘差系數(shù)矩陣
為了提高系統(tǒng)性能和處理速度,本方案在解碼實(shí)現(xiàn)結(jié)構(gòu)上用流水線和模塊并行處理??紤]到CAVLC指令周期占解碼時(shí)間較長[5],將算法從圖2中的虛線處分開用并行處理完成,每當(dāng)虛線右部分的CAVLC完一個(gè)宏塊解碼后,便啟動(dòng)虛線左部IQIT的運(yùn)算,同時(shí)啟動(dòng)CAVLC對(duì)下一宏塊的熵解碼運(yùn)算。各模塊間采用流水線處理,使用握手信號(hào)end_xxx來表征一個(gè)運(yùn)算結(jié)束,使用啟動(dòng)信號(hào)trigger_xxx開始一個(gè)運(yùn)算,因此本方案有增加模塊間處理靈活性的優(yōu)點(diǎn)。
圖2 H.264解碼核實(shí)現(xiàn)結(jié)構(gòu)圖
編碼比特流由一個(gè)個(gè)句法元素為單位依次銜接組成,比特流句法表詳細(xì)的介紹了H.264的句法,指明了在碼流中依次出現(xiàn)的句法元素及它們出現(xiàn)的條件、表示的物理意義、提取描述子等。
句法解析模塊分析和解碼每一個(gè)句法元素,為后續(xù)模塊提供參數(shù)信息,如為IQIT解碼模塊提供當(dāng)前宏塊類型mb_type和量化參數(shù)偏移值mb_qp_delta等。句法解析模塊根據(jù)碼流的分層結(jié)構(gòu),引入有限狀態(tài)機(jī)FSM的處理方法,采用層次分解結(jié)合sub FSM的形式來對(duì)比特流句法進(jìn)行解析。由圖3可見句法解析模塊分6個(gè)層級(jí),且包括13個(gè)sub-FSM。對(duì)于每一個(gè)sub-FSM都是單一的輸入控制,避免了sub-FSM之間的相互轉(zhuǎn)化,減少結(jié)構(gòu)復(fù)雜度。并且可以在每個(gè)sub-FSM內(nèi)部根據(jù)需要自如地改變狀態(tài),而無需考慮句法解析模塊的整體結(jié)構(gòu),因此增加了實(shí)現(xiàn)結(jié)構(gòu)的靈活性和可擴(kuò)張性。
圖3 句法解析層級(jí)分解FSM圖
根據(jù)CAVLC解碼原理[6],本文給出一種新型CAVLC解碼實(shí)現(xiàn)方案,其結(jié)構(gòu)如圖4所示,主要包括NC查表模塊、Trailing_sign模塊、非零系數(shù)幅值Levels模塊、TotalZeros模塊、Run_Before模塊,Data_reorder模塊。由圖4可見,如果當(dāng)前宏塊類型為P_skip,則整個(gè)宏塊不包括任何殘差信息,若當(dāng)前4×4塊的CodedBlockPatter為0,則對(duì)應(yīng)子塊的所有的殘差不被傳送,再者若進(jìn)行NC值查表后,得到非零系數(shù)數(shù)目值TotalCoeffs為0,則沒有必要再進(jìn)一步進(jìn)行CAVLC解碼,以上3種情況可以直接將殘差數(shù)據(jù)設(shè)置為0,其他情況則依次進(jìn)行Trailing_sign,Levels,TotalZeros,Run_Before 解碼。
圖4 CAVLC解碼結(jié)構(gòu)圖
CAVLC的組成模塊都是基于變長表格來進(jìn)行查表的[7],以NC查表獲取非零系數(shù)數(shù)目TotalCoeffs和拖尾系數(shù)數(shù)目TrailingOnes為例,共有4個(gè)變長表格和1個(gè)定長表格可供選擇。對(duì)于變長碼流的查表,已提出的有分組碼表法、二叉樹法、全碼查表法等,基于查表效率和硬件資源消耗的綜合考慮,本文采用改進(jìn)的分組—二叉樹法來解析 ToalCoeffs和 TrailingOnes。
仔細(xì)觀察4個(gè)變長表格和1個(gè)定長表格可發(fā)現(xiàn)大部分碼流都是由若干個(gè)前綴零和由1引導(dǎo)的后綴組成,類似于哥倫布碼流結(jié)構(gòu)。表1給出了NC取值的碼表規(guī)律性,在知道碼流前綴零的個(gè)數(shù)count后,使能相應(yīng)的分組信號(hào)temp++,然后使用狀態(tài)機(jī)state++狀態(tài)轉(zhuǎn)換實(shí)現(xiàn)二叉樹遍歷,解析出非零系數(shù)個(gè)數(shù)和拖尾系數(shù)個(gè)數(shù)。對(duì)于后面非零系數(shù)幅值Levels、最后一個(gè)非零系數(shù)前零的數(shù)目TotalZ-eros、每個(gè)非零系數(shù)前零的個(gè)數(shù)Run_Before[i]的解析都采用該改進(jìn)的分組—二叉樹法。
表1 碼表規(guī)律性
根據(jù)殘差數(shù)據(jù)被編碼的類型,IQIT解碼可分為2個(gè)數(shù)據(jù)路徑:對(duì)路徑1,如果殘差數(shù)據(jù)為Intra16x16_Luma塊或者Chroma塊,則直流系數(shù)需在反量化前做逆Hadamard變換,量化后結(jié)果放到相應(yīng)塊的(0,0)位置上與15個(gè)交流系數(shù)組成1個(gè)4×4塊,之后再做逆DCT變換;對(duì)于路徑2,如果殘差數(shù)據(jù)非Intra16x16_Luma塊和Chroma塊,則需對(duì)所有系數(shù)反量化,然后再進(jìn)行逆DCT變換。
反量化算法主要基于乘法運(yùn)算和移位操作完成,實(shí)現(xiàn)結(jié)構(gòu)見圖5。具體實(shí)現(xiàn)過程為:首先由MUX選擇當(dāng)前塊量化參數(shù)QP(0≤QP≤51);再由Mod6 LUT模塊對(duì)QP取余,其結(jié)果與iq_address、res_dc和res_ac信號(hào)共同用于選擇比例變換系數(shù)Vij(0≤i,j≤3);然后Vij和殘差系數(shù)Wij經(jīng)乘法器lpm_mult算出Yij;此外,還把QP送入模塊Div6 LUT取商,經(jīng)shift_len模塊算出移位長度len;最后把Yij和len送入移位模塊Shift LUT算出量化結(jié)果IQ_output。其中Mod6 LUT和Div6 LUT采用查表方式完成運(yùn)算。該模塊每次處理一列數(shù)據(jù)加快了處理速度,為后續(xù)的逆DCT解碼提供了便利。
圖5 反量化算法實(shí)現(xiàn)結(jié)構(gòu)圖
由2.2節(jié)逆DCT算法原理知,逆Hadamard算法和逆DCT算法在結(jié)構(gòu)上相似,它們的每一維運(yùn)算中都包括4個(gè)輸入和8次數(shù)學(xué)運(yùn)算,不同點(diǎn)僅在系數(shù)上相差1/2,因此可通過引入1個(gè)系數(shù)選擇器來共用相同硬件結(jié)構(gòu);對(duì)于2×2的色度塊,可將二維逆DCT變換合成為一維的4×4塊逆DCT變換來共用同一硬件結(jié)構(gòu)。故本文對(duì)逆DCT變換用信號(hào)IS_Hadamard來確定運(yùn)算結(jié)構(gòu),如果IS_Hadamard=1,則選擇逆Hadamard算法;否則若IS_Hadamard=0,則選擇逆DCT算法;其次通過設(shè)置1D_counter和2D_counter信號(hào)值來選擇相應(yīng)的塊,若1D_counter=4且2D_counter=4,則選擇亮度4×4塊;若1D_counter=1且2D_counte r=0,則選擇2×2的色度塊。在上述運(yùn)算過程中,我們還引入了雙向加法器lpm_add_sub,從而獲得了降低算法復(fù)雜度的效果。
幀內(nèi)預(yù)測(cè)利用宏塊之間的相關(guān)性,根據(jù)鄰近子塊的存在性和在當(dāng)前圖像中的位置,獲取參考像素值A(chǔ)~M,然后由預(yù)測(cè)公式[8]來計(jì)算像素樣點(diǎn)值。其中16×16亮度塊和8×8色度塊的預(yù)測(cè)方式由句法解析模塊的解碼比特流Intra16x16_predmode和Intra_chroma_predmode直接給出,4×4亮度塊的預(yù)測(cè)方式由其相鄰上方塊及左方塊的預(yù)測(cè)方式ModeA和ModeB共同計(jì)算得出[10]。
預(yù)測(cè)方式共有17種,其中4×4亮度塊有9種[9],16×16亮度塊和8×8色度塊各有4種,若針對(duì)每一種預(yù)測(cè)方式都設(shè)計(jì)一種實(shí)現(xiàn)結(jié)構(gòu),勢(shì)必會(huì)增加硬件資源消耗和系統(tǒng)復(fù)雜度。由于17種預(yù)測(cè)方式的運(yùn)算結(jié)構(gòu)基本一樣,都是先求和再進(jìn)行移位運(yùn)算,唯一不同之處是,16×16亮度塊和8×8色度塊的Plane預(yù)測(cè)方式,需在預(yù)測(cè)之前,先算出H,V,a,b,c這5個(gè)變量[10],最后的像素值再根據(jù)下式計(jì)算
圖6為幀內(nèi)預(yù)測(cè)解碼結(jié)構(gòu)圖,加法運(yùn)算由Parallel_add硬件加法器來完成,Is_clip模塊用于完成Plane預(yù)測(cè)方式。每個(gè)周期處理1列像素點(diǎn),4個(gè)周期可完成1個(gè)4×4像素點(diǎn)的預(yù)測(cè),這有助于加快硬件處理速度。
圖6 幀內(nèi)預(yù)測(cè)解碼結(jié)構(gòu)圖
為驗(yàn)證本文提出算法的正確性,在QuartusⅡ7.2版的環(huán)境中,對(duì)用VHDL設(shè)計(jì)的各個(gè)功能模塊及整個(gè)H.264解碼核執(zhí)行了功能仿真,使用的FPGA為StratixⅡ系列的EP2S60F672C5ES。因文章篇幅有限,下面僅給出CAVLC熵解碼器和反量化器的仿真曲線圖及H.264解碼核編譯報(bào)告。
圖7為1個(gè)4×4塊CAVLC解碼仿真圖,輸入為000010001110010111101101的1幀圖像數(shù)據(jù)中5個(gè)句法元素的編碼比特流,解析得到的參數(shù)為ToalCoeffs為5,TrailingOnes為3,Levels為 1 和 3,Total_zeros為 3,Run_before[i]為1,0,0,1,0,解碼數(shù)據(jù)排序?yàn)?0,3,0,1,-1,-1,0,1,0,0,0,0,0,0,0,0。
圖7 CAVLC解碼器仿真圖(截圖)
圖8為反量化器波形仿真圖,其中trigger_quant為反量化模塊使能信號(hào),高電平有效,res_ac和res_dc為交直流復(fù)位信號(hào),高電平有效,qp為量化參數(shù),qp_ref為qp取商結(jié)果,qp_rem為qp取余結(jié)構(gòu),data0~data3是前面CAVLC解碼器輸出的4×4殘差數(shù)矩陣,m0~m3為相對(duì)應(yīng)的比例變換系數(shù)Vij,dataout0~dataout3為反量化器的量化輸出。
圖8 反量化器波形仿真圖(截圖)
H.264解碼核編譯報(bào)告由表2所示。本文提出的H.264硬件解碼核采用改進(jìn)的分組—二叉樹法進(jìn)行變長碼表的查找,最大程度簡化了反量化、逆DCT和幀內(nèi)預(yù)測(cè)解碼實(shí)現(xiàn)結(jié)構(gòu),因模塊之間采取了流水線和并行處理方式,在硬件資源消耗和處理速度上與傳統(tǒng)未改進(jìn)的硬件實(shí)現(xiàn)方法相比都有很大的改進(jìn),結(jié)果也表明了該H.264解碼核設(shè)計(jì)的正確性和實(shí)用性。
表2 H.264解碼編譯報(bào)告
針對(duì)H.264解碼復(fù)雜度高的問題,從提高解碼速度和節(jié)省硬件資源兩方面來權(quán)衡考慮,給出了基于FPGA的H.264解碼核,并詳細(xì)介紹了其設(shè)計(jì)和實(shí)現(xiàn)方法,最后給出了基于FPGA的功能驗(yàn)證和與傳統(tǒng)法的性能對(duì)比。實(shí)驗(yàn)結(jié)果表明了設(shè)計(jì)的正確性,同時(shí)也顯示其在性能和解碼效率上與傳統(tǒng)法相比有較大幅度的提高。
[1]任李悅,唐寧,滕舟.基于H.264解碼器的軟件優(yōu)化[J].電子設(shè)計(jì)工程,2009,17(12):104-108.
[2]林冰,馮艷,李學(xué)明.基于Trimedia DSP的H.264解碼算法優(yōu)化[J].計(jì)算機(jī)工程與應(yīng)用,2005,31:41-45.
[3]奚杰,陳杰,劉建,等.H.264在多核平臺(tái)上的并行性分析[J].哈爾濱工程大學(xué)學(xué)報(bào),2010,31(6):736-742.
[4]曹偉,洪琪,侯慧,等.一種用于H.264編解碼的新型高效可重構(gòu)多變換 VLSI結(jié)構(gòu)[J]. 電子學(xué)報(bào),2009,37(4):675-674.
[5]郭倩,陳耀武.基于功能模塊的H.264并行解碼算法[J].計(jì)算機(jī)工程,2010,36(23):231-233.
[6]CHEN Guanghua,HU Dengji,ZHANG Jinyi.Efficient VLSI architecture of CAVLC decoder with power optimized[J].上海大學(xué)學(xué)報(bào):英文版,2009,13(6):462-465.
[7]GUO Hui,F(xiàn)U Yongqing.An improved CAVLC entropy encoder of H.264/AVC and FPGA implementation[J].Key Engineering Materials,2011,5:241-246.
[8]畢厚杰,王健.新一代視頻壓縮編碼標(biāo)準(zhǔn)——H.264/AVC[M].2版.北京:人民郵電出版社,2009.
[9]馮杰,陳耀武.基于H.264 I幀編碼的塊邊緣模式特征提取算法[J].華南理工大學(xué)學(xué)報(bào):自然科學(xué)版,2010,38(2):126-129.
[10]ISO/IEC 14496-10.draft ITU-T Recommendation and finaldraftinternational standard of joint video specification(ITU-T Rec.H.264/AVC)[S].2002.