基于DM642DSP的視頻編碼優(yōu)化方法
引言
當(dāng)前在視頻監(jiān)控,視頻會議,網(wǎng)絡(luò)流媒體等方面數(shù)字視頻編碼成為最核心,最基本的技術(shù)手段,尤其是視頻監(jiān)控現(xiàn)已成為最為普通的安保設(shè)備之一?;陔娔X硬盤為存儲體的數(shù)字DVR已日漸取代模擬DVR。數(shù)字DVR的最關(guān)鍵技術(shù)就是視頻壓縮技術(shù),而視頻壓縮技術(shù)又含有兩大選擇。首先是視頻壓縮采用何種算法標(biāo)準(zhǔn),當(dāng)前視頻算法的國際標(biāo)準(zhǔn)有MPEG2、MPEG4、H.264,H.264以其高壓縮效率,在低碼率下優(yōu)良的圖像質(zhì)量成為目前視頻監(jiān)控系統(tǒng)中首選的壓縮方式。
但任何事物都有其兩面性,H.264編碼的高效率,優(yōu)質(zhì)圖像是用算法的復(fù)雜性來換取的。H.264編碼器的復(fù)雜性是MPEG2的4-5倍。第二個選擇是用什么芯片來實現(xiàn),TI公司的TMS320DM642芯片,是一款專門用作媒體處理的高速DSP,其強(qiáng)大的圖像處理能力為在監(jiān)控系統(tǒng)中實時實現(xiàn)H.264編碼提供了可能。為了降低成本,還必須充分運(yùn)用DM642本身的資源,使一顆DM642能處理更多路的視頻,這就是高效率優(yōu)化的目的,本文首先對整個視頻監(jiān)控的硬件平臺做了介紹,后結(jié)合DM642的結(jié)構(gòu)特點(diǎn),提出整個編碼軟件的框架的安排,對于占用系統(tǒng)資源最多的運(yùn)動估計提出基于DSP的優(yōu)化方法,最后以整數(shù)DCT為例,討論了編寫匯編代碼的技巧。
硬件平臺的介紹
整個視頻監(jiān)控的硬件系統(tǒng)的框架如圖1所示。DM642芯片為了適應(yīng)數(shù)字媒體處理的需求,增加了三個可配置的視頻端口(VP0,VP1,和VP2),這些視頻口外設(shè)為常用的編解碼設(shè)備提供了無縫接口。因而不需要外加可編程邏輯器件和FIFO就可滿足系統(tǒng)設(shè)計的要求。
為了節(jié)省成本,提高DSP芯片的利用率,在一塊板卡可以同時處理多路的音視頻,壓縮卡與主機(jī)間的數(shù)據(jù)吞吐量會很大,為了保證數(shù)據(jù)存儲的實時性,系統(tǒng)采用PCI板卡,其與主機(jī)通信數(shù)據(jù)傳輸速率最高達(dá)528MB/s(66MHz,64bit),完全滿足大容量高速實時傳輸系統(tǒng)的需求。
圖1 硬件系統(tǒng)框架
由于每個視頻口可以接收兩路8/10bit的視頻信號,視頻信號經(jīng)過SAA7144A/D轉(zhuǎn)換輸出為8位BT.656格式的數(shù)字視頻數(shù)據(jù)。這樣就能利用一顆DM642芯片處理最多6路視頻輸入。每個視頻端口的BT.656視頻采集模式采集8bit或是10bit4:2:2格式的亮度和色度信號,并將它們復(fù)用到一個數(shù)據(jù)流里,視頻數(shù)據(jù)以Cb,Y,Cr,Y,Cb,Y,Cr的順序傳送,其中Cb,Y,Cr代表同一位置的亮度和色度樣點(diǎn),緊接著后面的Y代表下一個位置的亮度樣點(diǎn)。數(shù)據(jù)流經(jīng)解復(fù)用后亮度和色度信息分別存放到各自的Y,Cb,CrFIFO中,再經(jīng)EDMA搬移到SDRAM中,以備CPU讀取進(jìn)行壓縮編碼。編碼后的視頻流再經(jīng)PCI口存入到電腦的硬盤上,從而完成整個視頻監(jiān)控的流程。
編碼器整體框架的安排
JM代碼是很多可選的H.264標(biāo)準(zhǔn)軟件之一,它關(guān)心H.264全部的功能在代碼上得到體現(xiàn),所有的情況都得考慮,例如幀編碼,場編碼都有,內(nèi)存的分派沒有考慮到系統(tǒng)的實際情況,適合用來幫助理解H.264標(biāo)準(zhǔn),不太適合移植到DSP平臺上。為了高效的組織利用DM642有限的片內(nèi)資源,就得重新組織代碼,包括數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)存放的位置,程序存放的位置,精簡地來安排程序。
首先要考慮的是L2的配置問題,第二級L2(256kB)是一個統(tǒng)一的程序/數(shù)據(jù)空間,可以整體作為SRAM映射到存儲空間,也可整體作為第二級cache,或者二者的比例的組合使用。因為一旦二級緩存也不命中的話,那么讀取數(shù)據(jù)申請將轉(zhuǎn)由EDMA來完成,CPU至少有13個cycle的延遲。所以我們總是盡量把程序和數(shù)據(jù)放在片內(nèi)存儲器內(nèi)。但是即使全部將L2配置成SRAM也只有256kB大小,以CIF格式圖像為例,待編碼的一幀圖像大小是148.5kB,再加上運(yùn)動估計的參考圖像就大大超過256kB了。所以在配置L2時,筆者選擇的是SRAM224kB,L2cache32kB。首先考慮要放到SRAM的是表格,全局變量,棧數(shù)據(jù)和一些調(diào)用頻繁的核心程序,如運(yùn)動搜索,DCT變換,量化……而整個待編碼圖像和參考圖像就只能放在片外存儲空間了。
既然圖像數(shù)據(jù)被存放到了片外存儲空間中,就要涉及到數(shù)據(jù)在片內(nèi)存儲跟片外存儲間的數(shù)據(jù)搬移,這可交由DM642強(qiáng)大的EDMA引擎來完成,EDMA工作時不占用CPU的周期,把CPU從繁重的搬移數(shù)據(jù)的工作中解放出來,專致于運(yùn)算工作。在編碼程序時,為了避免CPU等待EDMA搬完數(shù)據(jù)后才能工作,可采用乒乓結(jié)構(gòu)的雙緩存區(qū),當(dāng)EDMA傳送數(shù)據(jù)到其中一塊存儲區(qū)域時,CPU對另一塊存儲區(qū)域進(jìn)行處理。待二者都處理完畢后,乒乓區(qū)域交換。
需要通過EDMA搬移的數(shù)據(jù)有待編碼的宏塊,前后幀對應(yīng)的參考宏塊,和編碼后的重構(gòu)宏塊(B幀不需要),這些宏塊都包括亮度塊和色度塊。EDMA在搬大量數(shù)據(jù)時才能將它的性能發(fā)揮到極致,如果每編完一個宏塊就進(jìn)行一次乒乓緩存交換,那么在頻繁的配置EDMA通道參數(shù)上就耗費(fèi)了過多的CPU周期。有限的片內(nèi)存儲空間,制約著不能一次搬太多的宏塊,一般一次搬7--9個宏塊為宜。由于EDMA的同步信息是由CPU發(fā)出的,我們自然想到QDMA,但QDMA適用于單個的,獨(dú)立的快速搬移數(shù)據(jù),對于這種周期性的,重復(fù)性的搬移并沒有優(yōu)勢。
為了提高EDMA的效率,可以采用EDMA鏈,最多開辟12個EDMA通道,讓其首尾相連,這樣只需觸發(fā)一次CPU,可將待編碼的亮度塊色度塊,參考幀的亮度塊和色度塊……一次搬完,如圖2所示。在配置EDMA通道時,我們注意到頻繁更換的只是EDMA的源地址和目的地址,而其它參量是不變的。由于EDMA控制器是基于RAM結(jié)構(gòu)的,每個通道是通過參數(shù)表來配置的,每一個通道的參數(shù)都可以在0x01A0000h~0x01A07ffh的2KB的配置表中找到自己固定的位置,所以在更新某一通道的源地址和目的地址時,直接往配置表寫上新地址就行了,而不必調(diào)用CSL庫中的相應(yīng)的cache函數(shù)來修改源地址和目的地址。
圖2 EDMA鏈?zhǔn)疽鈭D
圖3 六邊形搜索算法