基于TMS320DM3730的H.264編碼器移植與優(yōu)化方法研究
在CCS環(huán)境下分別建立兩個(gè)工程:靜態(tài)庫工程Libx264.pjt和可執(zhí)行工程x264.pjt。靜態(tài)庫工程Libx264.pjt包含x.264編碼所需要的絕大部分的函數(shù),編譯鏈接生成可進(jìn)行調(diào)用的Libx264.lib文件??蓤?zhí)行工程x264.pjit工程是x264編碼程序的主體的框架,包括編碼參數(shù)的初始化、文件的輸入輸出以及圖像的編碼循環(huán)等主函數(shù)實(shí)現(xiàn)部分。該工程添加對(duì)Libx264.lib文件的引用,最終編譯鏈接生成x264.out可執(zhí)行文件。
2.2 CCS中編譯選項(xiàng)的設(shè)置
在CCS4.2平臺(tái)下必須對(duì)Libx264.pjt和x264.pjt工程設(shè)置合適編譯選項(xiàng):
1)DM3730的DSP核為C64x+版本,故目標(biāo)處理器版本選項(xiàng)選擇為-mv64004+
2)編譯器默認(rèn)的內(nèi)存模式為Near模式,而在Near模式下要求.BSS段必須小于32 kB,.BSS段存取的是工程中的全局變量和靜態(tài)變量,x264工程中的全局變量和靜態(tài)變量已經(jīng)遠(yuǎn)大于32 kB,故將Data access model和Const access model設(shè)置為Far。
3)在DM3730中使用的是小端模式的字節(jié)存儲(chǔ)即低位字節(jié)先存儲(chǔ),故在CCS4.2中Device Endianess(設(shè)備字節(jié)存儲(chǔ)次序)設(shè)置為little-endian。
2.3 算法的剪裁
1)MMX、SSE匯編指令的去除
在x264中有很多計(jì)算量大的函數(shù)例如DCT變換、運(yùn)動(dòng)估計(jì)、量化等都是使用MMX、SSE匯編指令進(jìn)行實(shí)現(xiàn)的,但是這些匯編都是針對(duì)X86平臺(tái)、AMD平臺(tái),在DSP的結(jié)構(gòu)下不能用,需要?jiǎng)h除這些匯編實(shí)現(xiàn)文件,并將宏定義_HAVE_MMX_進(jìn)行刪除。
2)精簡代碼
考慮到x264的編碼的效率,采用了H.264中的baseline級(jí)別進(jìn)行編碼,去除了CABAC(基于內(nèi)容的自適應(yīng)二進(jìn)制編碼)和B幀(雙向預(yù)測(cè)幀)這兩個(gè)特性。這樣雖然一定程度上增加了編碼的碼率,但是對(duì)編碼速度的提高很明顯。編碼采用固定量化參數(shù),不使用碼率控制,保留所有幀內(nèi)預(yù)測(cè)模式和幀間預(yù)測(cè)分塊模式進(jìn)行編碼,同時(shí)去除x264的多余的打印信息和help信息以提高編碼速度。
2. 4 函數(shù)、數(shù)據(jù)類型的修改
在編譯過程中函數(shù)名為isfinite的函數(shù)會(huì)出現(xiàn)重定義的錯(cuò)誤,原因是在CCS4.2包含的頭文件中對(duì)該函數(shù)名有定義的,而x264中也有對(duì)其的定義,只需要將函數(shù)名進(jìn)行修改一些即可。
同時(shí)由于硬件平臺(tái)的差異,C語言中有些數(shù)據(jù)類型對(duì)應(yīng)的字節(jié)長也會(huì)有差異的,為了讓程序更好的兼容硬件平臺(tái),x264程序使用了通用的數(shù)據(jù)類型定義。通用數(shù)據(jù)類型一般在stdint.h中定義,VC++中并沒有提供通用數(shù)據(jù)類型,而CCS中則提供了stdint.h,同時(shí)它包含于intty pe.h中,故移植到CCS中時(shí)應(yīng)該包含#includeinttype.h>。
2.5 內(nèi)存的分配
x264程序中存在很多使用malloc進(jìn)行動(dòng)態(tài)的內(nèi)存分配,這樣會(huì)大大提高占用堆棧的大小,應(yīng)該盡量的將動(dòng)態(tài)內(nèi)存分配使用靜態(tài)的數(shù)組進(jìn)行替代。同時(shí)在嵌入式系統(tǒng)中,合理的分配堆棧的大小對(duì)一個(gè)程序也是相當(dāng)重要的。由于x264中動(dòng)態(tài)內(nèi)存的申請(qǐng)、靜態(tài)的表格數(shù)組和全局變量比較多,故在cmd文件中對(duì)堆棧的大小定義設(shè)為:
-stack 0x8000
-heap 0x400000
同時(shí)將x264程序中的代碼和數(shù)據(jù)的段地址全部放置到外部寄存器中。
3 x264編碼器的優(yōu)化
x264成功移植后在DM3730上進(jìn)行CIF(通用影像傳輸格式)格式圖像編碼測(cè)試,平均編碼速度只有1fps(幀每秒)左右,離實(shí)時(shí)編碼差距很大,需要對(duì)x264編碼器進(jìn)行優(yōu)化工作。優(yōu)化的方法包括編譯器優(yōu)化、內(nèi)存優(yōu)化、C語言優(yōu)化和匯編優(yōu)化。
3.1 編譯器優(yōu)化
在使用C編譯器連接和生成最終DSP可執(zhí)行代碼時(shí),CCS上的C編譯器擁有非常出色的優(yōu)化性能,可以通過設(shè)置編譯優(yōu)化選項(xiàng)進(jìn)行編譯器的自我優(yōu)化。表1所示是CCS4.2中一些優(yōu)化選項(xiàng)及其功能列表。
通過對(duì)程序速度性能的要求和代碼結(jié)構(gòu)的考慮,最終選擇的編譯選項(xiàng)為:-mv6400+ -pm -o3 -op3 -mf3 -mt。
3.2 內(nèi)存優(yōu)化
DSP的內(nèi)部存儲(chǔ)器和外部存儲(chǔ)器由于總線頻率的限制所以存在較大的讀取速度差異,DM3730中片上內(nèi)存的訪問頻率為300 MHZ,而對(duì)SDRAM的訪問頻率最高為133 MHZ,若利用靜態(tài)地址分配將一些使用頻繁而比較大的結(jié)構(gòu)體或數(shù)組指定到片上內(nèi)存中,那樣程序的運(yùn)行速度將會(huì)得到很大的提高。故可以將一些使用頻繁的動(dòng)態(tài)內(nèi)存分配改為靜態(tài)內(nèi)存分配,然后將靜態(tài)分配的常用的數(shù)據(jù)結(jié)構(gòu)比如幀存儲(chǔ)區(qū)利用DATA_SECTION指定段地址,通過.cmd文件將指定的段放置到片上內(nèi)存中。
3.3 C語富代碼的優(yōu)化
1)使用內(nèi)聯(lián)函數(shù)
CCS的C6000編譯器提供了一些經(jīng)過匯編優(yōu)化的C內(nèi)聯(lián)函數(shù),可以使用這些內(nèi)聯(lián)函數(shù)替換x264中的相應(yīng)函數(shù),提高程序的運(yùn)行速度。在x264中使用的內(nèi)聯(lián)函數(shù)有:_abs()、_amem4()、_amem4_const()、_pack2()、_paek14()、_min2()、_max2()、_dotpu4()等。
2)使用數(shù)據(jù)對(duì)齊指令DATA_ALIGN
數(shù)據(jù)對(duì)齊指令的完整的語法是:
#pragma DATA_ALIGN(symbol,constant)
評(píng)論