采用DSP 和FPGA 協同技術設計實現了一個高性能的MPEG24 視頻編碼器。FPGA 模塊完成視頻采集、YUV 分離、數據I/ O 等功能,而使用DSP 專一進行視頻壓縮編碼。針對DSP 片內資源特點設計了片內存儲器數據分配方案,并根據該方案優化了MPEG24 視頻壓縮的數據流模式。提出了基于宏塊空間復雜度的宏塊類型判斷算法,有效地降低了視頻壓縮算法的計算復雜度。測試結果表明,采用MPEG24 視頻標準該視頻編碼器每秒能夠壓縮3912 幀CIF 圖像。
隨著寬帶Internet 的快速發展和電子設備計算能力的迅速提高,在Internet 上實時傳輸高清晰度視頻信息成為可能,以Internet 為傳輸媒介的視頻會議、視頻監控、Internet 電視臺等視頻應用方興未艾。這些應用的一個共同特點是,都需要一個高性能的實時視頻編碼器,特別是高分辨率的視頻應用給視頻編碼器的計算能力提出了很高的要求。例如,一幅720 ×576 的4∶2∶2 視頻格式的畫面,包含有3240 個16 ×16 的YUV 宏塊(Macro Block ,即MB) 。如果該視頻幀按照P 幀或者B 幀進行壓縮,那么每一個YUV 宏塊都要進行運動估計、運動補償、DCT (Discrete Cosine Transform) / 反DCT 變換、量化/ 反量化和VLC(Variable Length Coding) 等環節的運算。如果進行實時壓縮(每秒鐘壓縮25 幀) 的話,大致需要316~ 5G IPS ( Inst ruction per second) 的計算能力 。
目前,單一的CPU/ DSP 一般還不具備這樣的計算能力。為了解決高清晰畫面的實時視頻壓縮問題, 本文提出了DSP 和FPGA ( Field Pro-grammable Gate Array) 協同設計方案。使用FP-GA 完成視頻采集、YUV (視頻亮度Y、色度分量
UV) 分離、數據I/ O( Input/ Output) 等所有周邊功能,使用高性能的DSP 進行視頻壓縮編碼,因而在視頻編碼器內DSP 和FPGA 能夠進行流水操作,有效地提高了編碼器的性能。
為了降低算法的計算復雜度,本文提出了基于宏塊空間復雜度的宏塊編碼類型判別算法(MTJBSC) 。在標準MPEG24 視頻運動估計算法中,判別宏塊的編碼類型是通過計算當前宏塊內像素值方差和參考宏塊與當前宏塊之間的方差來實現的,因此計算量很大。MTJBSC 算法首先計算出當前宏塊的空間負責度(MBC) ,然后通過比較當前宏塊的MBC 與SAD(Sum of Absolute Difference) 值來判斷當前宏塊的編碼類型,大大降低了算法的計算復雜度。
1 硬件設計方案
基于TI 公司的圖像開發工具包( Imaging Developer Kit ,即IDK)? 架構,設計了視頻編碼器的硬件平臺。從整體上來講,視頻編碼器的硬件實現由DSP 和FPGA 兩個模塊組成,其邏輯框圖如圖1 所示。由于視頻壓縮編碼計算量很大,為了盡可能提高視頻壓縮幀率,由DSP 專門負責視頻壓縮編碼,而視頻采集、YUV 轉換和編碼器I/ O 接口等其它功能則交由FPGA 模塊來實現。
如圖1 所示,用戶控制命令(例如視頻壓縮模式) 由FPGA 模塊首先截獲,然后FPGA 模塊向DSP 模塊產生外部中斷,DSP 在響應中斷時讀取存儲在FPGA 中的用戶控制命令字,然后DSP 解析命令字,并根據用戶要求的視頻格式、幀圖像分辨率和視頻壓縮碼流速率進行視頻壓縮編碼。
模擬視頻信號經視頻解碼器轉換為裸視頻數據流,該數據流(或從數字攝像機直接獲得的數據流) 經FPGA 預處理后送入幀存中。DSP 讀取幀存中的數據進行壓縮編碼,壓縮后的視頻數據送入FIFO 中,最后FIFO 中的數據通過串口送給信道編碼器。
FPGA 模塊的邏輯框圖見圖2 。如圖2 所示,視頻解碼器首先將模擬視頻信號量化為復合的YUV 數據,然后經FPGA 進行YUV 分離(和濾波) 后送到幀存(圖1 中的SDRAM1) 中,C6201使用DMA 通道(異步方式) 通過FPGA 讀取幀存中的YUV 數據進行壓縮編碼。幀存(SDRAM1)在刷新( ref resh) 或缺頁(page miss) 時會引起DMA 讀等待,為了平滑這種等待引起的DMA 讀數據的抖動,設計時在FPGA 的內部實現了一個高速FIFO。視頻幀存采用了乒乓結構,將8M 字節SDRAM 分為兩個4M 字節的地址空間(每一個地址空間可以容納一幀YUV 視頻數據(720 ×576 ×115 字節) ) ,一個地址空間用于存儲當前正在采集的視頻數據,另一個地址空間用于DSP 的數據讀取。在壓縮CCIR601 格式的視頻圖像(每秒25 幀) 時,由于DSP 的處理速度(大約每秒10幀) 慢于視頻采集的速度,所以FPGA 模塊在采集完一幀數據進入等待狀態,直到DSP 壓縮完上一幀視頻數據時,這2 個地址空間才進行互換。
DSP 模塊接收FPGA 模塊送過來的YUV 視頻數據,然后進行視頻壓縮編碼,最后將壓縮的碼流再轉交給FPGA 模塊,由FPGA 模數據發送出去。DSP 模塊的存儲單元(圖1 中的SDRAM2) 用來存放參考幀數據和中間運算結構。MPEG-4 壓縮編碼算法指令存放在PROM 中,為縮短取指時間, 編碼器在啟動時已將指令從PROM 讀到片內存儲器中。MPEG 壓縮碼流是變速碼流(VBR) ,而當該碼流在恒定速率(CBR)的信道上發送時,需要一個FIFO 緩存來平滑編碼器輸出碼率的波動。
該設計的特點主要表現在以下2 個方面:
①可擴展性好。FPGA 模塊除了負責數據I/ O功能外,還作為協處理器使用,可根據需要增加FPGA 的門數來實現原來由DSP 完成的功能,例如Huffman 編碼、運動估計等; ②靈活的視頻壓縮編碼格式控制,編碼器能夠實時地根據用戶的要求進行壓縮編碼。
2 視頻壓縮算法優化
(1) MPEG-4 數據流優化設計
實驗表明,如果代碼和代碼要訪問的數據在C6201 片內存儲區( PRAM 和DRAM) ,其代碼執行速度要比代碼和數據在片外同步SDRAM 中平均快17 倍(片內總線寬度為256 位,數據訪問為1 個CPU 周期) [3 ] 。因此,將執行代碼和數據放到片內將大大提高程序的運行速度。
在MPEG-4 算法中,由于沒有考慮存儲器的限制,算法每次讀入一幀YUV 數據進行壓縮編碼 。但對于C6201 來說,片內只有64K 字節DRAM ,不可能一次將一幀數據讀到片內存儲器進行壓縮。如果將一幀數據一次讀到片外存儲器(SDRAM) 中進行壓縮,又會大大降低代碼的執行速度,因此,我們對視頻壓縮算法進行了改進,一次對一個切片( slice) 數據進行壓縮編碼,并將壓縮碼流數據直接送入到發送緩沖區中。
編碼器一次將一個切片的YUV 數據(當前幀) 讀入到片內存儲器中,然后根據計算決定切片宏塊的編碼類型(幀內/ 幀間編碼) 。如果宏塊進行幀內編碼,則YUV 數據被分成8 ×8 的像素塊(一個宏塊包含4 個Y分量像素塊和2 個UV 分量像素塊) 進行DCT 變化,以消除圖像空間冗余信息。DCT 變化后的系數經過量化后進行游程編碼( Run Length Coding 即RLC) 和變長編碼(Variable Length Coding ,即VLC) ,變長編碼的結果送入到視頻發送緩沖區中。與此同時,量化后的DCT 系數經過反量化(結果放入內存B 中) 和反DCT 過程形成重建幀,重建幀用作下一幀的參考幀。
如果宏塊進行幀間編碼,則以宏塊為單位進行運動估計,根據運動估計的結果建立預測幀。當前幀和預測幀的差值形成了殘差幀( residue frame) ,殘差幀的編碼過程與幀內編碼過程相同。
(2) 宏塊編碼類型判別算法
在MPEG-4 算法中采用了快速運動估計算法,但是在進行宏塊編碼類型判別時計算量仍然很大。為此,本文提出了基于宏塊空間復雜度的判別算法MTJBSC ,進一步降低了運動估計過程中的計算量。
在編碼P 幀宏塊的時候,首先要決定宏塊是進行幀內編碼還是幀間編碼。在標準MPEG-4算法中是通過以下方法決定的 :
設參考宏塊的像素值( Y 分量值,以下同) 用P( x , y) 表示, 當前宏塊的像素值用C ( x , y) 表示, x , y 表示宏塊的縱、橫坐標, M , N 表示宏塊的寬和高。當前宏塊像素值的方差用EVAR表示,其值為
參考宏塊和當前宏塊的方差用EVMC表示,其值為
EVMC值越?。ū热鏓VMC 《 EVAR) ,說明參考宏塊和當前兩宏塊的相關性越大,應該采用幀間編碼。另一方面,還要考慮當前宏塊方差的大小,如果當前宏塊的方差較小(比如EVAR 《 EVMC) 則應該進行幀內編碼;但此時如果EVMC足夠的小,還是應該采用幀間編碼。因此有如下判斷準則:
if ( EVMC 》 EVAR and EVMC ≥9) then 幀內編碼else幀間編碼
顯然,在MPEG-4 算法中,為了判斷宏塊的編碼模式進行了大量的計算(對于每一個P 幀宏塊都要進行上面的計算) 。為了減少計算復雜度,本文提出了基于宏塊空間復雜度( EMBC) 的宏塊類型判斷(MTJBSC) 算法,用以判斷P 幀宏塊的幀內/ 幀間編碼模式。
定義宏塊的空間復雜度為水平方向上相鄰像素差值的絕對值之和,即
在基于幀間差原理進行視頻壓縮的MPEG標準中,一般都是采用絕對差總合( ESAD) 來進行運動估計的。在MPEG 標準中,宏塊的ESAD值定義為
式中: m , n 為該宏塊的運動向量。
根據上述定義,MTJBSC 算法可簡單描述為:
如果宏塊的ESAD小于其EMBC ,則該P 幀宏塊進行幀間編碼;否則進行幀內編碼。實驗表明,在壓縮質量和壓縮輸出碼率均沒有大的變動的情況下,該算法有效降低了視頻編碼器的計算復雜度,編碼器的壓縮幀率(f/ s) 得到明顯提高。
3 測試結果
表1 為編碼器進行裝載測試的測試結果(1幀的平均值) 。裝載測試是首先將視頻測試序列裝載到編碼器的SDRAM 中,然后進行壓縮編碼。使用的視頻序列為標準測試序列mother (CIF 格式,彩色, YUV 4 ∶2 ∶0 , 5 幀) ,DSP 主頻設置為200 MHz。
表2 為美國TI ( Texas Inst rument) 公司基于DSK 6711 EVM 板開發的H. 263 視頻編碼器的性能測試數據( 裝載測試) , DSP 主頻為150MHz。TI 公司針對DSK 6711 對H. 263 做了全面優化,算法關鍵代碼采用了線性匯編語言編寫。H. 263 視頻編碼算法與MPEG 視頻編碼算法的壓縮編碼原理、過程和計算復雜度大致相當,因此二者具有可比性。
從表1 和表2 可以看出,研制的視頻編碼器平均壓縮幀率為39. 2f/ s (CIF 圖像) ,而TI 公司開發的視頻編碼器平均壓縮幀率為20f/ s (CIF 圖像) ,絕對性能提高了96 % ,考慮到DSP 主頻的因素,相對性能仍然提高了47 %。
4 結 論
采用DSP 和FPGA 協同技術設計實現了一個高性能的MPEG24 視頻編碼器。使用FPGA完成編碼器I/ O 功能,使用DSP 進行視頻壓縮編碼,二者能夠很好地并行工作,系統設計結構簡捷,硬件工作可靠。同時,針對DSP C6201 片內資源特點優化了視頻壓縮的數據流模式,采用MTJBSC 算法有效地降低了壓縮算法的計算復雜度。測試結果表明,采用MPEG24 視頻標準該視頻編碼器每秒能夠每秒壓縮39. 2 幀CIF 圖像。
評論