|
|
| <!--插入廣告JS代碼--> |
摘 要:本文分析了H.264軟件編碼器的結(jié)構(gòu),提出了影響速度的瓶頸,并給出其中兩方面的優(yōu)化方案:改進(jìn)的塊匹配算法和1/4象素參考幀插值函數(shù)結(jié)構(gòu)的優(yōu)化。同時(shí),針對(duì)高性能DSP芯片TMS320C64xx的特點(diǎn)提出了一系列的優(yōu)化方案,最后討論了C語(yǔ)言程序在DSP硬件上優(yōu)化設(shè)計(jì)的一般性規(guī)則。
關(guān)鍵詞:H.264標(biāo)準(zhǔn); 塊匹配準(zhǔn)則;1/4象素插值
引言
與H.263 協(xié)議相比,H.264協(xié)議的基本算法仍然是通過(guò)幀間預(yù)測(cè)和運(yùn)動(dòng)補(bǔ)償消除時(shí)域的冗余,經(jīng)過(guò)變換編碼消除頻域的冗余。但是,在計(jì)算精度和其它一些具體細(xì)節(jié)上都有所改進(jìn),這既是H.264協(xié)議優(yōu)于H.263協(xié)議的關(guān)鍵所在,同時(shí)也是提高H.264編碼器運(yùn)算速度的最大瓶頸。這些關(guān)鍵技術(shù)可以概括為:1/4象素精度的運(yùn)動(dòng)預(yù)測(cè)與補(bǔ)償,基于4×4塊的DCT變換,以及基于最小4×4塊的多種運(yùn)動(dòng)預(yù)測(cè)與補(bǔ)償模式。
H.264協(xié)議推出了一系列測(cè)試程序——JM系列,本文的優(yōu)化方案就是針對(duì)JM61程序在TMS320C64xx系列DSP芯片上的移植而進(jìn)行的。
通過(guò)對(duì)整個(gè)程序的分析可以看出,在編碼端,encode_one_ macroblock()函數(shù)是實(shí)現(xiàn)整個(gè)協(xié)議的關(guān)鍵函數(shù),也是對(duì)一個(gè)宏塊編碼的全部過(guò)程,因此,對(duì)這個(gè)函數(shù)優(yōu)化的程度直接決定了編碼器的編碼速度。雖然 JM系列程序隨著H.264協(xié)議的發(fā)展而不斷更新,但它始終是以測(cè)試為目的,內(nèi)部結(jié)構(gòu)還存在許多冗余,大量的判斷以及循環(huán)語(yǔ)句也不適合DSP程序的執(zhí)行。
基于DSP的優(yōu)化方案
塊匹配方案的優(yōu)化
在H.264協(xié)議中,將每個(gè)宏塊的inter預(yù)測(cè)模式分為7種,需要在參考幀中尋找每種模式的最佳匹配塊。目前,判斷兩個(gè)子塊匹配最常用的準(zhǔn)則是求幀間亮度的最小絕對(duì)誤差值(SAD值),JM61參考程序采用的也是這個(gè)準(zhǔn)則,其公式為:
其中表示當(dāng)前幀圖像中的象素點(diǎn),表示參考幀圖像中的象素點(diǎn),i、j分別表示當(dāng)前搜索點(diǎn)pos的偏移量。
由于DSP片內(nèi)空間有限,不可能將參與計(jì)算的兩個(gè)因子(和)全部放在片內(nèi),而SAD值的計(jì)算又是進(jìn)行整象素搜索的關(guān)鍵,在編碼一個(gè)宏塊時(shí),這個(gè)公式被反復(fù)調(diào)用,因此,有必要在進(jìn)行SAD計(jì)算之前引入?yún)⒖即按嬖瓉?lái)的參考幀。參考窗是參考幀中的有效數(shù)據(jù)部分,包含了當(dāng)前宏塊的整象素運(yùn)動(dòng)搜索范圍之內(nèi)的所有參考點(diǎn),并且對(duì)一個(gè)宏塊進(jìn)行編碼時(shí)只需要引入一次,所占用的空間較小,因而可以將參考窗數(shù)據(jù)放在片內(nèi),利于存取與計(jì)算,編碼下一個(gè)宏塊時(shí)再對(duì)窗中的數(shù)據(jù)進(jìn)行刷新。
填充參考窗的過(guò)程可以分為兩種情況:第一種情況是所有的搜索點(diǎn)都在參考幀的內(nèi)部,并沒(méi)有超出參考幀圖像的邊界,在這種情況下,可以利用 EDMA直接進(jìn)行數(shù)據(jù)搬移,只需要配置幾個(gè)寄存器啟動(dòng)EDMA,只占用很少的CPU資源,這樣既沒(méi)有增加數(shù)據(jù)搬移時(shí)間,又能在計(jì)算SAD時(shí)保證數(shù)據(jù)放在片內(nèi),從而提高運(yùn)算速度。第二種情況是在搜索范圍之內(nèi)的參考點(diǎn)并不都在參考幀圖像內(nèi)部,有一部分超出了圖像的邊界,對(duì)于這些超出了邊界的參考點(diǎn),需要用與之最臨近的邊界點(diǎn)代替,根據(jù)出邊界的情況需要進(jìn)行不同處理。沒(méi)有出邊界的參考點(diǎn)仍然可以用EDMA或者QDMA進(jìn)行搬移。
參考窗的大小是由搜索范圍決定的,參考程序中采用的搜索方法是搜索范圍為16的全搜索算法(FS),這種算法的優(yōu)點(diǎn)在于能夠100%地搜索到最佳匹配塊,保證圖像的質(zhì)量,然而帶來(lái)的缺點(diǎn)就是計(jì)算量很大。假設(shè)搜索范圍為16,在搜索范圍之內(nèi)便有1089個(gè)待搜索的點(diǎn),對(duì)每個(gè)搜索點(diǎn)要進(jìn)行256次絕對(duì)誤差計(jì)算和255次求加運(yùn)算,所以很難進(jìn)行圖像的實(shí)時(shí)處理。為了減少計(jì)算量,提高速度,許多快速算法只選取其中的一些象素點(diǎn)進(jìn)行匹配運(yùn)算,并認(rèn)為這其中的最佳匹配點(diǎn)就是當(dāng)前宏塊的最佳匹配點(diǎn),如三步搜索法和中心菱形搜索法,菱形三步搜索法等,但存在搜索到非最佳點(diǎn)的情況,從而會(huì)增大幀間預(yù)測(cè)誤差。所以,利用這些快速算法時(shí),搜索點(diǎn)的選取顯得尤為關(guān)鍵。為了進(jìn)一步衡量這幾種快速算法,本方案分別對(duì)這幾種算法進(jìn)行了測(cè)試,分別得到采用幾種算法之后,恢復(fù)圖像的信噪比(SNR)。選取的測(cè)試對(duì)象是 foreman序列和trevor序列,foreman序列的特點(diǎn)是鏡頭晃動(dòng)較大,trevor序列的特點(diǎn)則是內(nèi)部的變動(dòng)較大。測(cè)試的其它條件為:選取兩個(gè)標(biāo)準(zhǔn)序列的前100幀圖像;每幀圖像大小為QCIF(176×144);序列中I幀量化級(jí)數(shù)為31,P幀量化級(jí)數(shù)為34;碼率大小是30幀/秒;并開(kāi)打了RDO選項(xiàng),且使用了去塊效應(yīng)濾波器,測(cè)試結(jié)果見(jiàn)表1。
從測(cè)試結(jié)果可以看出,采用快速算法之后,恢復(fù)圖像的SNR雖然有所減少,但是減少的幅度不大,從主觀效果來(lái)看,幾種快速算法與全搜索算法的差別也不大。從碼流方面比較幾種算法,中心菱形搜索法的碼流較小,匹配程度較高,因此,本文在最后的優(yōu)化中采用了這種算法。
亮度參考幀的插值優(yōu)化
在H.264協(xié)議中,運(yùn)動(dòng)預(yù)測(cè)與補(bǔ)償?shù)木冗_(dá)到了1/4象素,其中1/2象素點(diǎn)是通過(guò)對(duì)整象素進(jìn)行6-tap濾波得到的,1/4象素點(diǎn)是由整象素點(diǎn)和1/2象素點(diǎn)進(jìn)行線性插值得到的,具體的插值方式如圖1和圖2所示。
在JM61參考程序中,實(shí)現(xiàn)插值的方法是基于C語(yǔ)言實(shí)現(xiàn)的,并沒(méi)有編解碼時(shí)間的限制,因此,在移植到DSP上以后,耗時(shí)較多,優(yōu)化的余地也比較大。
1/2象素插值
從H.264 協(xié)議本身以及圖1可以看出,為了得到半象素點(diǎn)a的預(yù)測(cè)值,必須先得到臨近的6個(gè)整象素點(diǎn)。從另一個(gè)角度來(lái)說(shuō),以整象素點(diǎn)B為例,在a的左右,共有6個(gè)半象素點(diǎn)在插值的時(shí)候需要用到B點(diǎn),而DSP的空間有限性決定了每一次讀取整象素點(diǎn)必須從片外獲得,導(dǎo)致本來(lái)就很費(fèi)時(shí)的數(shù)據(jù)讀取過(guò)程出現(xiàn)更長(zhǎng)的延時(shí)。基于以上的分析,本文對(duì)半象素的插值過(guò)程提出的優(yōu)化方案為:減少循環(huán)次數(shù),減少中間變量的維數(shù)以減少尋址時(shí)間。
本文將原來(lái)程序中的循環(huán)次數(shù)減半(包括水平插值和垂直插值),在每一個(gè)循環(huán)單元中計(jì)算出兩個(gè)半象素點(diǎn),也就是說(shuō),由原來(lái)的一次讀取6個(gè)整象素點(diǎn)并濾波得到1個(gè)半象素點(diǎn),簡(jiǎn)化為一次讀取7個(gè)整象素點(diǎn)后進(jìn)行兩次濾波得到2個(gè)半象素點(diǎn)。通過(guò)測(cè)試可以看出,這種簡(jiǎn)單的變動(dòng)是很有實(shí)際效果的。
1/4象素插值
1/4象素點(diǎn)的采用是H.264協(xié)議優(yōu)于以前協(xié)議的重要標(biāo)志,但其時(shí)間損耗也是巨大的。與半象素點(diǎn)相比,1/4象素點(diǎn)的插值方式要簡(jiǎn)單許多(只需要用到兩個(gè)最臨近的整象素或半象素點(diǎn)),但是,由于需要計(jì)算的點(diǎn)數(shù)是半象素點(diǎn)的4倍,循環(huán)的周期也隨之?dāng)U大,也使這個(gè)過(guò)程成為影響插值函數(shù)速度的主要瓶頸。如圖2所示,1/4象素點(diǎn)完全是由整象素點(diǎn)和半象素點(diǎn)插值得到的,并且空間距離很短。本方案改變了原來(lái)函數(shù)的結(jié)構(gòu),將圖2中的虛線部分作為一個(gè)循環(huán)單元,一次計(jì)算多個(gè)1/4象素點(diǎn),提高了整象素點(diǎn)和半象素點(diǎn)的利用率,減少讀取數(shù)據(jù)的時(shí)間。以a點(diǎn)為例,參考程序中的方法共需要讀取8次,而修改之后的a點(diǎn)只需要讀取2次。參考程序中的每一個(gè)循環(huán)單元只得到一個(gè)1/4象素點(diǎn),修改之后增加到12個(gè),使循環(huán)的次數(shù)大大減少,從而提高了編碼速度。
結(jié)合所使用的硬件,從另一個(gè)角度來(lái)看,處理的每個(gè)數(shù)據(jù)占8bit,C64xx處理器可以一次讀取多個(gè)字節(jié),處理多個(gè)字節(jié),而所占用的時(shí)間與處理單字節(jié)一樣。本方案修改之后的循環(huán)單元中一次可以得到12個(gè) 1/4象素點(diǎn),這其中又有8個(gè)點(diǎn)是連續(xù)的(分別是第二行、第四行的前四個(gè)點(diǎn)),于是,又可以充分利用C64xx的特點(diǎn),將片外的數(shù)據(jù)讀到片內(nèi)時(shí),根據(jù)需要存放到連續(xù)的地址中。例如,在片內(nèi)的某4個(gè)連續(xù)空間中存放標(biāo)號(hào)分別為A、a、a、a的象素點(diǎn),在另外的4個(gè)連續(xù)空間中存放標(biāo)號(hào)分別為b、b、c、d的象素點(diǎn),然后利用C64xx特有的指令一次得到標(biāo)號(hào)分別為2、3、4、5的4個(gè)1/4象素點(diǎn)的值,同時(shí),還可以將它們一次存放到片外的參考幀中。按照這種方法將會(huì)省去2/3的1/4象素點(diǎn)的存儲(chǔ)時(shí)間。
表2 測(cè)試結(jié)果 (單位:ms)
項(xiàng)目 函數(shù)A 函數(shù)B
優(yōu)化前時(shí)間 30 3537
優(yōu)化后時(shí)間 6 396
測(cè)試結(jié)果
本方案通過(guò)使用上述的優(yōu)化方案,針對(duì)參考程序中的SetupFastFullPelSearch()和UnifiedOneForthPix()兩個(gè)函數(shù)進(jìn)行,測(cè)試平臺(tái)為主頻為600MHz的TMS320C 6416芯片評(píng)估板,測(cè)試結(jié)果見(jiàn)表2。
表2中,函數(shù)A表示SetupFast FullPelSearch(),函數(shù)B表示UnifiedOneForthPix(),其中,針對(duì)B函數(shù)的測(cè)試只是進(jìn)行了結(jié)構(gòu)的優(yōu)化,并沒(méi)有利用EDMA。
結(jié)語(yǔ)
本文結(jié)合實(shí)際工作,重點(diǎn)探討了在TMS320C64xx系列DSP上實(shí)現(xiàn)H.264視頻編碼的方法。C64xx系列DSP的硬件資源為實(shí)現(xiàn)高性能提供了必要的條件,針對(duì)TMS320C64xx芯片的結(jié)構(gòu)和H.264應(yīng)用程序自身的特點(diǎn),提出了JM61參考程序在DSP上移植的優(yōu)化方案,可以總結(jié)為以下幾個(gè)方面:
1. 利用存儲(chǔ)器的優(yōu)化,將常用的數(shù)據(jù)放到片內(nèi);
2. 修改程序的結(jié)構(gòu),消除冗余;
3. 充分利用C64xx系列的優(yōu)勢(shì),尤其是新增的特殊指令,盡量在一個(gè)指令周期內(nèi)處理多個(gè)數(shù)據(jù);
4. 利用EDMA和QDMA進(jìn)行數(shù)據(jù)搬移,提前將數(shù)據(jù)放到片內(nèi),減少數(shù)據(jù)存儲(chǔ)的時(shí)間;
5. 對(duì)速度影響較大的函數(shù)手工編寫成匯編語(yǔ)言。