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