999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

AVS幀間插值的線性匯編優化

2009-01-01 00:00:00李曉瑜陳雷霆盧光輝羅琰欽
計算機應用研究 2009年6期

摘 要:用線性匯編語言重新設計程序結構優化循環語句,實現讀取參考樣本、濾波處理和移位裁剪算法的優化,避免重復讀取同一個參考樣本的情況。優化后的數據顯示,線性匯編代碼在時鐘周期上效率大幅提高,優化效果相當明顯。

關鍵詞:音/視頻編碼標準; 幀間插值; 線性匯編優化; 參考樣本; 濾波處理

中圖分類號: TP37文獻標志碼:A

文章編號:1001-3695(2009)06-2319-03

doi:10.3969/j.issn.1001-3695.2009.06.096

Optimize frame-interpolation of AVS by linear assembly language

LI Xiao-yu, CHEN Lei-ting, LU Guang-hui, LUO Yan-qin

(School of Computer Science Engineering, University of Electronic Science Technology of China, Chengdu 610054, China)

Abstract:

This paper used the linear assembly language to re-design program structure and realized the optimization of reading reference samples, filter processing and transfer of cutting algorithm. It avoided the situation of repeating reading reference sample. It demonstrates that the linear assembly code has a notable increase of the clock cycle efficiency, and the optimization is obvious.

Key words:AVS(audio video coding standard); frame-interpolation; optimization of linear assembly language; reference sample; filter process

AVS是我國具有自主知識產權的第二代信源編碼標準,包括系統、視頻、音頻、數字版權管理四個主要技術標準和一致性測試等支撐標準共九個部分[1]。2006年2月,國家標準化管理委員會正式頒布《信息技術先進音/視頻編碼第2部分:視頻》,國家標準號GB/T 20090.2-2006,簡稱AVS[2]。AVS具有壓縮比高、圖像質量好、應用范圍廣、專利費低、復雜度低等優點[3]。它作為第二代視頻編/解碼標準,其實現框架采用混合編碼體制,將空間域預測與時間域預測結合在一起,即采用幀內預測和幀間預測對圖像編碼。一個完整的AVS解碼器在理論上由熵解碼、反掃描、反量化、反變換、幀內預測、運動補償、環路濾波等模塊組成。

AVS視頻編碼標準能夠取得相對于以往的視頻編碼標準更加高的壓縮效率和圖像質量,但隨之而來的是龐大的計算量。計算復雜度的提高很大程度上限制了新標準的應用,特別是一些對實時性要求比較高的應用場合。因此,對AVS解碼器的優化是必需的。對程序的優化,通常是指優化程序代碼或程序執行速度,兩者對立統一,很難兼得。提高編/解碼速度往往不可避免地會引起視頻圖像質量下降,性能降低。在處理器資源有限的情況下,尋求復雜度與編/解碼性能的最佳折中是視頻信息處理軟件優化最主要的方向[4]

本文以AVS官方提供的RM50d解碼器為藍本,分析其中的關鍵算法;以TI公司DSP開發板TMS320DM642為開發平臺,充分合理地利用DM642提供的硬件資源;操作系統為Windows XP;配套軟件集成開發環境為CCS2.0(code composer studio);著重分析AVS的幀間插值模塊,使用線性匯編語言對其進行優化。優化指標為代碼的執行效率,并兼顧圖像質量。

1 AVS幀間插值模塊

AVS幀間插值分為亮度插值和色度插值。亮度分量插值精確到1/4像素精度,亮度像素插值中1/2像素插值使用四抽頭濾波器(-1,5,5,-1)進行濾波,1/4像素插值使用四抽頭濾波器(1,7,7,1)進行濾波[1]。像素插值是幀間預測模塊的核心部分之一。所謂幀間預測就是利用已編碼圖像的解碼圖像作為當前編碼圖像的參考圖像,在參考圖像內選擇出參考樣本。采用幀間編碼的幀的類型有兩種,即前向預測的P幀和雙向預測的B幀。P幀采用兩個前向幀作為參考樣本;B幀選擇前后各一幀作為參考樣本。AVS的幀間預測以宏塊為基本單位,且AVS在運動估計中采用了亞像素運動矢量。

幀間編碼類型的宏塊的每個分割或者子塊均在參考圖像的某一相同區域中進行預測而得到。兩者之間的位置差異(MV)對亮度分量采用1/4像素精度,色度分量采用1/8像素精度。亞像素位置的亮度和色度像素事實上并不存在于參考圖像中,而是利用參考樣本中的鄰近像素進行像素插值而得。如果MV為整數,則參考塊的相應像素就已經實際存在,否則就需要進行像素間插值。AVS的亮度像素插值分為1/2精度和1/4精度插值,像素間的位置關系如圖1所示。根據AVS像素插值亮度分量的插值方法可見,AVS中的樣本插值可以精確到1/4像素。

