引言
當(dāng)前在視頻監(jiān)控,視頻會(huì)議,網(wǎng)絡(luò)流媒體等方面數(shù)字視頻編碼成為最核心,最基本的技術(shù)手段,尤其是視頻監(jiān)控現(xiàn)已成為最為普通的安保設(shè)備之一?;?a target="_blank">電腦硬盤為存儲(chǔ)體的數(shù)字DVR已日漸取代模擬DVR。數(shù)字DVR的最關(guān)鍵技術(shù)就是視頻壓縮技術(shù),而視頻壓縮技術(shù)又含有兩大選擇。首先是視頻壓縮采用何種算法標(biāo)準(zhǔn),當(dāng)前視頻算法的國(guó)際標(biāo)準(zhǔn)有MPEG2、MPEG4、H.264,H.264以其高壓縮效率,在低碼率下優(yōu)良的圖像質(zhì)量成為目前視頻監(jiān)控系統(tǒng)中首選的壓縮方式。
但任何事物都有其兩面性,H.264編碼的高效率,優(yōu)質(zhì)圖像是用算法的復(fù)雜性來?yè)Q取的。H.264編碼器的復(fù)雜性是MPEG2的4-5倍。第二個(gè)選擇是用什么芯片來實(shí)現(xiàn),TI公司的TMS320DM642芯片,是一款專門用作媒體處理的高速DSP,其強(qiáng)大的圖像處理能力為在監(jiān)控系統(tǒng)中實(shí)時(shí)實(shí)現(xiàn)H.264編碼提供了可能。為了降低成本,還必須充分運(yùn)用DM642本身的資源,使一顆DM642能處理更多路的視頻,這就是高效率優(yōu)化的目的,本文首先對(duì)整個(gè)視頻監(jiān)控的硬件平臺(tái)做了介紹,后結(jié)合DM642的結(jié)構(gòu)特點(diǎn),提出整個(gè)編碼軟件的框架的安排,對(duì)于占用系統(tǒng)資源最多的運(yùn)動(dòng)估計(jì)提出基于DSP的優(yōu)化方法,最后以整數(shù)DCT為例,討論了編寫匯編代碼的技巧。
硬件平臺(tái)的介紹
整個(gè)視頻監(jiān)控的硬件系統(tǒng)的框架如圖1所示。DM642芯片為了適應(yīng)數(shù)字媒體處理的需求,增加了三個(gè)可配置的視頻端口(VP0,VP1,和VP2),這些視頻口外設(shè)為常用的編解碼設(shè)備提供了無縫接口。因而不需要外加可編程邏輯器件和FIFO就可滿足系統(tǒng)設(shè)計(jì)的要求。
為了節(jié)省成本,提高DSP芯片的利用率,在一塊板卡可以同時(shí)處理多路的音視頻,壓縮卡與主機(jī)間的數(shù)據(jù)吞吐量會(huì)很大,為了保證數(shù)據(jù)存儲(chǔ)的實(shí)時(shí)性,系統(tǒng)采用PCI板卡,其與主機(jī)通信數(shù)據(jù)傳輸速率最高達(dá)528MB/s(66MHz,64bit),完全滿足大容量高速實(shí)時(shí)傳輸系統(tǒng)的需求。
圖1 硬件系統(tǒng)框架
由于每個(gè)視頻口可以接收兩路8/10bit的視頻信號(hào),視頻信號(hào)經(jīng)過SAA7144A/D轉(zhuǎn)換輸出為8位BT.656格式的數(shù)字視頻數(shù)據(jù)。這樣就能利用一顆DM642芯片處理最多6路視頻輸入。每個(gè)視頻端口的BT.656視頻采集模式采集8bit或是10bit4:2:2格式的亮度和色度信號(hào),并將它們復(fù)用到一個(gè)數(shù)據(jù)流里,視頻數(shù)據(jù)以Cb,Y,Cr,Y,Cb,Y,Cr的順序傳送,其中Cb,Y,Cr代表同一位置的亮度和色度樣點(diǎn),緊接著后面的Y代表下一個(gè)位置的亮度樣點(diǎn)。數(shù)據(jù)流經(jīng)解復(fù)用后亮度和色度信息分別存放到各自的Y,Cb,CrFIFO中,再經(jīng)EDMA搬移到SDRAM中,以備CPU讀取進(jìn)行壓縮編碼。編碼后的視頻流再經(jīng)PCI口存入到電腦的硬盤上,從而完成整個(gè)視頻監(jiān)控的流程。
編碼器整體框架的安排
JM代碼是很多可選的H.264標(biāo)準(zhǔn)軟件之一,它關(guān)心H.264全部的功能在代碼上得到體現(xiàn),所有的情況都得考慮,例如幀編碼,場(chǎng)編碼都有,內(nèi)存的分派沒有考慮到系統(tǒng)的實(shí)際情況,適合用來幫助理解H.264標(biāo)準(zhǔn),不太適合移植到DSP平臺(tái)上。為了高效的組織利用DM642有限的片內(nèi)資源,就得重新組織代碼,包括數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)存放的位置,程序存放的位置,精簡(jiǎn)地來安排程序。
首先要考慮的是L2的配置問題,第二級(jí)L2(256kB)是一個(gè)統(tǒng)一的程序/數(shù)據(jù)空間,可以整體作為SRAM映射到存儲(chǔ)空間,也可整體作為第二級(jí)cache,或者二者的比例的組合使用。因?yàn)橐坏┒?jí)緩存也不命中的話,那么讀取數(shù)據(jù)申請(qǐng)將轉(zhuǎn)由EDMA來完成,CPU至少有13個(gè)cycle的延遲。所以我們總是盡量把程序和數(shù)據(jù)放在片內(nèi)存儲(chǔ)器內(nèi)。但是即使全部將L2配置成SRAM也只有256kB大小,以CIF格式圖像為例,待編碼的一幀圖像大小是148.5kB,再加上運(yùn)動(dòng)估計(jì)的參考圖像就大大超過256kB了。所以在配置L2時(shí),筆者選擇的是SRAM224kB,L2cache32kB。首先考慮要放到SRAM的是表格,全局變量,棧數(shù)據(jù)和一些調(diào)用頻繁的核心程序,如運(yùn)動(dòng)搜索,DCT變換,量化……而整個(gè)待編碼圖像和參考圖像就只能放在片外存儲(chǔ)空間了。
既然圖像數(shù)據(jù)被存放到了片外存儲(chǔ)空間中,就要涉及到數(shù)據(jù)在片內(nèi)存儲(chǔ)跟片外存儲(chǔ)間的數(shù)據(jù)搬移,這可交由DM642強(qiáng)大的EDMA引擎來完成,EDMA工作時(shí)不占用CPU的周期,把CPU從繁重的搬移數(shù)據(jù)的工作中解放出來,專致于運(yùn)算工作。在編碼程序時(shí),為了避免CPU等待EDMA搬完數(shù)據(jù)后才能工作,可采用乒乓結(jié)構(gòu)的雙緩存區(qū),當(dāng)EDMA傳送數(shù)據(jù)到其中一塊存儲(chǔ)區(qū)域時(shí),CPU對(duì)另一塊存儲(chǔ)區(qū)域進(jìn)行處理。待二者都處理完畢后,乒乓區(qū)域交換。
需要通過EDMA搬移的數(shù)據(jù)有待編碼的宏塊,前后幀對(duì)應(yīng)的參考宏塊,和編碼后的重構(gòu)宏塊(B幀不需要),這些宏塊都包括亮度塊和色度塊。EDMA在搬大量數(shù)據(jù)時(shí)才能將它的性能發(fā)揮到極致,如果每編完一個(gè)宏塊就進(jìn)行一次乒乓緩存交換,那么在頻繁的配置EDMA通道參數(shù)上就耗費(fèi)了過多的CPU周期。有限的片內(nèi)存儲(chǔ)空間,制約著不能一次搬太多的宏塊,一般一次搬7--9個(gè)宏塊為宜。由于EDMA的同步信息是由CPU發(fā)出的,我們自然想到QDMA,但QDMA適用于單個(gè)的,獨(dú)立的快速搬移數(shù)據(jù),對(duì)于這種周期性的,重復(fù)性的搬移并沒有優(yōu)勢(shì)。
為了提高EDMA的效率,可以采用EDMA鏈,最多開辟12個(gè)EDMA通道,讓其首尾相連,這樣只需觸發(fā)一次CPU,可將待編碼的亮度塊色度塊,參考幀的亮度塊和色度塊……一次搬完,如圖2所示。在配置EDMA通道時(shí),我們注意到頻繁更換的只是EDMA的源地址和目的地址,而其它參量是不變的。由于EDMA控制器是基于RAM結(jié)構(gòu)的,每個(gè)通道是通過參數(shù)表來配置的,每一個(gè)通道的參數(shù)都可以在0x01A0000h~0x01A07ffh的2KB的配置表中找到自己固定的位置,所以在更新某一通道的源地址和目的地址時(shí),直接往配置表寫上新地址就行了,而不必調(diào)用CSL庫(kù)中的相應(yīng)的cache函數(shù)來修改源地址和目的地址。
圖2 EDMA鏈?zhǔn)疽鈭D
圖3 六邊形搜索算法
快速運(yùn)動(dòng)算法的優(yōu)化
包括MPEG2,MPEG4和H.261、H.263、H264在內(nèi)的標(biāo)準(zhǔn)都是采取基于塊的運(yùn)動(dòng)估計(jì)模型。當(dāng)然不同的標(biāo)準(zhǔn)塊的大小也不一樣,在H.264標(biāo)準(zhǔn)中,支持七種塊大小(16x16、16x8、8x16、8x8、8x4、4x8、4x4)。眾所周知:運(yùn)動(dòng)估計(jì)對(duì)減少時(shí)間域的冗余起了很大的作用,從而能大大提高編碼效率,但同時(shí)它的計(jì)算量特別大,占用了大概整個(gè)編碼系統(tǒng)的70%~80%的資源。一個(gè)好的編碼算法就是要在計(jì)算量和編碼效率兩者之間取得一個(gè)很好的平衡。
全搜索(FS)能夠保證在全局范圍內(nèi)搜到一個(gè)最佳的位置,但是其計(jì)算量是驚人的。對(duì)于在嵌入式系統(tǒng)中應(yīng)用是不現(xiàn)實(shí)的。一般在實(shí)際應(yīng)用中都是把幾種算法結(jié)合起來,在本系統(tǒng)中采取的是:六邊形搜索法,如圖3所示,先以預(yù)測(cè)點(diǎn)為中心進(jìn)行大模式搜索,如果最優(yōu)點(diǎn)不在六邊形中心,則將六邊形的中心移至改點(diǎn),重復(fù)大模式搜索,直到最優(yōu)點(diǎn)在六邊形中點(diǎn),然后在這點(diǎn)切換到小模式搜索,此搜索法相對(duì)于經(jīng)典的三步法,四步法搜索的點(diǎn)更少。
由于是在DSP平臺(tái)上,對(duì)監(jiān)控系統(tǒng)實(shí)時(shí)性要求比較高,提出幾種基于DSP平臺(tái)的優(yōu)化方法:為了提高L1D的cache的命中率,根據(jù)cache不命中流水的原理,一次將參考幀全部灌入L1D內(nèi),然后在做運(yùn)動(dòng)估計(jì)時(shí)將七個(gè)宏塊一齊做,然后再做七個(gè)宏塊的運(yùn)動(dòng)補(bǔ)償,DCT,量化,反DCT,反量化,編碼,寫碼流。而不是像一般的步驟,對(duì)每一個(gè)宏塊先做運(yùn)動(dòng)估計(jì),然后運(yùn)動(dòng)補(bǔ)償,然后DCT,映射到L1D一次,如果每個(gè)宏塊單獨(dú)做,在做第一個(gè)宏塊運(yùn)動(dòng)估計(jì)時(shí)參考幀會(huì)由L2映射到L1D,做第二次運(yùn)動(dòng)估計(jì)時(shí),因?yàn)橹俺绦蜃鲞^DCT,量化等運(yùn)算,映射到L1D里的參考幀數(shù)據(jù)已經(jīng)被沖走,還得從L2中重新載入。同樣的對(duì)于程序段一級(jí)緩存L1P來說,DCT、量化、反DCT、反量化、編碼、寫碼流等函數(shù)都只需映射一次到L1P,而不必被反復(fù)地映射,沖掉,再次映射。
在JVT的提案中有很多運(yùn)動(dòng)矢量預(yù)測(cè)算法,如利用運(yùn)動(dòng)矢量在時(shí)間域有很強(qiáng)的相關(guān)性這一特性,我們能夠得到比較精確的起始搜索位置。但他不太適合DSP平臺(tái),因?yàn)檫@樣我們就要保留整個(gè)一幀的運(yùn)動(dòng)矢量,以CIF圖像格式為例,需要12kB的空間,保存在資源緊張的片內(nèi)顯然是不合適的。保存在片外存儲(chǔ)空間,調(diào)用的時(shí)候,先從片外先映射到L2cache,再?gòu)腖2映射到L1D,其間流水不命中等待的cycle數(shù),還不如從開始不太精確的初始位置多搜幾個(gè)點(diǎn)。
整數(shù)DCT的優(yōu)化詳解
DCT,量化,反DCT,反量化在整個(gè)編碼程序中占用了大概20%~25%的時(shí)間,所以有必要對(duì)他們的優(yōu)化花一番功夫,本文舉整數(shù)DCT為例說明如何對(duì)程序進(jìn)行匯編級(jí)的優(yōu)化。H.264采用的整數(shù)DCT,不僅滿足一般DCT的特性,將圖像的能量集中到左上角位置,直流系數(shù)和低頻系數(shù)中,還有它特有的幾個(gè)優(yōu)點(diǎn):
-它是整數(shù)變換,所有的運(yùn)算都是整數(shù)算法,變換矩陣系數(shù)十分簡(jiǎn)單,核心變換部分可以僅僅用加法和移位來實(shí)現(xiàn)。非常有利于在DSP實(shí)現(xiàn)。
-可以保證編碼端的變換和解碼端的反變換完全匹配,沒有誤差。
首先我們對(duì)變換矩陣做必要的調(diào)整,如表達(dá)式(1),(2)所示,這樣做的好處是行變換和列變換的操作完全一樣,簡(jiǎn)化了運(yùn)算。接下來就是用線性匯編或純匯編來實(shí)現(xiàn)兩個(gè)矩陣的相乘。
?
?
因?yàn)镈M642CPU有兩個(gè)類似的可進(jìn)行數(shù)據(jù)處理的通路A和B,每個(gè)通路有4個(gè)完全相同的運(yùn)算單元(.L,.S,.M,.D)我們可將矩陣的一四兩行的運(yùn)算放在A側(cè)進(jìn)行,二三兩行在B側(cè)進(jìn)行運(yùn)算,這樣可以保證A,B兩側(cè)可同時(shí)并行計(jì)算。由于整數(shù)DCT變換是在16比特精度下完成的,矩陣相乘我們自然會(huì)想到匯編指令DOTP2,但是不能全部用DOTP2來完成運(yùn)算,否則一個(gè)周期內(nèi)就只有.M單元在工作,而其他運(yùn)算單元都閑著。由于整數(shù)DCT矩陣系數(shù)的特殊性,我們完全可以用加法指令和移位指令來代替乘法指令。表1是一個(gè)16x16宏塊進(jìn)行DCT變換,匯編優(yōu)化前后的cycle數(shù)的對(duì)比。
表一 16x16宏塊DCT所需的周期數(shù)
在寫匯編指令時(shí)我們要盡量做到在同一個(gè)周期內(nèi),讓位于A,B兩側(cè)的8個(gè)運(yùn)算單元能夠同時(shí)工作,在做DCT時(shí)我們發(fā)現(xiàn)M單元不夠用,而有時(shí)在其他情況下,M單元根本就沒用上,這時(shí)就要想辦法用M去代替其他運(yùn)算單元。如求殘差時(shí)要把8位數(shù)擴(kuò)展成16位數(shù),一般用UNPKLU4和UNPKHU4指令來完成,也可以用DOTPU4乘以0x01010101,同樣也可以完成擴(kuò)展要求。
表二 H.264編碼器性能測(cè)試
實(shí)驗(yàn)結(jié)果與總結(jié)
由于此編碼器是針對(duì)監(jiān)控系統(tǒng)的應(yīng)用,在追求編碼速度的時(shí)候,對(duì)圖像質(zhì)量做了一定的犧牲。下面是編碼器的一些參數(shù)配置:圖像皆為CIF大小,參考幀用了一幀,搜索范圍是[-16,16],相鄰兩個(gè)P幀間插入兩個(gè)B幀,即IBBPBBP……的編碼方式,P幀和B幀做運(yùn)動(dòng)估計(jì)時(shí)最小塊到8x8塊,即只在16x16、16x8、8x16、8x8幾種模式間做選擇,量化步長(zhǎng)設(shè)為30.。采用CAVLC編碼方式。
本文針對(duì)實(shí)時(shí)視頻監(jiān)控的應(yīng)用要求,結(jié)合DM642嵌入式系統(tǒng)的硬件特性,從程序的總體架構(gòu),數(shù)據(jù)的存放位置,數(shù)據(jù)的搬移進(jìn)行了分析,給出了切實(shí)有效的優(yōu)化方法。對(duì)占用系統(tǒng)資源較多的運(yùn)動(dòng)搜索給出了適合在DSP平臺(tái)下的算法,對(duì)整數(shù)DCT進(jìn)行了在匯編層面的優(yōu)化,并總結(jié)了一下優(yōu)化技巧。經(jīng)測(cè)試基本達(dá)到視頻監(jiān)控的實(shí)時(shí)要求,并且有較好的圖像質(zhì)量和碼率。
評(píng)論