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