付永慶,姜靈靈
(哈爾濱工程大學信息與通信工程學院,黑龍江 哈爾濱 150001)
責任編輯:時 雯
隨著因特網和電子技術的迅猛發展,視訊業務對視頻的傳輸速度和播放質量的要求也在不斷提升,在已有視頻編碼標準中,新一代視頻編碼標準H.264/AVC因其具有優異的解壓縮功能和良好的網絡親和性而受到歡迎。但H.264的優越性能是以算法復雜度為代價換取的,據統計,H.264解碼復雜度相當于H.263的2.5倍,大約是MPEG-2的2~3倍。這種情況下,處理器的計算能力和解碼速度成為了視頻編解碼應用的瓶頸。
目前已有的文獻多致力于H.264解碼算法的軟件優化和研究。文獻[1]給出了一種新型基于DSP的H.264解碼器的軟件優化,文獻[2]基于影響H.264解碼速度的因素,提出了基于Trimedia DSP平臺的優化方案,文獻[3]研究了H.264在DSP多核平臺的上的并行性。而基于FPGA的H.264解碼核整體實現方案的研究尚不多見。局限于C語言的串行執行特性,用DSP等純軟件方案實時完成H.264解碼的運算比較困難,特別是對于高清視頻很難達到理想解碼效果,而擁有高速度及并行處理能力的FPGA能很好滿足實時性需求?;诖耍疚难芯苛嘶贔PGA的H.264解碼核的實現問題,并給出了一個具體的實現方案。同時提供了相應的驗證結果。實驗數據顯示本文提出的方法是正確的和有效的。
H.264/AVC并沒有明確規定編解碼器如何實現,僅規定了一個編碼后視頻比特流的句法及解碼方法。H.264編碼通常采用預測和變換的混合壓縮法,該編碼流程以宏塊為單位進行幀內或幀間預測處理,然后把預測值PRED與當前塊相減,產生殘差數據塊,之后進行塊變換和塊量化,最后將熵編碼后的數據與解碼所需頭信息組成一個壓縮碼流。H.264解碼是編碼流程的逆過程,原理如圖1所示。H.264解碼流由殘差數據和預測數據兩條路徑并行處理。殘差數據路徑主要由熵解碼CAVLC和反量化反變換IQIT產生殘差數據;預測數據路徑由基于參考像素的幀內預測(幀間預測本文暫未考慮)產生預測宏塊。兩條路徑結果輸出相加構成重建圖像,并以該圖像作為下一幀解碼圖像的參考像素進行幀內預測。
為避免傳統浮點型離散余弦變換因解碼端的運算精度不足經常引起的失配問題[4],H.264采用整數變換技術,該變換把解碼和量化過程中的乘法合二為一,既減少了解碼的運算量,又提高了圖像解壓縮的實時性。

圖1 H.264解碼結構圖
根據整數變換與反量化過程,H.264在解碼中將逆DCT運算中的部分系數放到反量化中一起處理。與正變換對應的4×4塊像素的逆DCT變換公式為:

式中:Ci為逆變換矩陣;Ei為變換尺度調整矩陣;a=1/2,b=;Z為逆量化后的結果,將“Z?Ei”結合到逆量化的過程中去,根據當前塊類型的不同,H.264的反量化公式可分為3種情況:
1)若當前塊是幀內16×16預測模式的亮度塊時,交流系數由反量化公式(4)計算,直流系數反量化公式為

式中:i,j=0,1,2,3
2)若當前塊是色度塊時,交流系數由反量化公式(4)計算,直流系數反量化公式為

式中:i,j=0,1,2,3
3)若當前塊是非幀內16×16預測模式的亮度塊時,不需要考慮直流系數時的反量化由公式為

式中:QPy和QPc分別為亮度塊和色度塊的量化參數;WD(i,j)為直流系數的逆Hadamard變換結果;Vij是融合在反量化過程中的逆DCT的比例變換系數;Zij為j交流殘差系數矩陣。相對應于直流系數的逆Hadamard變換公式為見式(5),其中ZD為直流殘差系數矩陣

為了提高系統性能和處理速度,本方案在解碼實現結構上用流水線和模塊并行處理??紤]到CAVLC指令周期占解碼時間較長[5],將算法從圖2中的虛線處分開用并行處理完成,每當虛線右部分的CAVLC完一個宏塊解碼后,便啟動虛線左部IQIT的運算,同時啟動CAVLC對下一宏塊的熵解碼運算。各模塊間采用流水線處理,使用握手信號end_xxx來表征一個運算結束,使用啟動信號trigger_xxx開始一個運算,因此本方案有增加模塊間處理靈活性的優點。

