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