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