圖2 H.264解碼核實現結構圖
編碼比特流由一個個句法元素為單位依次銜接組成,比特流句法表詳細的介紹了H.264的句法,指明了在碼流中依次出現的句法元素及它們出現的條件、表示的物理意義、提取描述子等。
句法解析模塊分析和解碼每一個句法元素,為后續模塊提供參數信息,如為IQIT解碼模塊提供當前宏塊類型mb_type和量化參數偏移值mb_qp_delta等。句法解析模塊根據碼流的分層結構,引入有限狀態機FSM的處理方法,采用層次分解結合sub FSM的形式來對比特流句法進行解析。由圖3可見句法解析模塊分6個層級,且包括13個sub-FSM。對于每一個sub-FSM都是單一的輸入控制,避免了sub-FSM之間的相互轉化,減少結構復雜度。并且可以在每個sub-FSM內部根據需要自如地改變狀態,而無需考慮句法解析模塊的整體結構,因此增加了實現結構的靈活性和可擴張性。

圖3 句法解析層級分解FSM圖
根據CAVLC解碼原理[6],本文給出一種新型CAVLC解碼實現方案,其結構如圖4所示,主要包括NC查表模塊、Trailing_sign模塊、非零系數幅值Levels模塊、TotalZeros模塊、Run_Before模塊,Data_reorder模塊。由圖4可見,如果當前宏塊類型為P_skip,則整個宏塊不包括任何殘差信息,若當前4×4塊的CodedBlockPatter為0,則對應子塊的所有的殘差不被傳送,再者若進行NC值查表后,得到非零系數數目值TotalCoeffs為0,則沒有必要再進一步進行CAVLC解碼,以上3種情況可以直接將殘差數據設置為0,其他情況則依次進行Trailing_sign,Levels,TotalZeros,Run_Before 解碼。

圖4 CAVLC解碼結構圖
CAVLC的組成模塊都是基于變長表格來進行查表的[7],以NC查表獲取非零系數數目TotalCoeffs和拖尾系數數目TrailingOnes為例,共有4個變長表格和1個定長表格可供選擇。對于變長碼流的查表,已提出的有分組碼表法、二叉樹法、全碼查表法等,基于查表效率和硬件資源消耗的綜合考慮,本文采用改進的分組—二叉樹法來解析 ToalCoeffs和 TrailingOnes。
仔細觀察4個變長表格和1個定長表格可發現大部分碼流都是由若干個前綴零和由1引導的后綴組成,類似于哥倫布碼流結構。表1給出了NC取值的碼表規律性,在知道碼流前綴零的個數count后,使能相應的分組信號temp++,然后使用狀態機state++狀態轉換實現二叉樹遍歷,解析出非零系數個數和拖尾系數個數。對于后面非零系數幅值Levels、最后一個非零系數前零的數目TotalZ-eros、每個非零系數前零的個數Run_Before[i]的解析都采用該改進的分組—二叉樹法。

表1 碼表規律性
根據殘差數據被編碼的類型,IQIT解碼可分為2個數據路徑:對路徑1,如果殘差數據為Intra16x16_Luma塊或者Chroma塊,則直流系數需在反量化前做逆Hadamard變換,量化后結果放到相應塊的(0,0)位置上與15個交流系數組成1個4×4塊,之后再做逆DCT變換;對于路徑2,如果殘差數據非Intra16x16_Luma塊和Chroma塊,則需對所有系數反量化,然后再進行逆DCT變換。
反量化算法主要基于乘法運算和移位操作完成,實現結構見圖5。具體實現過程為:首先由MUX選擇當前塊量化參數QP(0≤QP≤51);再由Mod6 LUT模塊對QP取余,其結果與iq_address、res_dc和res_ac信號共同用于選擇比例變換系數Vij(0≤i,j≤3);然后Vij和殘差系數Wij經乘法器lpm_mult算出Yij;此外,還把QP送入模塊Div6 LUT取商,經shift_len模塊算出移位長度len;最后把Yij和len送入移位模塊Shift LUT算出量化結果IQ_output。其中Mod6 LUT和Div6 LUT采用查表方式完成運算。該模塊每次處理一列數據加快了處理速度,為后續的逆DCT解碼提供了便利。

圖5 反量化算法實現結構圖
由2.2節逆DCT算法原理知,逆Hadamard算法和逆DCT算法在結構上相似,它們的每一維運算中都包括4個輸入和8次數學運算,不同點僅在系數上相差1/2,因此可通過引入1個系數選擇器來共用相同硬件結構;對于2×2的色度塊,可將二維逆DCT變換合成為一維的4×4塊逆DCT變換來共用同一硬件結構。故本文對逆DCT變換用信號IS_Hadamard來確定運算結構,如果IS_Hadamard=1,則選擇逆Hadamard算法;否則若IS_Hadamard=0,則選擇逆DCT算法;其次通過設置1D_counter和2D_counter信號值來選擇相應的塊,若1D_counter=4且2D_counter=4,則選擇亮度4×4塊;若1D_counter=1且2D_counte r=0,則選擇2×2的色度塊。在上述運算過程中,我們還引入了雙向加法器lpm_add_sub,從而獲得了降低算法復雜度的效果。
幀內預測利用宏塊之間的相關性,根據鄰近子塊的存在性和在當前圖像中的位置,獲取參考像素值A~M,然后由預測公式[8]來計算像素樣點值。其中16×16亮度塊和8×8色度塊的預測方式由句法解析模塊的解碼比特流Intra16x16_predmode和Intra_chroma_predmode直接給出,4×4亮度塊的預測方式由其相鄰上方塊及左方塊的預測方式ModeA和ModeB共同計算得出[10]。
預測方式共有17種,其中4×4亮度塊有9種[9],16×16亮度塊和8×8色度塊各有4種,若針對每一種預測方式都設計一種實現結構,勢必會增加硬件資源消耗和系統復雜度。由于17種預測方式的運算結構基本一樣,都是先求和再進行移位運算,唯一不同之處是,16×16亮度塊和8×8色度塊的Plane預測方式,需在預測之前,先算出H,V,a,b,c這5個變量[10],最后的像素值再根據下式計算

