<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 基于TMS320DM3730的H.264編碼器移植與優(yōu)化方法研究

基于TMS320DM3730的H.264編碼器移植與優(yōu)化方法研究

作者: 時(shí)間:2013-05-18 來(lái)源:網(wǎng)絡(luò ) 收藏
2.1 CCS工程的建立
在CCS環(huán)境下分別建立兩個(gè)工程:靜態(tài)庫工程Libx264.pjt和可執行工程x264.pjt。靜態(tài)庫工程Libx264.pjt包含x.264編碼所需要的絕大部分的函數,編譯鏈接生成可進(jìn)行調用的Libx264.lib文件??蓤绦泄こ蘹264.pjit工程是x264編碼程序的主體的框架,包括編碼參數的初始化、文件的輸入輸出以及圖像的編碼循環(huán)等主函數實(shí)現部分。該工程添加對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段存取的是工程中的全局變量和靜態(tài)變量,x264工程中的全局變量和靜態(tài)變量已經(jīng)遠大于32 kB,故將Data access model和Const access model設置為Far。
3)在DM3730中使用的是小端模式的字節存儲即低位字節先存儲,故在CCS4.2中Device Endianess(設備字節存儲次序)設置為little-endian。
2.3 算法的剪裁
1)MMX、SSE匯編指令的去除
在x264中有很多計算量大的函數例如DCT變換、運動(dòng)估計、量化等都是使用MMX、SSE匯編指令進(jìn)行實(shí)現的,但是這些匯編都是針對X86平臺、AMD平臺,在DSP的結構下不能用,需要刪除這些匯編實(shí)現文件,并將宏定義_HAVE_MMX_進(jìn)行刪除。
2)精簡(jiǎn)代碼
考慮到x264的編碼的效率,采用了中的baseline級別進(jìn)行編碼,去除了CABAC(基于內容的自適應二進(jìn)制編碼)和B幀(雙向預測幀)這兩個(gè)特性。這樣雖然一定程度上增加了編碼的碼率,但是對編碼速度的提高很明顯。編碼采用固定量化參數,不使用碼率控制,保留所有幀內預測模式和幀間預測分塊模式進(jìn)行編碼,同時(shí)去除x264的多余的打印信息和help信息以提高編碼速度。
2. 4 函數、數據類(lèi)型的修改
在編譯過(guò)程中函數名為isfinite的函數會(huì )出現重定義的錯誤,原因是在CCS4.2包含的頭文件中對該函數名有定義的,而x264中也有對其的定義,只需要將函數名進(jìn)行修改一些即可。
同時(shí)由于硬件平臺的差異,C語(yǔ)言中有些數據類(lèi)型對應的字節長(cháng)也會(huì )有差異的,為了讓程序更好的兼容硬件平臺,x264程序使用了通用的數據類(lèi)型定義。通用數據類(lèi)型一般在stdint.h中定義,VC++中并沒(méi)有提供通用數據類(lèi)型,而CCS中則提供了stdint.h,同時(shí)它包含于intty pe.h中,故移植到CCS中時(shí)應該包含#includeinttype.h>。
2.5 內存的分配
x264程序中存在很多使用malloc進(jìn)行動(dòng)態(tài)的內存分配,這樣會(huì )大大提高占用堆棧的大小,應該盡量的將動(dòng)態(tài)內存分配使用靜態(tài)的數組進(jìn)行替代。同時(shí)在嵌入式系統中,合理的分配堆棧的大小對一個(gè)程序也是相當重要的。由于x264中動(dòng)態(tài)內存的申請、靜態(tài)的表格數組和全局變量比較多,故在cmd文件中對堆棧的大小定義設為:
-stack 0x8000
-heap 0x400000
同時(shí)將x264程序中的代碼和數據的段地址全部放置到外部寄存器中。

3 x264的優(yōu)化
x264成功移植后在DM3730上進(jìn)行CIF(通用影像傳輸格式)格式圖像編碼測試,平均編碼速度只有1fps(幀每秒)左右,離實(shí)時(shí)編碼差距很大,需要對x264進(jìn)行優(yōu)化工作。優(yōu)化的方法包括編譯器優(yōu)化、內存優(yōu)化、C語(yǔ)言?xún)?yōu)化和匯編優(yōu)化。
3.1 編譯器優(yōu)化
在使用C編譯器連接和生成最終DSP可執行代碼時(shí),CCS上的C編譯器擁有非常出色的優(yōu)化性能,可以通過(guò)設置編譯優(yōu)化選項進(jìn)行編譯器的自我優(yōu)化。表1所示是CCS4.2中一些優(yōu)化選項及其功能列表。

c.JPG


通過(guò)對程序速度性能的要求和代碼結構的考慮,最終選擇的編譯選項為:-mv6400+ -pm -o3 -op3 -mf3 -mt。
3.2 內存優(yōu)化
DSP的內部存儲器和外部存儲器由于總線(xiàn)頻率的限制所以存在較大的讀取速度差異,DM3730中片上內存的訪(fǎng)問(wèn)頻率為300 MHZ,而對SDRAM的訪(fǎng)問(wèn)頻率最高為133 MHZ,若利用靜態(tài)地址分配將一些使用頻繁而比較大的結構體或數組指定到片上內存中,那樣程序的運行速度將會(huì )得到很大的提高。故可以將一些使用頻繁的動(dòng)態(tài)內存分配改為靜態(tài)內存分配,然后將靜態(tài)分配的常用的數據結構比如幀存儲區利用DATA_SECTION指定段地址,通過(guò).cmd文件將指定的段放置到片上內存中。
3.3 C語(yǔ)富代碼的優(yōu)化
1)使用內聯(lián)函數
CCS的C6000編譯器提供了一些經(jīng)過(guò)匯編優(yōu)化的C內聯(lián)函數,可以使用這些內聯(lián)函數替換x264中的相應函數,提高程序的運行速度。在x264中使用的內聯(lián)函數有:_abs()、_amem4()、_amem4_const()、_pack2()、_paek14()、_min2()、_max2()、_dotpu4()等。
2)使用數據對齊指令DATA_ALIGN
數據對齊指令的完整的語(yǔ)法是:
#pragma DATA_ALIGN(symbol,constant)



關(guān)鍵詞: TMS320DM3730 H.264 編碼器

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>