王明江,顏 琥,張愛平
(哈爾濱工業(yè)大學深圳研究生院微電子中心,深圳518055)
近年來,隨著VLSI技術(shù)和寬帶數(shù)字網(wǎng)技術(shù)的發(fā)展,人們對數(shù)字視頻業(yè)務如可視電話、電視會議、安全監(jiān)視、高清晰度電視、視頻點播和數(shù)字化視頻光盤等應用產(chǎn)生了越來越濃厚的興趣。但是,所有這些應用都面臨一個重要的問題——通信帶寬或存儲空間不足,視頻數(shù)據(jù)的壓縮編碼正是解決這一問題的有效途徑。
2003年3月,由ISO/IEC與ITU-T組成的聯(lián)合視頻組(JVT)發(fā)布H.264標準,并將該標準正式納入MPEG-4作為MPEG-4標準的第10部分,稱為 H.264/AVC[1]。與早期的壓縮標準 H.263、MPEG-2、MPEG-4相比,H.264在相同的視覺質(zhì)量下編碼比特率可以節(jié)省一倍[2]。由于采用了一系列的先進編碼技術(shù),H.264具有非常好的壓縮率,然而,它的運算復雜度也超過了以往任何的視頻編碼標準,高出其它視頻壓縮標準幾倍甚至十幾倍,需要消耗大量的時間和系統(tǒng)資源,因此實時編解碼器的實現(xiàn)面臨著巨大的挑戰(zhàn)。
表1給出了基于JVT官方公布的JM8.0參考軟件獲得的H.264編碼器中各個模塊編碼復雜程度的分析[3]。從中可以看出復雜度最高,最消耗時間和資源的部分是運動估計/補償,該模塊占去了系統(tǒng)80%以上的資源。尤其是在H.264/AVC的幀間編碼過程中,因為使用了可變塊匹配運動估計、多參考幀運動補償和拉格朗日率失真優(yōu)化等先進的編碼技術(shù),使得由整數(shù)像素運動估計(IME)和分數(shù)像素運動估計(FME)組成的幀間運動估計過程占用了整個編碼器70%以上的編碼運算時間。其中FME運算量達到整個編碼的45%以上[4]。1/2ME是FME中最主要的部分。要達到30幀每秒的實時編碼要求,就必須優(yōu)化運動估計的算法、減小運動估計的運算量、通過硬件加速來縮短編碼運算時間[5]。
表1 基于JVT JM8.0的H.264編碼器復雜度分析[3]
根據(jù)變尺寸運動估計及模式選擇的算法思想,從減少算法復雜度、減少變尺寸塊選擇的計算量、能否映射出具體的硬件實現(xiàn)等幾個方面考慮,既保證一定的圖像編碼質(zhì)量,又能把芯片面積和功耗限定在一定范圍內(nèi)。如在塊模式種類引入方面,考慮到對于大尺寸視頻編碼,過細的塊劃分對視頻質(zhì)量改善作用很小,而運算量巨大,可以簡化模式種類,如只考慮16×16,16×8,8×16,8×8四種塊模式。
H.264編碼器可從一組前面或后面的已編碼圖像中選取多個與當前幀相關性較大的圖像作為幀間編碼的參考圖像。通過擴大尋找匹配圖像塊的范圍,再經(jīng)過多次比較的結(jié)果,可使匹配后的預測精度顯著改進。H.264允許最多采用16幀參考幀。實際上,對絕大多數(shù)圖像序列,采用5幀參考幀的運動預測就能獲得非常好的編碼效果。在采用全搜索算法或是快速全搜索算法的前提下,多參考幀技術(shù)的引入將使得運算量隨著參考幀數(shù)的增大而線性增加??紤]到硬件實現(xiàn)的具體情況,對于1080P這樣的大尺寸視頻,引入3個以上的參考幀,在運算量規(guī)模和圖像數(shù)據(jù)存儲等方面都將是難以接受的,所以通常都是從減少參考幀數(shù)目的角度來考慮支持多參考幀。在本設計中,主要綜合衡量多參考幀技術(shù)所能帶來的編碼質(zhì)量增益和對應運算量代價及硬件開銷兩個方面,對如何支持多參考幀技術(shù)做出取舍,如只支持3個以下的參考幀等。
H.264編碼過程中需要面臨如何在多種塊劃分方式中選擇最佳模式,在運動估計時如何選擇最佳運動矢量等問題,主要采用了基于率失真理論的率失真最優(yōu)化算法來在不同的模式中進行取舍。先對每種可能的模式計算其比特數(shù)和失真,然后用一標準來綜合衡量該模式,最后選擇評價值最小的模式。高復雜度模式采用SAD,SATD,SSD等描述的失真和實際用到的碼率進行模式選擇,而低復雜度模式針對不同的模式給出一個有傾向性的不同的初值SAD0,僅采用SAD來描述失真,不需要計算實際碼率。分析可知高復雜度模型盡管能夠獲得更好的編碼效果,但要求進行大量的運算,而低復雜度模型不需要計算SAD外的其它值,進行模式選擇操作較為簡單,便于硬件實現(xiàn)。
1/2ME進一步的在整數(shù)最佳點附近尋找最佳匹配點,其硬件架構(gòu)主要包括如下幾個主要組成部分:PE核心運算部件、片上緩沖存儲器、基于率失真的代價函數(shù)產(chǎn)生器、比較器、控制器等部分??驁D如圖1所示。
圖1 分像素運動估計硬件架構(gòu)的系統(tǒng)框圖
IME 模塊在16×16,16×8,8×16,8×8四種塊模式中找出了最佳的塊模式及相應的運動矢量,同時把1/2ME需要用到的插值數(shù)據(jù)及當前塊數(shù)據(jù)存儲在緩存中,并把存儲的地址信息提供給1/2ME。本設計采用片上128b位寬的緩存,存儲單元以4×4塊大小為單位,實際的有效數(shù)據(jù)可能從4×4中任意一個位置開始,因此,IME模塊還提供了有效數(shù)據(jù)的起始位置。在整數(shù)搜索的時候,如果搜索到了圖像邊界,進行1/2插值的時候,要對邊界像素進行擴展,因此,還提供邊界信息給1/2ME模塊。
1/2插值涉及兩個維度,同時進行插值不僅控制難度大,而且將消耗大量資源。將二維插值分解成兩個一維插值,并考慮到處理一個宏塊要進行4個8×8塊的處理,因此將兩個一維插值中間插入流水,不僅易于控制,結(jié)構(gòu)簡潔,而且縮短了宏塊的處理時間。
流水線如圖2所示,橫向插值模塊主要完成橫向插值工作,縱向插值模塊完成縱向插值,同時選取插值后最佳匹配點。當前塊及參考塊數(shù)據(jù)都存儲在同一個存儲器中,而在進行垂直插值時,首先要讀取當前塊的數(shù)據(jù),因此為了解決訪問沖突,在完成前一個8×8水平插值后,需要等待幾個周期,待當前塊數(shù)據(jù)讀取結(jié)束后,再進行下一個8×8塊的水平插值。
圖2 1/2ME流水圖
整個1/2ME的數(shù)據(jù)路徑如圖3所示。
圖3 1/2ME數(shù)據(jù)路徑圖
數(shù)據(jù)從前級緩存,進入水平插值模塊,水平插值后的數(shù)據(jù)進入到1/2ME內(nèi)部緩存,這是流水的第一級。從1/2ME內(nèi)部緩存出來的數(shù)據(jù),經(jīng)垂直插值,進入后級緩存;同時,當前宏塊的數(shù)據(jù)也被讀出,進行9個候選點的SAD計算及累加,最終比較得出最佳匹配點。第二級將給出一個當前塊讀取結(jié)束信號,避免第一級的訪問沖突。
橫向插值控制模塊設計成一次處理一個8×8塊。1/2插值采用6抽頭濾波器,實際因邊界擴展需要處理14×14像素。整個設計的存儲單位為一個4×4子塊數(shù)據(jù)大小,所以讀取一行14個像素值最多需要 5次訪問存儲(1,4,4,4,1),最少 4次。同樣,總共14行像素,最多需要讀5輪,總共最多需要25次訪問存儲。
為充分利用帶寬,設計8個濾波器組,每周期可得到8個插值像素,插值像素和原像素仍以4×4的形式存于緩存中。模塊中設置14×7個像素大小的寄存器組,讀入的數(shù)據(jù)(塊四周的數(shù)據(jù))要根據(jù)邊界條件以及有效數(shù)據(jù)起始位置進行裁剪再存入寄存器組。讀入的數(shù)據(jù)在寄存器組中按照一定的規(guī)則進行左移和上移,使得濾波器組的輸入得到更新。濾波后的數(shù)據(jù)即時輸往內(nèi)部緩存。
參考像素垂直方向有效起始位置不同,開始得到有效濾波數(shù)據(jù)的時間也不同。濾波器組設計成一次處理4行數(shù)據(jù),當一次開始位置為0時,讀第一行的4×4塊(水平達到7個像素)就可以開始濾波。其它位置時,待第二行讀入(達到至少4行像素)時,才開始濾波。起始位置為0和3時,讀完數(shù)據(jù)的同時,整個插值也隨之結(jié)束。起始位置為1和2時,讀完數(shù)據(jù)后還需等待幾個周期,整個插值才結(jié)束,因此,加入幾個等待狀態(tài)。
縱向插值模塊控制和橫向插值模塊控制類似??v向插值時數(shù)據(jù)垂直讀取,每一列需讀取4次,共5輪。在縱向插值模塊中,包含SAD的計算及累加模塊,同時進行最佳點的選取。當前塊數(shù)據(jù)存儲在前級緩存中,所以可以與插值數(shù)據(jù)同時讀取。當前塊數(shù)據(jù)讀入后存儲在8×8像素大小的寄存器組中,待插值像素讀入后存儲在4×10的寄存器組中。參考像素寄存器組按一定的規(guī)則上移,使濾波器組的輸入得到更新。每插完一列,參考像素寄存器組都要更新。
插值濾波器同樣設置8個,一次插出的8個像素與讀入的經(jīng)水平插值后的像素組成4×4塊的形式,送往后級緩存。SAD計算累加器接收當前塊及插值后的數(shù)據(jù),一起完成9個候選點SAD的計算。9個候選點的SAD在整個插值結(jié)束時通過一個比較器得到最小值,與此對應的位置點即為最佳匹配點。
半像素點通過對相應的整像素點進行6抽頭濾波得出,權(quán)重為(1/32,-5/32,5/8,5/8,-5/32,1/32)。1/2像素插值示意圖如圖4所示。大寫字母表示整數(shù)像素,小寫字母表示1/2插值像素。
以像素h為例,h由垂直的最近六個像素插值得到,即:
將輸入系數(shù)進行變換,得到下式:
每個輸入系數(shù)都是2的整數(shù)次方,通過移位就能完成輸入與系列的相乘。對于負號項,采用取反加1來實現(xiàn)。因為有部分加數(shù)需要左移,所以其右端可以加上這邊需要添加的項。同樣,四舍五入的操作,即加上16的部分,也添加到左移項的右端。運用Wallace樹形式可得到濾波結(jié)果。
計算SAD的是1/2精度的數(shù)據(jù),每周期產(chǎn)生4×4的數(shù)據(jù)中,相應位置點的數(shù)據(jù)是2×2,即四個,因此,SAD模塊設計成每次生成4個像素的部分SAD值,進行累加。對于求絕對值部分,直接用求差后的最高位,即符號位,作為選擇器的選擇信號來選通差值的原碼或者反碼,加1部分,轉(zhuǎn)移到累加器中進行。累加器采用Wallace樹加法器外加一個寄存器實現(xiàn)(見圖5)。
多路比較選擇模塊是從9個SAD值中,選出SAD最小的一個,輸出相應點的位置信息。設計中分兩級進行比較,第一級使用三個3選1的比較器選出3個候選點,第二級再從這3個點中選出最小一個。對于這9個點,考慮到現(xiàn)實視頻中物體運動方向的概率,設置一定的優(yōu)先級。優(yōu)先級最高的是水平方向上的運動,接著是垂直方向上的運動,最后是四角沿45度方向的運動。
圖5 SAD累加器
本設計實現(xiàn)了視頻編碼中的1/2ME硬件加速模塊,提出了用兩級流水完成1/2精度插值的結(jié)構(gòu),既提高了模塊的吞吐量,又簡化了控制結(jié)構(gòu)。設計出來的電路處理一個宏塊的時鐘周期小于150個,在Charted 0.13μm工藝下綜合后邏輯門為74.3K,最高工作頻率約160MHz,在1.20V的供電電壓下,功耗在10mW左右。本設計已應用于本實驗室高清視頻編碼芯片中。
[1]Joint Video Team(JVT)of ITU-T VCEG and ISO/IEC MPEG.Draft ITU-T Recommendation and Final Draft InternationalStandard of Joint Video Specification(ITU-T Rec.H.264|ISO/IEC 14496 -10 AVC)[C].7th Meeting,Pattaya,Thailand,2003.
[2]畢厚杰.新一代視頻壓縮編碼標準 -H.264/AVC[M].北京:人民郵電出版社,2005.
[3]J Zhang,Y He,S Yang,et al.Performance and Complexity Joint Optimization for H.264 Video Coding[C].ISCAS’03.2003,4:520 -523.
[4]TC Chen,Y W Huang,L G Chen.Analysis and Design of Macroblock Pipelining for H.264/AVC VLSI Architecture[C].ISCAS’04.2004,2:273 -276.
[5]梁亞玲,劉靜,杜明輝.H.264中塊運動估計及其發(fā)展趨勢[J].電視技術(shù),2005,(z1):40-43.