使用VC編譯環境提供的代碼剖析工具(profile)對RM50d解碼藍本進行剖析,以視頻序列CIF格式作為測試對象。最終得出解碼器中各模塊占用的時間資源信息如表1所示。

由表1可知,解碼器耗時的主要模塊為熵解碼、幀間插值、幀內預測、反變換、幀重建模塊,其中幀間插值模塊是引起解碼器速度緩慢的主要原因之一。以上數據僅僅在時間上反映了代碼低效。

2 線性匯編優化代碼的優勢和原則

利用線性匯編語言實現原來的C語言程序可以更加靈活地安排DM642的硬件資源,提高整個系統內計算單元和數據通路的利用率,高效地實現解碼系統的實時解碼目標。為了使編寫出來的線性匯編代碼可以以最佳狀態運行,需要遵循一些指導原則[5]

a) 寫并行代碼。通過使用匯編指令并行執行的方式減少循環內的執行周期數,優化線性匯編代碼。

b) 數據打包處理。使用“雙字”訪問“字”和“字”訪問“短型數據”,通過這樣的方式存取數據可以節省指令周期,提高代碼的執行速度。

c) 軟件流水。它是編排循環指令,使循環的多次迭代能夠并行執行的技術。

d) 循環展開。資源沒有充分利用起來時,可通過展開循環提高性能。

e) 消除冗余取。在有些算法中,會經常遇到多次從存儲器中取同一數值的情況,這顯然會影響代碼的性能。如果對一個特定值先執行一次取操作,再保持這個值到寄存器中;然后多次讀這個寄存器,便能夠改善代碼性能。

f) 避免存儲體(bank)訪問沖突。C6000系列不同芯片有不同的內存配置,但大多數芯片采用如圖2所示的交叉存儲bank方案,圖中每一個方框的數字代表一個字節地址。

因為每一個bank只有一組總線端口,所以每個周期對每個bank只有一次訪問機會。如果在某一給定周期對一個bank訪問兩次以上,將導致存儲器阻塞,即當存儲器讀第二個數值時,芯片內的所有流水操作將會停止一個周期。如果兩個存儲器操作不是對同一個bank,則允許每個周期有兩個存儲操作,且不會發生流水阻塞。

3 線性匯編對幀間插值的優化方案

3.1 耗時分析

經過CCS提供的代碼剖析工具剖析后發現,幀間插值模塊中的Inter_Luma_Pred()函數和Inter_Chroma_Pred()函數耗費的時鐘周期相當多,兩者總共占用了幀間插值模塊總時鐘周期的百分之九十以上。Inter_Luma_ Pred()函數的主要功能是實現亮度的1/2和1/4精度像素插值;Inter_Chroma_Pred()函數的功能是對色度分量進行插值操作。Inter_Luma_Pred()函數耗時的主要原因是其子函數get_block()內的條件判斷語句和循環語句特別多。當調用這個函數時,函數首先要判斷是哪種類型的像素插值;然后根據確定下來的插值類型再循環進行像素采樣、濾波、裁剪處理;最后把計算結果存放到相應的參考樣本塊緩沖區內。這種方法進行幀間插值是十分低效的,且阻礙了系統的運行速度。

下面是從幀間插值亮度分量模塊中選取的一部分樣本插值代碼為例(注:這里像素的位置如圖1所示)。1/2像素“b位置”插值如下:

……

else{

if ((dx==2) (dy==0)) //若是“b位置”

 for (j = 0; j < B8_SIZE; j++) //外層8個循環

for (i = 0; i < B8_SIZE; i++) //內層8個循環

{

for (result=0,y = -1; y < 3; y++)

//循環采樣并計算中間值

result += ref_pic[(y_pos+j+y)*width+x_pos+i]

*COEF_HALF[y+1];

block[j][i] = max(0, min(255, (result+4)/8));

//裁剪像素值

}

 }

分析上面的C代碼,在循環內部包含了尋址存取操作,每個尋址操作需要四個指令周期。同時,這些數據一次只對一個子像素插值,計算出子像素的值后就將先前讀出來的樣本釋放掉。而樣本的采樣需要插值出一個8×8大小的塊,這樣一來,就要求重新從目標緩沖區內讀樣本像素值再進行計算,引起了大量的重復讀操作。例如,二分之一位置的“b位置”插值時,計算第一個“b位置”需要從參考樣本所在的內存中讀出四個整數位置的像素值,假設為C、D、E、F四個整數像素。通過計算得出第一個“b位置”子像素的值;然后向后移動一個像素的位置,讀出D、E、F以及與F相鄰的下一個整數位置的像素值,計算這四個像素并得出第二個“b位置”子像素的值。依此類推,最后插值出一個8×8大小的樣本塊。計算時,每次需要四個整數樣本,相鄰的兩次計算要重復讀三個像素,從效率的角度出發,這樣導致了代碼的執行效率不高。

