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