|
摘要 :視頻編解碼係統一般的實現可以采用DSP,ASIC專用芯片,FPGA可編程邏輯芯片,基於DSP處理器設計的係統具備易於升級,易於擴展等優點所以在視頻係統設計中被大量采用。TI DAVINCI 6446處理器是TI公司最新的雙核視頻處理芯片,TI公司提供一種基於CODE ENGINE的API機製封裝了複雜的DSP的編解碼接口,給ARM應ying用yong程cheng序xu提ti供gong一yi種zhong簡jian單dan明ming了le的de係xi統tong調tiao用yong來lai實shi現xian視shi頻pin的de處chu理li,但dan是shi同tong時shi這zhe種zhong機ji製zhi也ye存cun在zai一yi個ge問wen題ti,就jiu是shi如ru果guo要yao對dui機ji製zhi本ben身shen進jin行xing一yi些xie修xiu改gai或huo者zhe擴kuo展zhan,添tian加jia自zi定ding義yi的de接jie口kou或huo者zhe算suan法fa,需xu要yao開kai發fa者zhe去qu深shen入ru了le解jie複fu雜za的decode engine機製,成都宇鴻科技提出一種跳過code engine機製,直接使用coff文件加載雙核中的dsp處理器,直接根據共享內存實現arm和DSP的通信。DSP直接運行一些開源的編解碼算法比如XVID,或者T264。該方法具備算法移植簡單,arm和dsp接口自定義,
係統框架非常簡單的優點。本文提出的DAVINCI 開發係統開發的時候隻需要CCS開發工具和montvista的linux arm編譯環境,整個產品開發可以不需要仿真器的參與。
實現:
1:DSP的手動加載實現
在DAVINCIN 6446雙核處理器出來之前的DM642或者不含arm的davinci DM6437芯片都是可以通過PCI 和HPI接口進行DSP程序的加載的,首先開發者使用CCS工具生成目標coff文件,通過TI提供的BIN文件轉換工具轉換成二進製的加載文件。加載程序DSPboot讀取該文件,把文件中的每一個程序段根據相應的加載地址加載到DSP的內存空間或者L2RAM,最後把處於RESET狀態的dsp 恢複運行,DSP從入口地址開始運行。
Dsp加載的流程如下:
2:視頻編碼算法的移植
本文以XVID在DAVINCI 6446上的移植為例子,展示如何用CCS編譯生成在DSP上的可執行代碼。
1:首先新建一個CCS工程,並且把所有的XVID的c源碼文件拷貝到工程的文件夾下麵
編譯的時候有幾個問題:
2:沒有configure文件,需要用戶手動在portb。h中加入了以下的定義:
#define ARCH_IS_GENERIC #define ARCH_IS_32BIT #define ARCH_IS_LITTLE_ENDIAN
3:ccs不允許數組初始化的時候用變量,改變一下數組的代碼編寫方式編譯通過。
4:很多函數沒有定義,是c標準庫,目前加的是 rts6400_eh.lib
按照上述步驟編譯XVID
接下來就是編寫係統的內存分布CMD文件,可以參考ti的example目錄下的CMD文件編寫,在剛開始的時候可以直接把所有的段都映射到DDR內存裏麵。
3:視頻編碼算法的優化
有關xvid或者T264等開源軟件的優化,網絡上已經有很多資料,這裏不多說,主要原則有以下幾點:
1:對XVID 的一些針對PC的特性進行裁減,使之適合嵌入式編碼器。
2:對xvid的代碼進行線性彙編優化,比如核心的DCT IDCT運算,計算運動向量的SAD計算函數。
3:充分利用DSP的EDMA技術,把當前dsp運算需要的數據搬移到運行速度快的L2Ram中,同時在後台用EDMA準備下次DSP運算所需要的數據,這樣時鍾讓dsp核心在CACHE中找到可以使用的內存,大大提供整個係統的並成程度。
Xvid不經過任何優化的情況下,一秒種大概隻編譯1/3幀左右,經過良好的優化,在一個DAVINCI 處理器上實現4路cif或者1路D1的實時編碼是完全可行的。
4:基於共享內存的arm和dsp交互設計
利用前麵CCS生成的dsp二進製代碼,就可以利用dspboot加載工具讓dsp開始運行。接下來就是需要設計arm和dsp如何進行數據交互,要完成一個圖像的編碼,xvid需要幾個參數:
1:YUV原始數據的輸入: 2:編碼後的MPEG4數據的輸出。 3:編碼的參數控製。
整個係統實現主要由以下任務完成:
1:采集線程:
負責從驅動視頻AD techwell係統或者TI TVP係列,然後送入davinci的bt656接口,最後通過resize 得到所需要編碼的分辨率,本文以CIF 352*288分辨率為例。
最後采集線程把resize以後的原始輸入數據寫入一個固定的內存比如 0x83c00000;
2:dsp 編碼線程:
Dsp運行一個死循環,每次循環開始先從0x83c00000地址處讀大小為352*28*2大小的數據拷貝到自己的編碼緩衝區,然後執行encode_main 函數完成一次圖像的編碼,然後把編碼後的數據輸出的固定內存比如0x83e00000;並且同時做上標記DSP已經完成一次編碼。
3:ARM 端處理線程:
Arm隻負責編碼後的數據的網絡發送或者係統存儲,arm端判斷去0x83e00000處的內存是否有dsp編碼後的數據,如果有則通過網絡發送到指定的客戶端電腦去,由電腦實現視頻的解碼和顯示。
5:PC端客戶端軟件的實現:
Pc端客戶端軟件的實現主要參考XVID的解碼例子,最後把解碼後的數據通過direct draw或者其他方式實現。
6:3G的實現
利用成都宇鴻科技本身的3G驅動技術,實現在davinci上的USB 的3G上網卡的驅動,同時配合VPN可以實現在外網通過IP訪問內置在視頻服務器上的web對路由器進行設置和狀態查詢,同時可設置基於時間的定時撥號機製,實現7*24小時的無人值守工作環境。
|