基于DM642DSP的視頻編碼優(yōu)化方法
需要通過(guò)EDMA搬移的數(shù)據(jù)有待編碼的宏塊,前后幀對(duì)應(yīng)的參考宏塊,和編碼后的重構(gòu)宏塊(B幀不需要),這些宏塊都包括亮度塊和色度塊。EDMA在搬大量數(shù)據(jù)時(shí)才能將它的性能發(fā)揮到極致,如果每編完一個(gè)宏塊就進(jìn)行一次乒乓緩存交換,那么在頻繁的配置EDMA通道參數(shù)上就耗費(fèi)了過(guò)多的CPU周期。有限的片內(nèi)存儲(chǔ)空間,制約著不能一次搬太多的宏塊,一般一次搬7--9個(gè)宏塊為宜。由于EDMA的同步信息是由CPU發(fā)出的,我們自然想到QDMA,但QDMA適用于單個(gè)的,獨(dú)立的快速搬移數(shù)據(jù),對(duì)于這種周期性的,重復(fù)性的搬移并沒(méi)有優(yōu)勢(shì)。
為了提高EDMA的效率,可以采用EDMA鏈,最多開辟12個(gè)EDMA通道,讓其首尾相連,這樣只需觸發(fā)一次CPU,可將待編碼的亮度塊色度塊,參考幀的亮度塊和色度塊……一次搬完,如圖2所示。在配置EDMA通道時(shí),我們注意到頻繁更換的只是EDMA的源地址和目的地址,而其它參量是不變的。由于EDMA控制器是基于RAM結(jié)構(gòu)的,每個(gè)通道是通過(guò)參數(shù)表來(lái)配置的,每一個(gè)通道的參數(shù)都可以在0x01A0000h~0x01A07ffh的2KB的配置表中找到自己固定的位置,所以在更新某一通道的源地址和目的地址時(shí),直接往配置表寫上新地址就行了,而不必調(diào)用CSL庫(kù)中的相應(yīng)的cache函數(shù)來(lái)修改源地址和目的地址。
圖2 EDMA鏈?zhǔn)疽鈭D
圖3 六邊形搜索算法
快速運(yùn)動(dòng)算法的優(yōu)化
包括MPEG2,MPEG4和H.261、H.263、H264在內(nèi)的標(biāo)準(zhǔn)都是采取基于塊的運(yùn)動(dòng)估計(jì)模型。當(dāng)然不同的標(biāo)準(zhǔn)塊的大小也不一樣,在H.264標(biāo)準(zhǔn)中,支持七種塊大小(16x16、16x8、8x16、8x8、8x4、4x8、4x4)。眾所周知:運(yùn)動(dòng)估計(jì)對(duì)減少時(shí)間域的冗余起了很大的作用,從而能大大提高編碼效率,但同時(shí)它的計(jì)算量特別大,占用了大概整個(gè)編碼系統(tǒng)的70%~80%的資源。一個(gè)好的編碼算法就是要在計(jì)算量和編碼效率兩者之間取得一個(gè)很好的平衡。
全搜索(FS)能夠保證在全局范圍內(nèi)搜到一個(gè)最佳的位置,但是其計(jì)算量是驚人的。對(duì)于在嵌入式系統(tǒng)中應(yīng)用是不現(xiàn)實(shí)的。一般在實(shí)際應(yīng)用中都是把幾種算法結(jié)合起來(lái),在本系統(tǒng)中采取的是:六邊形搜索法,如圖3所示,先以預(yù)測(cè)點(diǎn)為中心進(jìn)行大模式搜索,如果最優(yōu)點(diǎn)不在六邊形中心,則將六邊形的中心移至改點(diǎn),重復(fù)大模式搜索,直到最優(yōu)點(diǎn)在六邊形中點(diǎn),然后在這點(diǎn)切換到小模式搜索,此搜索法相對(duì)于經(jīng)典的三步法,四步法搜索的點(diǎn)更少。
由于是在DSP平臺(tái)上,對(duì)監(jiān)控系統(tǒng)實(shí)時(shí)性要求比較高,提出幾種基于DSP平臺(tái)的優(yōu)化方法:為了提高L1D的cache的命中率,根據(jù)cache不命中流水的原理,一次將參考幀全部灌入L1D內(nèi),然后在做運(yùn)動(dòng)估計(jì)時(shí)將七個(gè)宏塊一齊做,然后再做七個(gè)宏塊的運(yùn)動(dòng)補(bǔ)償,DCT,量化,反DCT,反量化,編碼,寫碼流。而不是像一般的步驟,對(duì)每一個(gè)宏塊先做運(yùn)動(dòng)估計(jì),然后運(yùn)動(dòng)補(bǔ)償,然后DCT,映射到L1D一次,如果每個(gè)宏塊單獨(dú)做,在做第一個(gè)宏塊運(yùn)動(dòng)估計(jì)時(shí)參考幀會(huì)由L2映射到L1D,做第二次運(yùn)動(dòng)估計(jì)時(shí),因?yàn)橹俺绦蜃鲞^(guò)DCT,量化等運(yùn)算,映射到L1D里的參考幀數(shù)據(jù)已經(jīng)被沖走,還得從L2中重新載入。同樣的對(duì)于程序段一級(jí)緩存L1P來(lái)說(shuō),DCT、量化、反DCT、反量化、編碼、寫碼流等函數(shù)都只需映射一次到L1P,而不必被反復(fù)地映射,沖掉,再次映射。
在JVT的提案中有很多運(yùn)動(dòng)矢量預(yù)測(cè)算法,如利用運(yùn)動(dòng)矢量在時(shí)間域有很強(qiáng)的相關(guān)性這一特性,我們能夠得到比較精確的起始搜索位置。但他不太適合DSP平臺(tái),因?yàn)檫@樣我們就要保留整個(gè)一幀的運(yùn)動(dòng)矢量,以CIF圖像格式為例,需要12kB的空間,保存在資源緊張的片內(nèi)顯然是不合適的。保存在片外存儲(chǔ)空間,調(diào)用的時(shí)候,先從片外先映射到L2cache,再?gòu)腖2映射到L1D,其間流水不命中等待的cycle數(shù),還不如從開始不太精確的初始位置多搜幾個(gè)點(diǎn)。
整數(shù)DCT的優(yōu)化詳解
DCT,量化,反DCT,反量化在整個(gè)編碼程序中占用了大概20%~25%的時(shí)間,所以有必要對(duì)他們的優(yōu)化花一番功夫,本文舉整數(shù)DCT為例說(shuō)明如何對(duì)程序進(jìn)行匯編級(jí)的優(yōu)化。H.264采用的整數(shù)DCT,不僅滿足一般DCT的特性,將圖像的能量集中到左上角位置,直流系數(shù)和低頻系數(shù)中,還有它特有的幾個(gè)優(yōu)點(diǎn):
-它是整數(shù)變換,所有的運(yùn)算都是整數(shù)算法,變換矩陣系數(shù)十分簡(jiǎn)單,核心變換部分可以僅僅用加法
評(píng)論