1.引言
視頻編碼的建議從H.261到H.262/3、MPEG-1/2和MPEG-4都有一個共同的目標:在盡可能低的碼率下獲得盡可能好的圖像質量。然而,隨著圖像通信的發(fā)展,如何適應不同信道傳輸的需求,如何適應用戶對視頻自由選擇編碼的需求等問題相繼出現,必須要有一個新的視頻編碼標準來解決這些問題,這就是新一代圖像編碼標準H.264。H.264的視頻編碼標準在系統(tǒng)結構、運動估計和運動補償、變換、量化、熵編碼等方面都進行了很大改進,大大提高了壓縮效率,節(jié)省了碼率。H.264編碼的重建圖像的主觀質量比H.263要好得多。
TMS320DM642數字媒體處理器是TI公司新近推出的一款基于C64X核的DSP。本文主要介紹H.264編碼在TI公司的TMS320DM642評估板上的代碼實現及優(yōu)化方法。
2. H.264視頻編碼技術
H.264是ITU-T的VCEG (Video Coding Experts Group)和ISO/IEC的MPEG(Motion Picture Experts Group)聯(lián)合成立的“聯(lián)合視頻組”(JVT:Joint Video Team)共同制定的新建議,它等同于ISO的 MPEG-4的 Part10。JVT于1998年2月正式開始提案征集,次年8月完成第1版草案和測試模型,2001年9月,在JVT的第1次會議上H.264的WD2(Work Draft 2)版,并推出測試模型TML-9 (Test Model Long Term Number 9)。此后,于2002年7月的JVT第4次會議上推出了H.264的CD (Committee Draft)版。
H.264的主要功能目標如下:
3.基于DSP TMS320DM642的硬件實現平臺
在TI公司新近推出的600MHz TMS320DM642評估板(EVM)上實現符合H.264標準的編碼器。(由SDI生產,最新的評估板為720MHz TMS320DM642 EVM - 摘編者注。) DM642 EVM是一塊PCI卡,采用600 MHz的數字媒體處理器DM642,具有32MB外部SDRAM、4MB閃存、組合視頻輸入/輸出、S-視頻輸入/輸出、VGA輸出端口以及支持媒體流的以太網端口。
TMS320DM642數字媒體處理器是TI公司新近推出的一款基于C64X核的DSP。DM642集成了一系列的外設以適應視頻和影像技術的發(fā)展,其中包括三個能夠進行無延滯視頻輸入、視頻輸出或傳輸流輸入的可配置視頻端口。這些端口可以支持BT.656視頻I/O, HDTV Y/C I/O, RGB I/O, MPEG-2傳輸流輸入。DM642還包含一個10/100MBPS的以太網MAC(EMAC),一個多通道的串行口(McASP),一個66MHz 的32位PCI總線,以及一些其它外設。C64X核內有8個并行的處理單元,分為相同的兩組,具有64個32bit的通用寄存器的專用存取結構,同時內置高效率的協(xié)處理器,他的體系結構采用VLIW(甚長指令集)結構,單指令字長為32bit,8個指令組成一個指令包,總字長為8x32=256bit。芯片內部設置了專門的指令分配模塊,可以將256bit的指令包同時分配到8個處理單元,并由8個單元同時運行。當片內的8個處理單元同時運行時,處理能力可以達到最大。在C6000公共指令集的基礎上擴展了88條指令,這些指令使C64X能夠更方便地執(zhí)行圖象處理中的算法。
4.H.264的DSP DM642實現和優(yōu)化
4.1 H.264代碼優(yōu)化
H.264的DSP實現流程分為三個階段:
第一個階段產生和評估C代碼,第二個階段優(yōu)化和評估C代碼,第三個階段編寫和評估線性匯編。
每個階段完成任務如下:
第一階段:首先,產生C代碼并進行時間評估。一般情況下,這個階段的代碼性能很低。如果經過評估后,仍然滿足不了實時要求的話,需要進入第二個階段以進一步改進代碼性能。
第二階段:利用優(yōu)化選項、內聯(lián)函數以及其它優(yōu)化方法改進C代碼。如果代碼仍不能達到所期望的效率,則進入第三階段。
第三階段:從C代碼中抽出對性能影響大的代碼段,用線性匯編重新寫這段代碼,然后利用匯編優(yōu)化器優(yōu)化該代碼,直到代碼滿足要求為止。
4.2 優(yōu)化和評估C代碼
代碼分析結果顯示DCT、IDCT變換、運動估計運算量占程序總運算量的比重很大,因此這部分函數是程序優(yōu)化的重點。為此,我們通過下述方法對C代碼進行了優(yōu)化:
(1)對于復雜的運算語句,可以用查找表的方法來實現,以節(jié)省耗時。比如:在運算表達式中出現了“/”以及“%”等符號時,可以先按照所有可能的輸入計算出所有可能的輸出,以后的運算就可以省略而只需要查表得到數值。該方法的本質在于用空間換時間。同樣,對于if-else關系到數據運算的選擇語句,也可根據具體的情況,采用查找表的方法來實現。
(2)對于通過查找表編碼部分個,可以將相關的碼表進行合理的編排,以便運用一條指令可以一次查到需要的數據。同時,盡可能用多位的指令來訪問少位的數據。比如:使用int型(32位)訪問2個short(16位)型數據,將其分別放在32位寄存器的高16位和低16位字段。這樣,可以提高一倍的數據讀取效率。同樣,像使用int型可一次訪問兩個short型一樣,使用double型訪問可一次讀2個float型數據(4個int型數據),從而減少對內存的訪問次數,從而減少運算耗時。
(3)在C代碼中,使用內聯(lián)函數替代復雜的C代碼。內聯(lián)函數是可直接映射為C6000指令的特殊函數,使用時同調用其它函數一樣調用,同時不會破壞系統(tǒng)環(huán)境。內聯(lián)函數用前下劃線(如:函數_add2 (int src1,int src2)表示src1,src2的高低半字分別做有符號加法,返回結果)表示,使用內聯(lián)函數可快速優(yōu)化C代碼。
(4)代碼中循環(huán)越多,執(zhí)行的效率越低。 因此,我們考慮采用循環(huán)展開的方法,將多循環(huán)變?yōu)樯傺h(huán),甚至是單循環(huán)。即運用消除冗余循環(huán)的方法來提高指令并行執(zhí)行的程度,從而提高代碼的執(zhí)行效率。
(5)為了進一步提高代碼性能,經過評估,找出影響速度的關鍵 C代碼段 (DCT/IDCT變換和運動估計)用線性匯編重新編寫。線性匯編是C6000系列DSP所特有的類匯編工具。只需按照C代碼的自然順序,寫出線性匯編語句,同時不必考慮功能單元的分配,以及指令的并行性。從而,它比編寫純匯編語句耗時要少,又具有較高的執(zhí)行效率。如果編寫線性匯編仍不能達到指標要求的話,在運用純匯編編寫相關的代碼,充分利用C6000 DSP結構以及指令集的特點,盡可能并行其中的非相關語句。從而進一步減少代碼的執(zhí)行時間和提高程序的性能。
4.3 存儲器的優(yōu)化
與PC機相比,DSP的程序數據存儲空間非常有限。因此,對于視頻編解碼這種需要處理大量數據的程序而言,必須合理安排數據和程序的存儲方式,實現對存儲器的優(yōu)化,以便提高程序執(zhí)行的效率。否則,大量數據的反復搬移會阻礙程序運行效率的提高。
采取以下方法對存儲器進行優(yōu)化:分析代碼,把被反復調用的程序段(如DCT變換和DCT反變換)放在片內程序存儲區(qū)中,把頻繁用到的數據段(如編碼表)放在片內數據存儲器中,把不常用到的程序和數據段放在片外存儲器中,以避免對程序或數據進行不必要的反復搬移。
在H.264程序運行過程中,由于一幀圖像的數據量很大,故而將參考幀數據放到片外,需要用到當前塊和參考窗數據時,再將它們從外存搬運到內存中,以便提高效率。
4.4 C代碼和存儲器優(yōu)化前后性能分析
我們對代碼優(yōu)化前后的性能進行分析比較,下表是幾個關鍵函數在優(yōu)化的各個不同階段所占用的時鐘周期數的統(tǒng)計。
可以看出,優(yōu)化后的效果是明顯的。
| 被優(yōu)化函數 | 優(yōu)化前 | 優(yōu)化后 |
| DCT(4x4) | 324cycles(未-03) | 30cycles(線性匯編-03) |
| IDCT(4x4) | 350cycles(未-03) | 35cycles(線性匯編-03) |
| 運動估計(1frame) | 412Mcycles(未-03) | 30Mcycles(線性匯編-03) |
| 量化(4x4) | 9255cycles(未-03) | 704cycles(線性匯編-03) |
5.結束語
本文重點探討了在DSP TMS320DM642平臺上對H.264視頻編碼進行相關優(yōu)化的方法。我們應該考慮如何充分利用DSP DM642的硬件資源及開發(fā)工具,使代碼達到所期望的性能。針對TMS320DM642芯片的結構和H.264視頻編碼程序自身的特點,我們從代碼和存儲器兩方面對程序進行了優(yōu)化,仿真結果證明,優(yōu)化效果明顯,經過優(yōu)化后的編解碼器完全能夠滿足實時性要求。