H.264在ADSP-BF561上的實(shí)現(xiàn)與優(yōu)化
2.1.2 ADSP-561 EZkite
ADSP-BF561視頻編碼器平臺(tái)采用ADI公司的ADSP-BF561 EZ-kit Lite評(píng)估板。此評(píng)估板包括1塊ADSP-BF561處理器、32 MB SDRAM和4 MB Flash,板中的AD-V1836音頻編解碼器可外接4輸入/6輸出音頻接口;而ADV7183視頻解碼器和ADV7171視頻編碼器則可外接3輸入/3輸出視頻接口。此外,該評(píng)估板還包括1個(gè)UART接口、1個(gè)USB調(diào)試接口和1個(gè)JTAG調(diào)試接口。攝像頭輸入的模擬視頻信號(hào)經(jīng)視頻芯片ADV7183A轉(zhuǎn)化為數(shù)字信號(hào),此信號(hào)從ADSP-BF561的PPI1(并行外部接口)進(jìn)入ADSP-BF561芯片進(jìn)行壓縮,壓縮后的碼流則經(jīng)ADV7179轉(zhuǎn)換后從ADSP-BF561的PPI2口輸出。此系統(tǒng)可通過(guò)Flash加載程序,并支持串口及網(wǎng)絡(luò)傳輸。編碼過(guò)程中的原始圖像、參考幀等數(shù)據(jù)可存儲(chǔ)在SDRAM中。
2.2 算法選取與優(yōu)化方案
2.2.1 算法選取
H.264實(shí)現(xiàn)的源代碼不止一種,其中最常見(jiàn)的有JM、X264和T264。對(duì)比這三種實(shí)現(xiàn)源代碼,X264比T264具有更高的效率。而且相比廣泛采用的JM編碼模型,X264在兼顧編碼質(zhì)量的同時(shí)大幅度地提升了編碼速度,所以選取X264作為算法原型。
2.2.2 優(yōu)化方案
該優(yōu)化方案從三個(gè)層次對(duì)算法進(jìn)行優(yōu)化:算法層次、代碼層次、平臺(tái)層次。下面介紹具體優(yōu)化方法。
2.2.2.1 編碼器具體參數(shù)的選擇
該編碼器使用main檔次,I、B、P幀量化值分別為26、31、29,流控參數(shù)選為CBR。IDR幀間隔設(shè)為50,B幀間隔為2幀。這樣的選擇是為了在速度和運(yùn)算量上取折中。選用B幀并將其量化值加大,可比baseline檔次、IPPP結(jié)構(gòu)提高約10%的壓縮率。而B(niǎo)幀的計(jì)算量,因其不用做參考幀,故無(wú)需進(jìn)行去塊濾波和插值計(jì)算,在31的qp下,很多塊會(huì)被判做skip模式編碼,因而多數(shù)時(shí)B幀總運(yùn)算量候反而較P幀低。
2.2.2.2 算法層次的優(yōu)化
算法層次的優(yōu)化主要是指在參數(shù)選定的情況下,對(duì)部分算法所作的替換或優(yōu)化。和參數(shù)的選擇一樣,算法層次優(yōu)化也主要受優(yōu)化策略的指導(dǎo)。如運(yùn)動(dòng)匹配準(zhǔn)則是選用SSD、SAD或SATD。如果只看中準(zhǔn)確程度,則選擇SSD最佳;如果只看中運(yùn)行速度,則選擇SAD最佳;如果要兼顧二者,則選用SATD是比較好的一個(gè)方案。在進(jìn)行算法優(yōu)化時(shí)還應(yīng)該注意一個(gè)問(wèn)題,即要考慮實(shí)際運(yùn)行平臺(tái)的支持情況。如在追求速度的策略下,匹配準(zhǔn)則選用SAD,如果只計(jì)算一半的點(diǎn)則會(huì)大大降低運(yùn)算速度。但是如果考慮ADSP-BF561匯編指令的設(shè)計(jì)情況,就會(huì)發(fā)現(xiàn)這樣做反而會(huì)增加指令數(shù),會(huì)使速度更低。算法層次優(yōu)化包括如下幾個(gè)部分:
(1)除法求余。改進(jìn)策略是浮點(diǎn)型算法盡量改為整型,64位盡量改為32位,32位盡量改為16位。而對(duì)于某些計(jì)算比較多的,則改為查表計(jì)算。在ADSP-BF561平臺(tái)上,一次32位整形除法需耗時(shí)300個(gè)CYCLE,而查表僅需幾個(gè)CYCLE,這樣的改進(jìn)能顯著提高速度。
(2)飽和函數(shù)。在視頻的計(jì)算中,幾乎每次像素的計(jì)算都會(huì)調(diào)用飽和函數(shù),X264代碼的實(shí)現(xiàn)中已將這部分代碼改為查表函數(shù),在其他的編解碼器實(shí)現(xiàn)中也有將這部分改為一個(gè)判斷和幾個(gè)邏輯運(yùn)算的形式。對(duì)大部分DSP平臺(tái),采用判斷跳轉(zhuǎn)會(huì)打斷流水線,即使平臺(tái)有比較好的跳轉(zhuǎn)預(yù)測(cè)功能,打斷流水仍然會(huì)造成stall。所以查表方法是一種高效方法。而在ADSP-BF561匯編指令中,可以通過(guò)設(shè)置指令后綴或使用某些特殊指令來(lái)進(jìn)行飽和工作。甚至不用查表,在不同的場(chǎng)合使用不同的飽和算法能大大提高代碼的執(zhí)行效率。
(3)MC部分函數(shù)。實(shí)測(cè)中發(fā)現(xiàn)MC部分函數(shù)運(yùn)行效率不如ffmpeg解碼器中MC部分效率高,所以將這部分代碼用ffmpeg中的相應(yīng)部分替換。此外qpel16_hv函數(shù)中計(jì)算有冗余,減少這些冗余能提高代碼運(yùn)行效率。
(4)算法替代和改進(jìn)。幀間預(yù)測(cè)的改進(jìn):關(guān)于算法的改進(jìn)主要集中在對(duì)me(motion estimation)的改進(jìn)上,流程如圖2所示。costmin1=min(cost16,cost8,cost16×8,cost8×16),costmin2=min(costmin1,costsub),依次在16×16、8×8、16×8和8×16大小宏塊的整像素位置做預(yù)測(cè),再做次像素估計(jì)和幀內(nèi)預(yù)測(cè),選用匹配準(zhǔn)則函數(shù)(采用sad作為匹配準(zhǔn)則函數(shù))取得最小值的模式進(jìn)行編碼。每計(jì)算一種模式,都將sad值與一個(gè)經(jīng)驗(yàn)閥值做比較。當(dāng)sad值小于這個(gè)閥值時(shí),立即結(jié)束運(yùn)動(dòng)估計(jì),從而減少運(yùn)算量。本文引用地址:http://butianyuan.cn/article/166951.htm
幀內(nèi)預(yù)測(cè)的改進(jìn):H.264標(biāo)準(zhǔn)所采用的幀內(nèi)預(yù)測(cè)模式除了DC模式都具有方向性,相鄰4×4塊都具有相關(guān)性。根據(jù)這樣的相關(guān)性,只將當(dāng)前4×4塊上邊和左邊選用預(yù)測(cè)模式及其相鄰的兩種預(yù)測(cè)模式作為當(dāng)前4×4塊的預(yù)測(cè)模式,當(dāng)其閥值都大于一個(gè)經(jīng)驗(yàn)閥值時(shí),才采用DC模式。這樣的方案不用一一計(jì)算9種預(yù)測(cè)模式,在復(fù)雜度、編碼效率、質(zhì)量和速度上取了一個(gè)折中。流程如圖3所示。
評(píng)論