3.2 具體優化方案

線性匯編語言進行優化,主要從提高代碼執行速度的角度出發,著重分析如何減少重復操作并優化循環語句。本優化方案以“b位置”的子像素插值為例,將樣本插值函數分為以下三段進行優化:

a)讀取參考樣本部分的優化

LDNW *imgline[2], bf8

LDNDW *imgline++(imgW), bf4:bf0

SHRMB bf4, bf0, bf1

SHRMB bf8, bf4, bf5

SHLMB bf0, bf4, bf3

SHLMB bf4, bf8, bf7

PACKLH2 bf4, bf0, bf2

PACKLH2 bf8, bf4, bf6

針對一個參考樣本會重復讀多次的情況,本方案用線性匯編語言來實現讀取參考樣本。上面的一段代碼是經過優化后的讀取參考樣本的實現代碼。

優化思路為:(a) 讀取參考樣本。使用LDNW和LDNDW指令從參考樣本緩沖區讀12個整數位置參考樣本。(b) 重排序。使用字節移位指令和打包指令將上面的三個字重新組合,產生bf0、bf1、bf2、bf3、bf4、bf5、bf6、bf7共八個字,如圖3所示。后半段濾波處理將使用這八個字長的樣本產生1/2參考樣本。

本段代碼一次性從內存中讀出12個整數位置參考樣本,利用這12個參考樣本可以插值出8個1/2位置“b”樣本,而這插值出來的8個樣本值即為所求參考塊的一行。原來的代碼需要256次循環,而且代碼內部還包含了大量的重復操作。按照重新設計的讀參考樣本算法,只需循環8次就可以插值出一個8×8的參考樣本,代碼中還避免了重復讀同一個參考樣本的情況,這大大提高了代碼的效率。

b)濾波器部分算法的優化

DOTPSU4 .1 filter, bf0, b1b0

DOTPSU4 .1 filter, bf1, b1b1

……

DOTPSU4 .1 filter, bf7, b1b7

PACK2 b1b1, b1b0, b1b10

PACK2 b1b3, b1b2, b1b32

PACK2 b1b5, b1b4, b1b54

PACK2 b1b7, b1b6, b1b76

上面的一段代碼顯示了線性匯編實現的濾波計算。濾波器(-1,5,5,-1)將重排序后的樣本過濾成中間結果并存放到b1b0、b1b1等七個寄存器內(圖4);再使用PACK2指令將數據打包到一個寄存器內,以方便后面的ADD2和SHR2指令對樣本值批量計算。

優化思路為:原來C代碼的濾波部分是通過4次循環來實現的,每循環一次讓一個參考樣本與濾波器中的一個值相乘,4次循環之后才可得出一個中間結果,其大大降低了代碼的運行速度。線性匯編使用DOTPSU4指令可以計算四個數據的點積,如圖3所示。根據DOTPSU4指令提供的功能,只需將樣本值和濾波器(-1,5,5,-1)作為操作數傳遞給DOTPSU4就行了。代碼中語句DOTPSU4 .1 filter,bf0,b1b0顯示了具體的實現方法。

使用DOTPSU4指令一次可以完成C代碼需要4次循環相乘才能完成的功能,有效縮短了代碼的尺寸。經過DOTPSU4濾波計算后,完成該指令只需要4個時鐘周期,而C代碼卻需要至少20個時鐘周期。原來的實現方式是循環相乘,插值一個樣本需要循環4次,而且中間還需要乘法計算和賦值運算,而重新設計的實現代碼插值一個樣本只需要一條指令就可以完成相同的功能。

經過優化處理,代碼尺寸更短,執行速度更快。所以,對濾波器濾波計算的優化效果比較明顯。

c)移位及裁剪部分的優化

ADD2 b1b10, add4val, b1b10

… ;+4

SHR2 b1b10, 3, b1b10

… ;/8

…;裁剪處理

PACKL4 b1b32, b1b10, b1b3210

PACKL4 b1b76, b1b54, b1b7654

STDW b1b7654:b1b3210, *blk++[blkW8B]

優化思路為:代碼完成對參考樣本的加4以及移位操作,并將最后計算出來的8個參考樣本打包到變量b1b3210:b1b7654寄存器對內;最后由STDW指令將b1b3210:b1b7654內的參考樣本存放到目標參考樣本緩沖區內。到此為止,一次循環已經完成,通過本次循環內的計算,最終插值出8×8參考樣本塊的一行樣本。

