摘 要: 研究了H.264編碼關鍵技術的實現(xiàn),并結(jié)合ADSP-BF561的特點提出了有效的優(yōu)化方案,包括幀內(nèi)幀間快速算法,、存儲空間分配、Cache應用、C和匯編語言優(yōu)化等,。測試結(jié)果表明,優(yōu)化后的算法編碼效率得到顯著提高。
關鍵詞: H.264,;BF561,;優(yōu)化
?
目前,音視頻技術日新月異,,其中,,視頻實時編碼傳輸極具代表性。在視頻壓縮算法領域,,新一代視頻壓縮標準H.264以其優(yōu)異的壓縮性能和圖像質(zhì)量使視頻實時編碼傳輸技術的實現(xiàn)成為可能,。但該標準的計算復雜度高,用一般的圖像處理芯片難以達到實時編解碼的要求,,它需要快速,、穩(wěn)定的處理器作為硬件平臺。ADSP-BF561是ADI公司推出的高性能多媒體處理器,。其主要特點是具有兩個ADSP-BF533處理器核心(以下簡稱核心A和核心B),,最高時鐘頻率達到600MHz,其內(nèi)部采用哈佛總線結(jié)構,,存儲模型層次化,。其典型應用模式是A核運行嵌入式操作系統(tǒng),,B核運行多媒體處理算法,如H.264,。本文提出了一套采用ADSP-BF561芯片實現(xiàn)H.264視頻壓縮算法的設計方案,,結(jié)合該DSP平臺對算法進行了針對性的優(yōu)化,充分發(fā)揮了ADSP-BF561強大的處理能力,。
1 算法介紹
1.1 H.264編碼模型框架
H.264以其高壓縮比,、高圖像質(zhì)量和良好的網(wǎng)絡親和性廣受業(yè)界歡迎。在同等質(zhì)量條件下,,H.264的數(shù)據(jù)壓縮比比MPEG-2高2~3倍,,比MPEG-4高1.5~2倍。其需要的帶寬只有MPEG-4的50%, MPEG-2的12.5%,。
H.264標準采用分層體系結(jié)構,,系統(tǒng)分為:視頻編碼層VCL(Video Coding Layer),負責高效的數(shù)字視頻壓縮,;網(wǎng)絡抽象層NAL(Network Abstraction Layer),,負責對數(shù)據(jù)進行打包和傳送。H.264編碼圖像通常分為三種類型:I幀,、P幀,、B幀。I幀為幀內(nèi)編碼幀,,其編碼不依賴于已編碼的圖像數(shù)據(jù),。P幀為前向預測幀,B幀為雙向預測幀,,編碼時都需要根據(jù)參考幀進行運動估計,。同時,H.264在提高圖像傳輸容錯性方面做了大量工作,,重新定義了適于圖像的結(jié)構劃分,。在編碼時,圖像幀各部分被劃分到多個Slice結(jié)構中,,每個Slice都可以被獨立編碼,,不受其他部分影響。Slice由圖像最基本的結(jié)構——宏塊組成,,每個宏塊包含一個16×16的亮度塊和兩個8×8的色度塊,。H.264標準的整體編碼框圖如圖1所示。編碼過程中,,原始數(shù)據(jù)進入編碼器后,,當采用幀內(nèi)編碼時,首先選擇相應的幀內(nèi)預測模式進行幀內(nèi)預測,隨后對實際值和預測值之間的差值進行變換,、量化和嫡編碼,,同時編碼后的碼流經(jīng)過反量化和反變換之后重構預測殘差圖像,再與預測值相加得出重構幀,,得出的結(jié)果經(jīng)過去塊濾波器平滑后送入幀存儲器,。采用幀間編碼時,輸入的圖像塊首先在參考幀中進行運動估計,,得到運動矢量,。運動估計后的殘差圖像經(jīng)整數(shù)變換、量化和嫡編碼后與運動矢量一起送入信道傳輸,。同時另一路碼流以相同的方式重構后,,經(jīng)去塊濾波后送入幀存儲器作為下一幀編碼的參考圖像。
1.2 H.264關鍵技術
1.2.1 幀內(nèi)預測
H.264引入了幀內(nèi)預測以提高壓縮效率,。幀內(nèi)預測編碼就是利用周圍鄰近的像素值來預測當前的像素值,,然后對預測誤差進行編碼。這種預測是基于塊的,。對于亮度分量,,塊的大小可以在16×16和4×4之間選擇,16×16有4種預測模式,,4×4有9種預測模式;對于色度分量,,預測是對整個8×8塊進行的,,有4種預測模式。
1.2.2 幀間預測
幀間預測時所用塊的大小可變,。假設基于塊的運動模型,,其塊內(nèi)的所有像素都做了相同的平移,在運動比較劇烈或者運動物體的邊緣外,,這一假設會與實際出入較大,,從而導致較大的預測誤差,這時減小塊的大小可以使假設在小塊中依然成立,。另外小塊所造成的塊效應相對也小,,因此,小塊可以提高預測的效果,。H.264一共采用了7種方式對一個宏塊進行分割,,每種方式下塊的大小和形狀都不相同,編碼器可以根據(jù)圖像的內(nèi)容選擇最好的預測模式,。與僅使用16x16塊進行預測相比,,使用不同大小和形狀的塊可以使碼率節(jié)約15%以上。
同時,,幀內(nèi)預測采用了更精細的預測精度,,H.264中亮度分量的運動矢量使用1/4像素精度,。色度分量的運動矢量使用1/8像素精度。
1.2.3 多幀參考
H.264支持多幀參考預測,,最多可以有5個在當前幀之前的解碼幀作為參考幀產(chǎn)生對當前幀的預測,,提高H.264解碼器的錯誤恢復能力。
1.2.4 整數(shù)變換
H.264對殘差圖像的4×4整數(shù)變換技術,,采用定點運算來代替以往DCT變換中的浮點運算,。以降低編碼時間,同時也更適合硬件平臺的移植,。
1.2.5 熵編碼
H.264支持兩種熵編碼方法,,即CAVLC(基于上下文的自適應可變長編碼)和CABAC(基于上下文的自適應算術編碼)。其中CAVLC的抗差錯能力比較高,,但編碼效率比CABAC低,;而CABAC的編碼效率強,但需要的計算量和存儲容量更大,。
1.2.6 去方塊濾波
去方塊濾波的作用是消除經(jīng)反量化和反變換后重建圖像中由于預測誤差產(chǎn)生的塊效應,,從而改善圖像的主觀質(zhì)量和預測誤差。經(jīng)過濾波后的圖像將根據(jù)需要放在緩存中用于幀間預測,,而不是僅僅用來改善主觀質(zhì)量,,因此該濾波器位于解碼環(huán)中。對于幀內(nèi)預測,,使用的是未經(jīng)過濾波的重建圖像,。
2 算法實現(xiàn)
2.1 平臺選擇
2.1.1 ADSP-BF561芯片介紹
ADSP-BF561是Blackfin系列中的一款高性能定點DSP視頻處理芯片。其主頻最高可達750 MHz,,內(nèi)核包含2個16位乘法器MAC,、2個40位累加器ALU、4個8位視頻ALU,,以及1個40位移位器,。該芯片中的兩套數(shù)據(jù)地址產(chǎn)生器(DAG)可為同時從存儲器存取雙操作數(shù)提供地址,每秒可處理1 200兆次乘加運算,。芯片帶有專用的視頻信號處理指令以及100KB的片內(nèi)L1存儲器(16 KB的指令Cache,,16 KB的指令SRAM,64 KB的數(shù)據(jù)Cache/SRAM,,4 KB的臨時數(shù)據(jù)SRAM),、128 KB的片內(nèi)L2存儲器SRAM,同時具有動態(tài)電源管理功能,。此外,,Blackfin處理器還包括豐富的外設接口,包括EBIU接口(4個128 MB SDRAM接口,4個1 MB異步存儲器接口),、3個定時/計數(shù)器,、1個UART、1個SPI接口,、2個同步串行接口和1路并行外設接口(支持ITU-656數(shù)據(jù)格式)等,。Blackfin處理器在結(jié)構上充分體現(xiàn)了對媒體應用(特別是視頻應用)算法的支持。
2.1.2 ADSP-561 EZkite
ADSP-BF561視頻編碼器平臺采用ADI公司的ADSP-BF561 EZ-kit Lite評估板,。此評估板包括1塊ADSP-BF561處理器,、32 MB SDRAM和4 MB Flash,板中的AD-V1836音頻編解碼器可外接4輸入/6輸出音頻接口,;而ADV7183視頻解碼器和ADV7171視頻編碼器則可外接3輸入/3輸出視頻接口,。此外,該評估板還包括1個UART接口,、1個USB調(diào)試接口和1個JTAG調(diào)試接口,。攝像頭輸入的模擬視頻信號經(jīng)視頻芯片ADV7183A轉(zhuǎn)化為數(shù)字信號,此信號從ADSP-BF561的PPI1(并行外部接口)進入ADSP-BF561芯片進行壓縮,,壓縮后的碼流則經(jīng)ADV7179轉(zhuǎn)換后從ADSP-BF561的PPI2口輸出,。此系統(tǒng)可通過Flash加載程序,并支持串口及網(wǎng)絡傳輸,。編碼過程中的原始圖像,、參考幀等數(shù)據(jù)可存儲在SDRAM中。
2.2 算法選取與優(yōu)化方案
2.2.1 算法選取
H.264實現(xiàn)的源代碼不止一種,,其中最常見的有JM,、X264和T264。對比這三種實現(xiàn)源代碼,,X264比T264具有更高的效率。而且相比廣泛采用的JM編碼模型,,X264在兼顧編碼質(zhì)量的同時大幅度地提升了編碼速度,,所以選取X264作為算法原型。
2.2.2 優(yōu)化方案
該優(yōu)化方案從三個層次對算法進行優(yōu)化:算法層次,、代碼層次,、平臺層次。下面介紹具體優(yōu)化方法,。
2.2.2.1 編碼器具體參數(shù)的選擇
該編碼器使用main檔次,,I、B,、P幀量化值分別為26,、31、29,流控參數(shù)選為CBR,。IDR幀間隔設為50,,B幀間隔為2幀。這樣的選擇是為了在速度和運算量上取折中,。選用B幀并將其量化值加大,,可比baseline檔次、IPPP結(jié)構提高約10%的壓縮率,。而B幀的計算量,,因其不用做參考幀,故無需進行去塊濾波和插值計算,,在31的qp下,,很多塊會被判做skip模式編碼,因而多數(shù)時B幀總運算量候反而較P幀低,。
2.2.2.2 算法層次的優(yōu)化
算法層次的優(yōu)化主要是指在參數(shù)選定的情況下,,對部分算法所作的替換或優(yōu)化。和參數(shù)的選擇一樣,,算法層次優(yōu)化也主要受優(yōu)化策略的指導,。如運動匹配準則是選用SSD、SAD或SATD,。如果只看中準確程度,,則選擇SSD最佳;如果只看中運行速度,,則選擇SAD最佳,;如果要兼顧二者,則選用SATD是比較好的一個方案,。在進行算法優(yōu)化時還應該注意一個問題,,即要考慮實際運行平臺的支持情況。如在追求速度的策略下,,匹配準則選用SAD,,如果只計算一半的點則會大大降低運算速度。但是如果考慮ADSP-BF561匯編指令的設計情況,,就會發(fā)現(xiàn)這樣做反而會增加指令數(shù),,會使速度更低。算法層次優(yōu)化包括如下幾個部分:
(1)除法求余,。改進策略是浮點型算法盡量改為整型,,64位盡量改為32位,32位盡量改為16位,。而對于某些計算比較多的,,則改為查表計算,。在ADSP-BF561平臺上,一次32位整形除法需耗時300個CYCLE,,而查表僅需幾個CYCLE,,這樣的改進能顯著提高速度。
(2)飽和函數(shù),。在視頻的計算中,,幾乎每次像素的計算都會調(diào)用飽和函數(shù),X264代碼的實現(xiàn)中已將這部分代碼改為查表函數(shù),,在其他的編解碼器實現(xiàn)中也有將這部分改為一個判斷和幾個邏輯運算的形式,。對大部分DSP平臺,采用判斷跳轉(zhuǎn)會打斷流水線,,即使平臺有比較好的跳轉(zhuǎn)預測功能,,打斷流水仍然會造成stall。所以查表方法是一種高效方法,。而在ADSP-BF561匯編指令中,,可以通過設置指令后綴或使用某些特殊指令來進行飽和工作。甚至不用查表,,在不同的場合使用不同的飽和算法能大大提高代碼的執(zhí)行效率,。
(3)MC部分函數(shù)。實測中發(fā)現(xiàn)MC部分函數(shù)運行效率不如ffmpeg解碼器中MC部分效率高,,所以將這部分代碼用ffmpeg中的相應部分替換,。此外qpel16_hv函數(shù)中計算有冗余,減少這些冗余能提高代碼運行效率,。
(4)算法替代和改進,。幀間預測的改進:關于算法的改進主要集中在對me(motion estimation)的改進上,流程如圖2所示,。costmin1=min(cost16,,cost8,cost16×8,,cost8×16),,costmin2=min(costmin1,costsub),,依次在16×16,、8×8,、16×8和8×16大小宏塊的整像素位置做預測,,再做次像素估計和幀內(nèi)預測,選用匹配準則函數(shù)(采用sad作為匹配準則函數(shù))取得最小值的模式進行編碼,。每計算一種模式,,都將sad值與一個經(jīng)驗閥值做比較,。當sad值小于這個閥值時,立即結(jié)束運動估計,,從而減少運算量,。
?
幀內(nèi)預測的改進:H.264標準所采用的幀內(nèi)預測模式除了DC模式都具有方向性,相鄰4×4塊都具有相關性,。根據(jù)這樣的相關性,,只將當前4×4塊上邊和左邊選用預測模式及其相鄰的兩種預測模式作為當前4×4塊的預測模式,當其閥值都大于一個經(jīng)驗閥值時,,才采用DC模式,。這樣的方案不用一一計算9種預測模式,在復雜度,、編碼效率,、質(zhì)量和速度上取了一個折中。流程如圖3所示,。
?
2.2.2.3 代碼層次優(yōu)化
針對ADSP-BF561平臺,,代碼層次的優(yōu)化工作包括以下幾個方面:
(1)內(nèi)聯(lián)函數(shù)。將經(jīng)常調(diào)用的函數(shù)體較小的函數(shù)改為內(nèi)聯(lián),。編譯條件中有關于內(nèi)聯(lián)函數(shù)優(yōu)化的選項,。內(nèi)聯(lián)函數(shù)的使用是將代碼的大小和運行效率取一個折中。根據(jù)實際情況,,代碼的大小并非限制條件,,所以應盡可能多地使用內(nèi)聯(lián)函數(shù)。在項目配置中選中when declared inline選項,。
(2)跳轉(zhuǎn)預測,。ADSP-BF561采用了靜態(tài)預測的方式來預測有條件判斷情況,預測不成功會造成4~8個內(nèi)核時鐘(CCLK)的延誤,。如果事先知道某些跳轉(zhuǎn)的概率,,將可能性最大的分支放在最前面,可以從概率上降低預測不成功而造成的stall,。
(3)使用硬件支持循環(huán),。對于大部分平臺,將一些循環(huán)體小的循環(huán)展開也能提高效率,。ADSP-BF561有兩組硬件計數(shù)器用以支持循環(huán),。所以除非是展開三層以上的循環(huán),否則,,展開循環(huán)體不能提高效率,。
(4)內(nèi)存。嵌入式系統(tǒng)的內(nèi)存是非常寶貴的資源,。避免頻繁的動態(tài)申請和釋放內(nèi)存,,能減少碎片產(chǎn)生,,提高內(nèi)存的利用率。X264工程也不會頻繁地申請釋放內(nèi)存,。在項目中,,具體做法是編寫平臺相關的malloc和free函數(shù)。將經(jīng)常使用的中間數(shù)據(jù)在L1數(shù)據(jù)空間中分配,。
(5)注釋不需要代碼,。去掉代碼中不需要的部分,主要會去掉CAVLC以及部分碼率控制,、csp,、cpu、信息統(tǒng)計,、調(diào)試和psnr計算等部分代碼,,這樣做的目的是為了減小文件大小和去除代碼中的一些跳轉(zhuǎn)。不建議刪除代碼,,可以使用注釋符或用宏切換的方式,,以防止以后參數(shù)改變時需要使用未使用過的代碼。
2.2.2.4 平臺層次優(yōu)化
ADSP-BF561相應的編程參考和硬件參考對其平臺特性有詳細介紹,。一些平臺自帶的優(yōu)化功能,,如CACHE的開啟和配置等不專門在此討論。
(1)匯編代碼編寫
使用匯編優(yōu)化有兩個方法:對于LEAF函數(shù)(函數(shù)體中不再調(diào)用其余函數(shù)),,采用整個函數(shù)完全用匯編指令重寫的方式,;而對于NONLEAF函數(shù)則可使用asm關鍵字,在C代碼中嵌入?yún)R編代碼,。在匯編代碼的編寫過程中一些情況會造成流水線stall,,在編寫匯編代碼時要特別注意避免這些情況。IDE集成了PIPLELINE VIEWER工具,,如圖4所示,。在編寫完成匯編代碼后,可使用該工具觀察運行時流水線的情況,。如果有stall等出現(xiàn),,會給出原因,優(yōu)化人員根據(jù)工具分析結(jié)果重新更改代碼,,提高執(zhí)行效率,。
ADI公司提供的IDE具有非常靈活的設置,能根據(jù)用戶的需要生成針對不同限制的代碼,。如內(nèi)存有限,,用戶可以設置生成文件更小的代碼;如果用戶更注重運行速度,,則設置編譯器生成運行速度更快的代碼,,或是在其間取一個折中。
ADSP-BF561有專門用于處理視頻相關的一些專用DSP指令(video pixel operations,、vector operations等),,這些專用指令通過SIMD技術或者操作專門硬件支持某些特殊運算(累加、多參數(shù)取均值,,同時完成加減法等),,以提高運行速度。如前文求SAD情況,,匯編指令中有指令專門計算連續(xù)4個像素與另外連續(xù)4個像素之差的絕對值之和,,結(jié)果與累加器的值相加。如果要隔點算(即取一半的點計算),,反而需要增加指令后對數(shù)據(jù)進行下采樣,,既耗時而且不準確。所以采用計算一半像素點的策略并不適用于ADSP-BF561,。編譯器自動生成的代碼中不會使用到這些專用指令,。所以只能根據(jù)對算法的理解和對平臺的熟悉程度來對算法進行匯編優(yōu)化。
在編寫匯編代碼時還需注意部分寄存器的使用,,如I0,、I1,其值不僅用做地址索引,,還會影響許多指令的計算結(jié)果,。在使用這些寄存器時,一定要注意將其壓?;蛑脼檫m當?shù)闹?。此外,關于數(shù)據(jù)的載入,,一般應遵循對齊原則,,但在做運動估計計算匹配準則函數(shù)時,這樣的要求往往達不到,。故如能將兩者分開來計算,,將更能提高效率。
此外,,應盡量合理地使用寄存器,,多使用并行指令也能提高代碼的執(zhí)行效率。
(2)分級存儲器結(jié)構
ADSP-BF561處理器采用改進的哈佛結(jié)構和分級的存儲器結(jié)構,。Level 1(L1)存儲器以全速運行,,只有很少的延遲。在L1級,,指令存儲器存放指令,。兩個數(shù)據(jù)存儲器存放數(shù)據(jù),,一個專用的臨時數(shù)據(jù)存儲器存放堆棧和局部變量信息。由多個L1 存儲器組成的模塊,,可進行SRAM和CACHE 的混合配置,。存儲器管理單元(MMU)提供存儲器保護功能,對運行于內(nèi)核上的獨立任務,,可保護系統(tǒng)寄存器免于意外的存取,。L1 存儲器是ADSP-BF561處理器內(nèi)核中性能最高、最重要的存儲器,。通過外部總線接口單元(EBIU),,片外存儲器可以由SDRAM、FLASH 和SRAM 進行擴展,,可以訪問多達132 MB的物理存儲器,。根據(jù)這樣的特點,將執(zhí)行率更高的代碼放入L1指令緩存中,,能使代碼更快地運行,。IDE提供了Profile工具,能在運行時統(tǒng)計各個函數(shù)所占的CYCLE數(shù)和占總CYCLE數(shù)的百分比,。通過將X264中比較耗時的部分算法代碼,,如模式選擇部分代碼放入L1指令空間,能進一步提升運行效率,。Profile工具統(tǒng)計結(jié)果同樣也是選擇需要使用匯編優(yōu)化函數(shù)的依據(jù),,IDE可根據(jù)Profile結(jié)果對代碼進行優(yōu)化。X264代碼Profile統(tǒng)計結(jié)果與測試數(shù)據(jù)有很大關系,,選用更類似以后應用場所的數(shù)據(jù)作為測試數(shù)據(jù),,能使統(tǒng)計結(jié)果更接近以后的應用環(huán)境。為達到比較準確的統(tǒng)計結(jié)果,,最好在Simulation階段進行統(tǒng)計,。雖然這樣非常耗時,但為得到一個準確的統(tǒng)計作為參考依據(jù)是值得的,。此外CACHE VIEWER工具能提供運行時CACHE的使用情況,,使用它來分析CACHE的使用,對于提高代碼運行效率很有用處,。
3 實驗結(jié)果評估
3.1 關鍵函數(shù)優(yōu)化測試結(jié)果
采用以上優(yōu)化方法對編碼關鍵函數(shù)進行優(yōu)化,,優(yōu)化前后函數(shù)耗時如表1所示??梢?,以上優(yōu)化方法能大幅度減少編碼時間。
3.2 測試序列測試結(jié)果
對三種測試序列在總線頻率120MHz下進行優(yōu)化前后幀率測試,結(jié)果如表2所示,。從表2可以看出,,采用以上優(yōu)化方法能顯著提高幀率。
3.3 不同數(shù)據(jù)總線頻率下測試結(jié)果
對于不同的總線頻率,,優(yōu)化后編碼幀率不同,,結(jié)果如表3所示,采用的測試序列為foreman,。
本文介紹了H.264標準的框架,研究了X264軟件的實現(xiàn)方案,,對ADSP-BF561處理器體系結(jié)構進行分析,,提出了一套X264優(yōu)化方案,包括:算法替代和改進,、內(nèi)聯(lián)函數(shù),、匯編代碼編寫、高速存儲器應用等,。測試結(jié)果表明,,優(yōu)化后的算法編碼效率有顯著提高,具有很強的實用價值,。但是,,本文主要從編碼速度和效率兩方面對編碼器進行優(yōu)化,在復雜度和編碼質(zhì)量上仍需不斷對關鍵算法進行分析整合,,提出新的優(yōu)化算法,。同時,編碼器的碼率控制尚未完善,,如何在降低計算復雜度的前提下有效進行碼率控制,,需進一步研究。
參考文獻
[1] 畢厚杰.新一代視頻壓縮編碼標準——H.264.北京:人民郵電出版社,,2005.
[2] 幻劉峰.視頻圖像編碼技術及國際標準.北京:北京郵電大學出版社,,2005.
[3] 李玉山.數(shù)字視覺視頻技術.西安:西安電子科技大學出版社,2006.
[4] MICHAELURAPIS A,,STTHRING K,,SULLIVAN G.H.264/MPEG-4 AVC reference software manual.Joint Video Team
(JVT)of ISO/IEC MPEG&ITU-T VCEG(ISO/IEC JTC1/SC29/WG11 and ITU-T SG16Q.6)14th Meeting, Hong?Kong, PRC China 17-21,2005.