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