圖6為幀內預測解碼結構圖,加法運算由Parallel_add硬件加法器來完成,Is_clip模塊用于完成Plane預測方式。每個周期處理1列像素點,4個周期可完成1個4×4像素點的預測,這有助于加快硬件處理速度。

圖6 幀內預測解碼結構圖
為驗證本文提出算法的正確性,在QuartusⅡ7.2版的環境中,對用VHDL設計的各個功能模塊及整個H.264解碼核執行了功能仿真,使用的FPGA為StratixⅡ系列的EP2S60F672C5ES。因文章篇幅有限,下面僅給出CAVLC熵解碼器和反量化器的仿真曲線圖及H.264解碼核編譯報告。
圖7為1個4×4塊CAVLC解碼仿真圖,輸入為000010001110010111101101的1幀圖像數據中5個句法元素的編碼比特流,解析得到的參數為ToalCoeffs為5,TrailingOnes為3,Levels為 1 和 3,Total_zeros為 3,Run_before[i]為1,0,0,1,0,解碼數據排序為 0,3,0,1,-1,-1,0,1,0,0,0,0,0,0,0,0。

圖7 CAVLC解碼器仿真圖(截圖)
圖8為反量化器波形仿真圖,其中trigger_quant為反量化模塊使能信號,高電平有效,res_ac和res_dc為交直流復位信號,高電平有效,qp為量化參數,qp_ref為qp取商結果,qp_rem為qp取余結構,data0~data3是前面CAVLC解碼器輸出的4×4殘差數矩陣,m0~m3為相對應的比例變換系數Vij,dataout0~dataout3為反量化器的量化輸出。

圖8 反量化器波形仿真圖(截圖)
H.264解碼核編譯報告由表2所示。本文提出的H.264硬件解碼核采用改進的分組—二叉樹法進行變長碼表的查找,最大程度簡化了反量化、逆DCT和幀內預測解碼實現結構,因模塊之間采取了流水線和并行處理方式,在硬件資源消耗和處理速度上與傳統未改進的硬件實現方法相比都有很大的改進,結果也表明了該H.264解碼核設計的正確性和實用性。

表2 H.264解碼編譯報告
針對H.264解碼復雜度高的問題,從提高解碼速度和節省硬件資源兩方面來權衡考慮,給出了基于FPGA的H.264解碼核,并詳細介紹了其設計和實現方法,最后給出了基于FPGA的功能驗證和與傳統法的性能對比。實驗結果表明了設計的正確性,同時也顯示其在性能和解碼效率上與傳統法相比有較大幅度的提高。
[1]任李悅,唐寧,滕舟.基于H.264解碼器的軟件優化[J].電子設計工程,2009,17(12):104-108.
[2]林冰,馮艷,李學明.基于Trimedia DSP的H.264解碼算法優化[J].計算機工程與應用,2005,31:41-45.
[3]奚杰,陳杰,劉建,等.H.264在多核平臺上的并行性分析[J].哈爾濱工程大學學報,2010,31(6):736-742.
[4]曹偉,洪琪,侯慧,等.一種用于H.264編解碼的新型高效可重構多變換 VLSI結構[J]. 電子學報,2009,37(4):675-674.
[5]郭倩,陳耀武.基于功能模塊的H.264并行解碼算法[J].計算機工程,2010,36(23):231-233.
[6]CHEN Guanghua,HU Dengji,ZHANG Jinyi.Efficient VLSI architecture of CAVLC decoder with power optimized[J].上海大學學報:英文版,2009,13(6):462-465.
[7]GUO Hui,FU Yongqing.An improved CAVLC entropy encoder of H.264/AVC and FPGA implementation[J].Key Engineering Materials,2011,5:241-246.
[8]畢厚杰,王健.新一代視頻壓縮編碼標準——H.264/AVC[M].2版.北京:人民郵電出版社,2009.
[9]馮杰,陳耀武.基于H.264 I幀編碼的塊邊緣模式特征提取算法[J].華南理工大學學報:自然科學版,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.