???? 摘 要: 在深入研究H.264幀間預測" title="幀間預測">幀間預測技術的基礎上,采用三級流水線實現幀間預測解碼的VLSI設計,并詳細介紹了基于宏塊" title="宏塊">宏塊分割的變塊自適應循環控制單元,針對存儲器的讀寫問題提出了一種交織存取方式,針對分像素插值" title="插值">插值提出了一種基于H.264標準的插值運算電路。通過仿真及在H.264解碼器中的實際應用和測試,證明該設計工作穩定,能夠滿足H.264標準基本框架下4CIF格式圖片30fps(幀/秒)實時解碼的要求。
???? 關鍵詞: 幀間預測? VLSI設計? 變塊大小自適應? 交織存取? 插值運算
?
??? H.264[1]是聯合視頻工作組JVT(Joint Video Team)開發的最新一代視頻壓縮標準。與標準MPEG-2、MPEG-4和H.263相比,其總體結構為基于增強的運動估計" title="運動估計">運動估計與補償加變換編碼的混合(hybrid)編碼模式,包含了許多新特征:如VCL層和NAL層分離、幀內預測、高精度運動估計、可變塊大小運動補償、多參考幀運動補償預測、低復雜度16bit的整數變換和量化、去塊效應濾波器和高效的熵編碼等。這些新特征使得H.264/AVC能夠顯著提高編碼效率且具有網絡友好性,可有效用于各種網絡和應用環境[2]。
??? 作為視頻壓縮的關鍵技術之一,具有運動估計與補償的幀間預測技術主要是利用連續圖像之間的相關性,采取運動估計與補償的方法來消除時間上的冗余。H.264解碼代碼的復雜度分析結果顯示,計算量最大的部分是幀間預測模塊、幀內預測模塊和去塊效應濾波模塊。但這些部分的控制方式相對簡單,適合用硬件來實現。本文在深入研究H.264幀間預測技術的基礎上,盡量降低硬件資源損耗,采用三級流水線實現幀間預測解碼的VLSI設計。
1 幀間預測技術研究
??? H.264幀間預測是利用已編碼視頻幀或場和基于塊的運動補償預測模式。與以往標準幀間預測不同的是,H.264增加了許多新功能[3],主要包括四個方面:
??? (1)可變塊大小運動補償:每個宏塊(16×16像素)的亮度,可以按4種方式進行分割:1個16×16,或2個16×8,或2個8×16,或4個8×8,其運動補償也相應有4種。而8×8模式的每個子宏塊可以繼續分割:1個8×8,或2個4×8,或2個8×4,或4個4×4。這種分割下的運動補償,稱為樹狀結構運動補償。這些分割和子宏塊大大提高了各個宏塊的關聯性。一般來說,小塊可以提高預測的效果。
??? 宏塊的色度成分(Cr和Cb)則為相應亮度的一半(水平和垂直各一半)。色度塊采用和亮度塊相同的分割模式,只是尺寸減半(水平和垂直方向都減半)。例如8×16的亮度塊其相應的色度塊尺寸為4×8。
??? (2)高精度的運動補償:幀間編碼宏塊的每個分割或子宏塊都是對參考圖像的某一相同尺寸區域進行預測得到的。兩者之間的差異(MV),對亮度成分采用1/4像素精度,色度1/8像素精度。亞像素位置的亮度和色度像素并不存在于參考圖像中,需要利用臨近已編碼點進行內插" title="內插">內插得到。
??? MV可由臨近已編碼分割的MV預測獲得。預測矢量MVp基于已計算的MV和MVD(預測與當前的差異),并被編碼和傳輸。MVp取決于運動補償的尺寸和臨近MV的有無。
??? (3)多參考幀運動補償:H.264支持多參考幀預測(multiple reference frames),即可以有多于1個、最多5個在當前幀之前解碼的幀作為參考幀產生對當前幀的預測。這適用于視頻序列中含有周期性運動的情況。較之只使用1個參考幀,使用5個參考幀可以節省碼率5~10%。采用這一技術,可以改善運動估計的性能,提高H.264解碼器的錯誤恢復能力,但同時也增加了緩存的容量以及編解碼器的復雜性。不過,H.264的提出是基于半導體技術的飛速發展,因此這兩個負擔在不久的將來會變得微不足道。
??? (4)去塊效應濾波:基于塊的視頻編碼在圖像中存在塊效應,主要來源于幀內和幀間預測和殘余編碼。去塊效應濾波器(Deblocking Filter)的作用是消除經反量化和反變換后重建圖像中由于預測誤差產生的塊效應,即塊邊緣處的像素值跳變,從而改善圖像的主觀質量,減少預測誤差。在去塊效應濾波時,應該根據圖像內容判斷是圖像的真實邊界還是方塊效應所形成的邊界(假邊界)。對真實邊界不進行濾波處理,而對假邊界則根據周圍圖像塊的性質和編碼方法采用不同強度的濾波。
2 幀間預測解碼硬件實現
??? 在本次H.264解碼設計中,解碼架構采用DSP+FPGA協同處理,DSP主要負責完成slice_data前所有處理過程,包括序列參數集、圖像參數集及片頭的句法元素的解析以及碼流的處理,并存儲片層及宏塊層要解析的碼流,承擔整個解碼器的協調和控制。而FPGA負責完成片層及宏塊層各句法元素的解析,以及后續的解碼重建,如幀間預測、幀內預測、反量化/變化、CAVLC解碼及去塊濾波等,充分利用了DSP和FPGA的優勢[4]。
??? 本文設計的幀間預測解碼整體框圖如圖1所示,主要包括MV分量及參考索引獲取計算、參考圖像矩陣選擇處理、分像素內插和加權預測處理三級流水線模塊。
?
?
??? 宏塊流水線技術在硬件實現視頻編解碼過程中起到相當重要的作用。圖1中, 當第一個宏塊完成MV分量及參考索引獲取計算轉而進入第二級執行參考圖像矩陣選擇處理時, 第二個宏塊便進入第一級執行MV分量及參考索引獲取計算的環節中,大幅度提高了各個模塊的利用率。這樣做,雖然增加了一定的電路規模,但是大大提高了運行效率[5]。
??? 圖1中方框圖表示處理模塊,圓角框圖表示存儲器單元,其中縱條狀的是DDR SDRAM(用于存儲參考幀圖像)和SDRAM(用于存儲MV解析結果,B幀解碼時需要參考),其余橫條紋表示內部使用或者與H.264其他解碼模塊接口的SRAM。黑色箭頭與H.264其他解碼模塊接口的存儲器或者模塊連接。
??? 幀間預測的整體實現過程為:在每幅圖像解碼開始后,DSP內完成參考圖像的管理,包括當前圖像的POC值計算、上一幅解碼圖像的標記、當前圖像標記命令的存儲以及參考幀的初始化和重排,將重排好的參考幀列表信息寫入列表信息存儲器中。在片層(SLICE)解碼開始后,將每幅參考圖像的加權系數寫入加權信息存儲器中。宏塊級解碼開始后,采用流水線技術完成各個宏塊的幀間預測解碼處理。下面詳細描述各個模塊。
2.1 MV分量及參考索引獲取計算
??? H.264/AVC使用兩種熵編碼方法,CAVLC(上下文自適應的可變長編碼)和CABAC(上下文自適應二進制算術編碼),兩種都是基于上下文的熵編碼技術。本單元采用乒乓機制接收CAVLC/CABAC解碼得到的幀間預測殘差信息,包括宏塊編碼方式(mb_type)、宏塊分割(mbPartIdx,subMbPartIdx)、參考幀標識(predFlagLX)、參考幀索引號(ref_idx_lX)以及運動矢量差(mvd_lX)等等。然后,根據當前宏塊在幀中的位置和小塊在宏塊中的偏移地址計算得到當前小塊的左上和右上小塊在幀存中的地址,從參考塊信息存儲器中讀出參考小塊的參考索引和運動矢量,并結合殘差信息以及參考幀列表信息計算得到當前小塊的絕對運動矢量,解析完成后將結果寫入當前宏塊參考信息存儲器。同時將結果寫入SDRAM,供B幀參考使用。
本模塊循環控制由變塊自適應循環控制單元完成,對一個宏塊中的各個小塊按照宏塊分割進行變塊自適應,在完成一個小塊后進行判斷,啟動下一個小塊運動矢量信息的預測。小塊之間的跳轉狀態以及宏塊分割如圖2所示。其中,下方是宏塊的各種分割,上方是各種狀態跳轉,指示線上標注的是分割寬高變量partWidth和partHeight。假設一個宏塊分割為兩個8×16,則小塊狀態跳轉順序為:0_0->0_2->END。
????????????????????????????? ???
?
??? 第二、三級變塊自適應循環控制單元與之類似,不再贅述。
2.2 參考圖像矩陣選擇處理
??? 本單元通過循環控制得到當前小塊運動矢量信息,根據當前小塊的位置信息和運動矢量等,計算當前小塊對應的參考矩陣塊在二維圖像中的坐標,結合參考幀序列號等,計算得到參考矩陣塊在參考幀存儲器DDR SDRAM中的絕對讀地址,從DDR SDRAM中讀出參考數據。然后,根據數據的邊界信息,從讀取參考數據中抽取有效數據,進行進一步的組織和運算,并寫入參考像素矩陣存儲器。
??? 參考矩陣選擇處理不涉及復雜的計算過程,但對數據操作比較多,涉及到的存儲器操作比較復雜。存儲器的讀寫在H.264的硬件設計中是一大瓶頸,因此主要關注點在于存儲器的高效讀寫和利用。為了滿足實時解碼的要求,DDR SDRAM位寬為32bit,參考幀數據按照交織的方式存入DDR SDRAM中,具體亮度交織存取方式如圖3所示,其中MBx_y為第y行第x列的宏塊。
?
??? 這樣,在DDR SDRAM中,每個BANK內每個PAGE可以存儲4個宏塊亮度(或者8個宏塊亮度,色度按照CrCbCrCb方式存儲,便于讀寫和后端操作)。在這種存儲方式下,讀數據的起始地址,每行讀取幾個數據,讀幾行數據等信息均由小塊位置解析模塊給出。具體的DDR中數據的讀地址由專門的DDR控制器產生,并根據要求將讀取的數據拼接成所需格式,供后端讀取和進行進一步的拼接和填充。
2.3 分像素內插和加權預測處理模塊
??? 本單元通過循環控制得到當前小塊運動矢量信息,計算得到色度矢量。然后,按照要求從參考像素矩陣存儲器(Luma_mem,Chroma_mem)中讀出參考數據,分別對亮度和色度完成插值和加權預測,將結果存入預測像素結果存儲器。
為了保證插值的運算效率,滿足高清序列實時解碼需要,本文設計了一個基于H.264標準的亮度插值運算電路。由于H.264中宏塊采用樹形分割,最小分割尺寸為4×4,所以在該結構中,每個宏塊被拆分成16個4×4的亮度塊,順序被處理。
亮度插值運算單元數據通路如圖4所示,插值運算單元每次參考9×9的輸入數據和運動矢量信息完成分像素插值。首先,根據運動矢量進行判斷,如果運動矢量的垂直和水平分量為整數,則表明插值預測像素已經實際存在,可以直接由輸入數據得到。如果其中一個或者兩個為分數,則要通過參考幀中相應像素內插得到。
?
??? 如圖4所示,輸入亮度數據根據多路信號選擇器分配給不同的6-tap濾波器,在運算單元內部設置了幾組延時寄存器組,用來緩沖需要輸入到濾波器的參考像素值。在需要的半像素和整像素全部得到和對齊后,根據運動矢量選擇對應位置的半像素和整像素,進行加法和移位運算,得到1/4像素精度的預測亮度像素值。圖5給出了1/4亮度像素內插部分信號時序。
?
3 分析及實現結果
??? 本文采用基于三級流水線結構的幀間預測解碼VLSI實現結構,用Verilog-HDL語言進行寄存器級描述,并且在Modelsim6.0環境下進行功能仿真。仿真結果與標準算法軟件計算結果相比較以保證其正確性,證明本文的設計是正確的。設計實現采用ALTERA公司的QUARTUSⅡ5.0開發軟件,目標器件為StratixⅡEP2S60F1020C5,硬件仿真和驗證表明該設計可以在60MHz頻率下穩定工作。
??? 統計顯示,本文設計的三級流水結構中,除第二級參考圖像矩陣選擇處理與宏塊分割、運動矢量以及DDR SDRAM讀寫相關無法具體確定外,第一級MV分量及參考索引獲取計算、第三級分像素內插和加權預測處理均可以在900周期內完成。
??? 通過仿真及在H.264解碼器中的實際應用和測試,證明該設計工作穩定,能夠滿足H.264標準基本框架下QCIF格式圖片30fps(幀/秒)實時解碼的要求。
參考文獻
[1] ITU-T Rec.H.264.Advance video coding for?generic audiovisual services[S].March,2005.
[2] WIEGAND T,SULLIVAN G J,BJONTEGAARD?G,et al.Overview of the H.264/AVC video coding standard[J].IEEE Trans.on circuits and systems for video technology,2003,13(7):560-576.
[3] 畢厚杰.新一代視頻壓縮編碼標準-H.264/AVC[M].北京:人民郵電出版社,2005.
[4] 高玉娥.H.264解碼器的系統設計及CAVLC的硬件實現[J].電視技術,2006(12):23-28.
[5] 吳子輝.H.264編解碼器方案綜述[J].電視技術,2005,(12):12-14.
[6] H.264 reference software,JM9.6[CP].http://iphome.hhi.de/suehring/tml/download/old_jm/jm96.zip,July,2005.