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