摘要 :視頻編解碼系統(tǒng)一般的實現(xiàn)可以采用DSP,ASIC專用芯片,F(xiàn)PGA可編程邏輯芯片,基于DSP處理器設計的系統(tǒng)具備易于升級,易于擴展等優(yōu)點所以在視頻系統(tǒng)設計中被大量采用。TI DAVINCI 6446處理器是TI公司最新的雙核視頻處理芯片,TI公司提供一種基于CODE ENGINE的API機制封裝了復雜的DSP的編解碼接口,給ARM應用程序提供一種簡單明了的系統(tǒng)調用來實現(xiàn)視頻的處理,但是同時這種機制也存在一個問題,就是如果要對機制本身進行一些修改或者擴展,添加自定義的接口或者算法,需要開發(fā)者去深入了解復雜的code engine機制,成都宇鴻科技提出一種跳過code engine機制,直接使用coff文件加載雙核中的dsp處理器,直接根據(jù)共享內存實現(xiàn)arm和DSP的通信。DSP直接運行一些開源的編解碼算法比如XVID,或者T264。該方法具備算法移植簡單,arm和dsp接口自定義,
系統(tǒng)框架非常簡單的優(yōu)點。本文提出的DAVINCI 開發(fā)系統(tǒng)開發(fā)的時候只需要CCS開發(fā)工具和montvista的linux arm編譯環(huán)境,整個產(chǎn)品開發(fā)可以不需要仿真器的參與。
實現(xiàn):
1:DSP的手動加載實現(xiàn)
在DAVINCIN 6446雙核處理器出來之前的DM642或者不含arm的davinci DM6437芯片都是可以通過PCI 和HPI接口進行DSP程序的加載的,首先開發(fā)者使用CCS工具生成目標coff文件,通過TI提供的BIN文件轉換工具轉換成二進制的加載文件。加載程序DSPboot讀取該文件,把文件中的每一個程序段根據(jù)相應的加載地址加載到DSP的內存空間或者L2RAM,最后把處于RESET狀態(tài)的dsp 恢復運行,DSP從入口地址開始運行。
Dsp加載的流程如下:
2:視頻編碼算法的移植
本文以XVID在DAVINCI 6446上的移植為例子,展示如何用CCS編譯生成在DSP上的可執(zhí)行代碼。
1:首先新建一個CCS工程,并且把所有的XVID的c源碼文件拷貝到工程的文件夾下面
編譯的時候有幾個問題:
2:沒有configure文件,需要用戶手動在portb。h中加入了以下的定義:
#define ARCH_IS_GENERIC #define ARCH_IS_32BIT #define ARCH_IS_LITTLE_ENDIAN
3:ccs不允許數(shù)組初始化的時候用變量,改變一下數(shù)組的代碼編寫方式編譯通過。
4:很多函數(shù)沒有定義,是c標準庫,目前加的是 rts6400_eh.lib
按照上述步驟編譯XVID
接下來就是編寫系統(tǒng)的內存分布CMD文件,可以參考ti的example目錄下的CMD文件編寫,在剛開始的時候可以直接把所有的段都映射到DDR內存里面。
3:視頻編碼算法的優(yōu)化
有關xvid或者T264等開源軟件的優(yōu)化,網(wǎng)絡上已經(jīng)有很多資料,這里不多說,主要原則有以下幾點:
1:對XVID 的一些針對PC的特性進行裁減,使之適合嵌入式編碼器。
2:對xvid的代碼進行線性匯編優(yōu)化,比如核心的DCT IDCT運算,計算運動向量的SAD計算函數(shù)。
3:充分利用DSP的EDMA技術,把當前dsp運算需要的數(shù)據(jù)搬移到運行速度快的L2Ram中,同時在后臺用EDMA準備下次DSP運算所需要的數(shù)據(jù),這樣時鐘讓dsp核心在CACHE中找到可以使用的內存,大大提供整個系統(tǒng)的并成程度。
Xvid不經(jīng)過任何優(yōu)化的情況下,一秒種大概只編譯1/3幀左右,經(jīng)過良好的優(yōu)化,在一個DAVINCI 處理器上實現(xiàn)4路cif或者1路D1的實時編碼是完全可行的。
4:基于共享內存的arm和dsp交互設計
利用前面CCS生成的dsp二進制代碼,就可以利用dspboot加載工具讓dsp開始運行。接下來就是需要設計arm和dsp如何進行數(shù)據(jù)交互,要完成一個圖像的編碼,xvid需要幾個參數(shù):
1:YUV原始數(shù)據(jù)的輸入: 2:編碼后的MPEG4數(shù)據(jù)的輸出。 3:編碼的參數(shù)控制。
整個系統(tǒng)實現(xiàn)主要由以下任務完成:
1:采集線程:
負責從驅動視頻AD techwell系統(tǒng)或者TI TVP系列,然后送入davinci的bt656接口,最后通過resize 得到所需要編碼的分辨率,本文以CIF 352*288分辨率為例。
最后采集線程把resize以后的原始輸入數(shù)據(jù)寫入一個固定的內存比如 0x83c00000;
2:dsp 編碼線程:
Dsp運行一個死循環(huán),每次循環(huán)開始先從0x83c00000地址處讀大小為352*28*2大小的數(shù)據(jù)拷貝到自己的編碼緩沖區(qū),然后執(zhí)行encode_main 函數(shù)完成一次圖像的編碼,然后把編碼后的數(shù)據(jù)輸出的固定內存比如0x83e00000;并且同時做上標記DSP已經(jīng)完成一次編碼。
3:ARM 端處理線程:
Arm只負責編碼后的數(shù)據(jù)的網(wǎng)絡發(fā)送或者系統(tǒng)存儲,arm端判斷去0x83e00000處的內存是否有dsp編碼后的數(shù)據(jù),如果有則通過網(wǎng)絡發(fā)送到指定的客戶端電腦去,由電腦實現(xiàn)視頻的解碼和顯示。
5:PC端客戶端軟件的實現(xiàn):
Pc端客戶端軟件的實現(xiàn)主要參考XVID的解碼例子,最后把解碼后的數(shù)據(jù)通過direct draw或者其他方式實現(xiàn)。
6:3G的實現(xiàn)
利用成都宇鴻科技本身的3G驅動技術,實現(xiàn)在davinci上的USB 的3G上網(wǎng)卡的驅動,同時配合VPN可以實現(xiàn)在外網(wǎng)通過IP訪問內置在視頻服務器上的web對路由器進行設置和狀態(tài)查詢,同時可設置基于時間的定時撥號機制,實現(xiàn)7*24小時的無人值守工作環(huán)境。
|