|
摘要 :視頻編解碼系統一般的實現可以采用DSP,ASIC專用芯片,FPGA可編程邏輯芯片,基于DSP處理器設計的系統具備易于升級,易于擴展等優點所以在視頻系統設計中被大量采用。TI DAVINCI 6446處理器是TI公司最新的雙核視頻處理芯片,TI公司提供一種基于CODE ENGINE的API機制封裝了復雜的DSP的編解碼接口,給ARM應用程序提供一種簡單明了的系統調用來實現視頻的處理,但是同時這種機制也存在一個問題,就是如果要對機制本身進行一些修改或者擴展,添加自定義的接口或者算法,需要開發者去深入了解復雜的code 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小時的無人值守工作環境。
|