按照本優化方案,只需要循環8次就可插值出所需參考樣本塊,而原來的插值算法卻需要256次循環,且循環內部還包含非常低效的計算方法。

3.3 函數調用的優化

上面的線性匯編優化方案優化了幀間插值函數的局部代碼,還不足以使幀間插值達到最佳的執行性能。因為導致幀間插值模塊耗費大量時鐘周期的另一個原因是get_block()函數,它包含大量判斷語句,整個函數均由條件語句驅動執行的。所以,采用重新調整幀間插值模塊的函數調用方法來提高幀間插值的性能,是進一步的工作。

對于幀間插值模塊,本文僅選取了亮度像素插值模塊中的1/2樣本b具有代表意義的像素為例。用CCS對幀間插值的主要功能函數get_block()進行剖析,如表2所示。幀間插值函數的C代碼與同樣條件下的線性匯編代碼,在時鐘周期數和平均一次函數調用需要的時鐘周期數,兩者對比線性匯編代碼提高了大約98.2%,優化效果相當明顯。

4 結束語

對于CIF格式的視頻流,優化前的解碼器解碼一幀大約需要1 211 ms,而優化后一幀大約需要99 ms,比原來提高了大約91.2%。經過優化后的解碼器運行在DM642系統上時,每秒鐘大約可以解碼10幀CIF格式的圖像,對于QCIF格式的視頻流,基本上可以滿足實時解碼的需求。而優化后的解碼器解碼出來的圖像質量與優化前的解碼器解碼出來的圖像具有相同的清晰度。

參考文獻:

[1]數字音/視頻編/解碼技術標準工作組.信息技術先進音/視頻編碼,第二部分:視頻[S].2003.

[2]數字音/視頻編/解碼技術標準工作組.AVS簡介[EB/OL].(2007-12-18)[2008-05-20].http://www.avs.org.cn/.

[3]梁凡.AVS視頻標準的技術特點[J]. 電視技術, 2005,5(7):12-15.

[4]H.264 解碼算法的研究及其在DSP平臺的實現[D].北京:清華大學,2004.

[5]TMS320C6000 CPU and instruction set reference guide[R]. [S.l.]: Texas Instruments, 2000:30-60.

主站蜘蛛池模板: 亚洲天堂久久久| 全裸无码专区| 久久婷婷五月综合色一区二区| 国产高清精品在线91| 国产婬乱a一级毛片多女| 全部免费毛片免费播放| 国产理论精品| 亚洲三级a| 99精品视频在线观看免费播放| 亚洲日本韩在线观看| 福利在线一区| 露脸国产精品自产在线播| 日韩成人在线视频| 在线观看欧美精品二区| 欧美精品综合视频一区二区| 国产精品污视频| 久久精品国产精品国产一区| 在线亚洲小视频| 久草视频精品| 真实国产乱子伦高清| 国产Av无码精品色午夜| 国产在线视频欧美亚综合| 欧美在线伊人| 制服丝袜在线视频香蕉| 九九线精品视频在线观看| 人妻少妇乱子伦精品无码专区毛片| 国产精品色婷婷在线观看| 亚洲国产综合精品一区| 国产又色又刺激高潮免费看| 好紧太爽了视频免费无码| 狠狠色综合久久狠狠色综合| 青草午夜精品视频在线观看| 亚洲高清在线天堂精品| 久久99精品久久久久纯品| 亚洲欧洲日韩国产综合在线二区| 色婷婷电影网| 四虎永久在线精品国产免费| 国产福利拍拍拍| 国产麻豆aⅴ精品无码| 超碰色了色| a亚洲视频| 欧美色图久久| 国产精品丝袜在线| 在线视频亚洲色图| 91亚洲视频下载| 在线观看av永久| 美女亚洲一区| 久久精品一品道久久精品| 波多野结衣中文字幕一区二区| 欧美午夜网| 国产区成人精品视频| 亚洲欧州色色免费AV| 亚洲国产一区在线观看| 精品国产香蕉在线播出| 91麻豆国产视频| 国产精品高清国产三级囯产AV | 欧美成人免费| 在线观看的黄网| 国产中文一区a级毛片视频| 真实国产精品vr专区| 91探花国产综合在线精品| 国产麻豆福利av在线播放 | 国产美女一级毛片| 天天综合亚洲| 综1合AV在线播放| 国产人妖视频一区在线观看| 欧美日韩福利| 久久semm亚洲国产| 99热这里只有精品国产99| 国产剧情无码视频在线观看| 91娇喘视频| 999福利激情视频| 超薄丝袜足j国产在线视频| 日韩欧美国产另类| 9966国产精品视频| 国产色爱av资源综合区| 欧美专区日韩专区| 色综合久久久久8天国| 国产毛片网站| 欧美日韩免费| 国产九九精品视频| 国产一在线观看|