引言
H.264是由ISO(國際標準化組織)/IEC(國際電工協(xié)會)和ITU(國際電信標準化部門)合作制定的新一代視頻編碼標準,目前正處于應用開發(fā)階段。與以往的視頻編碼標準相比,h.264具有更高的壓縮效率和更好的網絡適應能力,在相同的圖像質量下,h.264所需碼率約為MPEG.2的36%、H.263的5l%、MPEG-4的61%u-31。這些優(yōu)勢將使h.264在實時視頻通信、廣播電視、視頻存儲播放等領域中得到應用M。伴隨著效率的提高,算法的復雜度也提高很多,因此需要研究h.264的壓縮算法和它的嵌入式應用。
1 視頻編碼器的硬件設計
1.1 pxa255處理器的特點
Intel Xscale PXA255蜘是基于Intel XScale微體系結構的Intel PCA處理器,內部采用XScale內核構架,頻率高達400MHz,內核擴充許多DSP指令極大提高了多媒體處理能力,同時了提供LCD(液晶顯示器)控制器、無線局域網(802.1Ib)、藍牙、高速紅外、USB等多種功能模塊。PXA255處理器還使用了BranchTargetBuffer技術,可以提高指令執(zhí)行(流水線)的效率。作為便攜移動設備的首選嵌入式處理器,PXA255內核具有Intel最先進的動態(tài)電源管理技術,可以根據處理器所執(zhí)行的任務情況動態(tài)調整工作頻率和多種節(jié)電模式,適合嵌入式視頻采集系統(tǒng)的應用。
1.2 系統(tǒng)的硬件結構
視頻編碼器的硬件結構如圖1所示。從攝像頭輸出的原始視頻流通過USB接口進入PXA255芯片進行h.264壓縮,壓縮后的碼流由網口(ETHERNET)傳到主機進行顯示,F(xiàn)lash中燒寫了嵌入式Linux系統(tǒng)和應用程序,SDRAM用于存儲編碼過程中的一些臨時數據。
2 視頻采集的實現(xiàn)
Linux操作系統(tǒng)中使用vide041inux內核模塊來進行視頻操作的,它針對視頻設備提供了一系列的API函數。本文就是利用videAlinux提供的API函數來實現(xiàn)視頻采集功能的。視頻采集流程如圖2所示。
具體視頻采集的實現(xiàn)介紹如下:
先調用函數fd=open(“dcv/video",O 來打開攝像頭RDWR)設備,成功后返回攝像頭的文件描述符fd。然后通過調用vi.
dco_get capability0和video_get pictureO兩個函數來獲得攝像頭和圖像的基本信息。利用ictol(fd,VIDIOCGPICT,&grab pic.ture)函數設定圖像的亮度、對比度、色度等信息。接著調用函數ictol(fd,V1DIoCMCAPTRUE,&grab 開始抓取一幀圖像,。bur)再調用函數ictol(fd,VIDIOSYNC,&grab buf)判斷這一幀圖像抓取是否結束。這樣連續(xù)的抓取多幀圖。像就完成了原始視頻信息的采集。圖3就是抓取的一幀原始圖像。
3 h.264編碼算法
h.264編碼標準是目前提出的最新的視頻壓縮標準。與以前的壓縮標準相比,h.264通過對幀內預測、幀問預測、變換編碼和熵編碼等算法的改進來進一步提高編碼效率和圖像質量。
這些改進包括:
?。?)運動估計時,可以靈活地選擇宏塊(MB)的大小。在宏塊劃分上,h,264采用了16x6,16x8,8x16,8x8這4種模式;當劃分為8x8模式時,又可進一步采用8x4,4x8,4x4這3種子宏塊劃分模式(如圖4所示)進一步劃分,這樣做既可以使運動物體的劃分更加精確,減小運動物體邊緣的銜接誤差,又可以減小變換過程中的計算量。
?。?)1/4像素精度的運動估值。在h.264中通過6階FIR濾波器的內插獲得l/2像素位置的預測值。當l/2像素值獲得后,通過取整數像素位置和l/2像素位置像素值均值的方式獲得l/4像素位置的值,這樣迸一步減小幀間預測誤差,減少了經變換和量化后的非零比特數,提高了編碼效率。
?。?)多參考幀運動估值。以往的編碼技術在對P幀(場)圖像進行幀間預測時,只允許以前一個I幀(場)圖像或P幀(場)圖像為參考幀。對B圖像進行預測時只允許以前后兩個I幀(場)圖像或P幀(場)圖像為參考圖像。h.264則允許在ReferenceBuffer中的多個圖像中選取一個(P預測方式)或兩個(B預測方式,圖像作為參考圖像。參考圖像甚至可以是采用雙向預測編碼方式的圖像。
?。?)參考圖像的選取與其編碼方式無關。允許選取與當前圖像更加匹配的圖像為參考圖像進行預測,減小了預測誤差,提高編碼效率。
?。?)更精確的幀內預測。在h.264中,每個4*4塊中的每個像素都可用17個最接近先前已編碼的像素的不同加權和來進行幀內預測。
?。?)環(huán)路去方塊濾波器。h.264/AVC把去方塊濾波引入運動估計預測環(huán)路中,既可去除方塊效應,又能保護圖像細節(jié)邊緣,同時亦改善了圖像的主、客觀評定質量。而且經過濾波后的圖像根據需要放在緩存中用于幀間預測,進一步提高預測精度。
?。?)h.264使用統(tǒng)一的可交長度編碼國Ⅵz)碼表。以往標準的熵編碼通常采用變長度的哈夫曼編碼,其碼表不統(tǒng)一,不能適應變化多端的視頻內容,從而影響編碼效率的提高。在此,即對h.263不同系數采用不同碼表進行VLC作了改進,采用了一個統(tǒng)一碼表的IrvIC,同時,又對h.26L中的VCL方法進行了改進,使量化后的DCT變換系數使用基于內容的自適應可變長度編碼(CAⅥC),此外還定義了一種基于上下文內容的自適應二進制算術編碼(CABAC),其性能比CAVLC更好。從而,借助UVLC,CAVLC及CABAC較好地提高了壓縮編碼效率。
4 PXA255上的h.264編碼算法的實現(xiàn)
ITU-T(國際電信標準化部門)提供了h.264的核心算法,本文使用的是開源編碼軟件x264。將其通過交叉編譯后移植到PXA255嵌入式開發(fā)平臺上。由于h.264編碼算法復雜度高、運算量大等特點導致h.264編碼效率不高,經初步測試編碼速率為QCIF格式圖像10幀/秒,不能達到實時視頻編碼的要求。
因此需要對編碼程序進行相應的優(yōu)化。
4.1 C語言優(yōu)化
編碼軟件包含了解碼和傳輸部分的程序,而本文只對視頻進行編碼,并不需要解碼和傳輸。所以對代碼進行調整,刪除解碼和傳輸部分的代碼,再重新改寫makefile文件。這樣可以縮小程序的空間大小,減少程序的運行時間,提高編碼效率。
使用盡量小的數據類型。能夠使用字符型(char)定義的變量,就不要使用整型(int)變量來定義;能夠使用整型變量定義的變量就不要用長整型(10ng in0,能不使用浮點型(float)變量就不要使用雙精度浮點型(doubles)變量。
程序中被多次調用的、函數體代碼不是很大的函數使用內聯(lián)函數。使用內聯(lián)函數可以避免由于保護現(xiàn)場和記憶執(zhí)行的地址所帶來的時間和空間方面的開銷,以提高程序的執(zhí)行效率。
4.2 Itrm匯編優(yōu)化
用C語言編程結構化程度高,易于編寫,但執(zhí)行速度相對較慢:與之相反,匯編程序速度快,但很難有較好的結構,而且編寫起來耗時,不易調試。C和匯編混合編程結合了各自的優(yōu)勢,往往能構造出結構好且執(zhí)行速度快的程序。利用匯編語言優(yōu)化C語言代碼,優(yōu)化后的匯編程序可以被C語言程序調用,并且在匯編程序中也可以調用C語言程序。
將編碼程序中的較復雜的部分程序段使用arm匯編進行改寫,這樣可以很大程度的提高代碼的運行速度。例如下面就是宏塊預測predict.c中的一段匯編優(yōu)化的代碼,C代碼如下:
4.3 基于PXA255結構的優(yōu)化
結合PXA255硬件結構特點,從以下幾個方面對h.264編碼程序進行優(yōu)化處理:
?。?)合理分配變量的存儲位置。根據片內存儲器容量小而存取速度快,片外存儲器容量大但存取速度慢的特點,在分配存儲器的時候對于那些經常使用的變量放在片內,如VLC表、運動矢量、反量化、反DCT的系數以及其它中間變量等,而對于那些執(zhí)行次數比較少或者比較大的變量如參考幀則放在片外。此外由于編譯和分配空間是以文件為單位的,所以把頻繁使用的函數放在同一文件中,再將這個文件放入片內存儲器以高效地利用有限的片內資源。
?。?)PXA255處理器中集成了大量的DSP多媒體操作指令,使用這些指令可以極大的提高程序的運行效率。
?。?)指令并行執(zhí)行是提高程序執(zhí)行效率的很好的方法,PXA255處理器中引入了Branch Target Buffer技術,以實現(xiàn)指令執(zhí)行的流水線。
5 實驗結果
為了驗證程序優(yōu)化的效果,改變每次采集的幀數進行實驗結果分析。結果如表1所示。由表l中的實驗結果可知,經過優(yōu)化的h.264編碼器每秒能處理20幀左右的QCIF圖像,而圖像的質量沒有什么影響。因此,優(yōu)化后,h.264壓縮算法能夠對采集到的圖像進行實時壓縮,具有很好的實用性。圖5為采集的視頻經過h.264壓縮后的視頻流。
6 結束語
本文描述了在嵌入式平臺PXA255上實現(xiàn)新一代視頻壓縮標準h.264編碼算法,并結合硬件芯片特點和專有匯編指令對原程序進行相應優(yōu)化,實現(xiàn)了編碼器實時編碼的要求。研究基于嵌入式平臺的h.264視頻編碼算法有很大的實用價值,它的優(yōu)異的壓縮性能也將在嵌入式數字電視廣播以及視頻實時通信等各個方面發(fā)揮作用。