基于DM642DSP的視頻編碼優(yōu)化方法
-可以保證編碼端的變換和解碼端的反變換完全匹配,沒(méi)有誤差。
首先我們對變換矩陣做必要的調整,如表達式(1),(2)所示,這樣做的好處是行變換和列變換的操作完全一樣,簡(jiǎn)化了運算。接下來(lái)就是用線(xiàn)性匯編或純匯編來(lái)實(shí)現兩個(gè)矩陣的相乘。
因為DM642CPU有兩個(gè)類(lèi)似的可進(jìn)行數據處理的通路A和B,每個(gè)通路有4個(gè)完全相同的運算單元(.L,.S,.M,.D)我們可將矩陣的一四兩行的運算放在A(yíng)側進(jìn)行,二三兩行在B側進(jìn)行運算,這樣可以保證A,B兩側可同時(shí)并行計算。由于整數DCT變換是在16比特精度下完成的,矩陣相乘我們自然會(huì )想到匯編指令DOTP2,但是不能全部用DOTP2來(lái)完成運算,否則一個(gè)周期內就只有.M單元在工作,而其他運算單元都閑著(zhù)。由于整數DCT矩陣系數的特殊性,我們完全可以用加法指令和移位指令來(lái)代替乘法指令。表1是一個(gè)16x16宏塊進(jìn)行DCT變換,匯編優(yōu)化前后的cycle數的對比。
表一 16x16宏塊DCT所需的周期數
在寫(xiě)匯編指令時(shí)我們要盡量做到在同一個(gè)周期內,讓位于A(yíng),B兩側的8個(gè)運算單元能夠同時(shí)工作,在做DCT時(shí)我們發(fā)現M單元不夠用,而有時(shí)在其他情況下,M單元根本就沒(méi)用上,這時(shí)就要想辦法用M去代替其他運算單元。如求殘差時(shí)要把8位數擴展成16位數,一般用UNPKLU4和UNPKHU4指令來(lái)完成,也可以用DOTPU4乘以0x01010101,同樣也可以完成擴展要求。
表二 H.264編碼器性能測試
實(shí)驗結果與總結
由于此編碼器是針對監控系統的應用,在追求編碼速度的時(shí)候,對圖像質(zhì)量做了一定的犧牲。下面是編碼器的一些參數配置:圖像皆為CIF大小,參考幀用了一幀,搜索范圍是[-16,16],相鄰兩個(gè)P幀間插入兩個(gè)B幀,即IBBPBBP……的編碼方式,P幀和B幀做運動(dòng)估計時(shí)最小塊到8x8塊,即只在16x16、16x8、8x16、8x8幾種模式間做選擇,量化步長(cháng)設為30.。采用CAVLC編碼方式。
本文針對實(shí)時(shí)視頻監控的應用要求,結合DM642嵌入式系統的硬件特性,從程序的總體架構,數據的存放位置,數據的搬移進(jìn)行了分析,給出了切實(shí)有效的優(yōu)化方法。對占用系統資源較多的運動(dòng)搜索給出了適合在DSP平臺下的算法,對整數DCT進(jìn)行了在匯編層面的優(yōu)化,并總結了一下優(yōu)化技巧。經(jīng)測試基本達到視頻監控的實(shí)時(shí)要求,并且有較好的圖像質(zhì)量和碼率。
評論