魏妃妃,梁久禎,柴志雷
(江南大學(xué)物聯(lián)網(wǎng)工程學(xué)院,江蘇 無錫 214122)
責(zé)任編輯:史麗麗
隨著網(wǎng)絡(luò)電視、視頻會(huì)議和高清視頻的不斷發(fā)展,人們對視頻編解碼的速度和其圖像的清晰度提出了越來越高的要求,H.264/AVC作為最新的編碼標(biāo)準(zhǔn),代表著向低碼率高質(zhì)量發(fā)展的趨勢。雖然H.264/AVC比以往的編碼標(biāo)準(zhǔn)節(jié)省了碼率,但因?yàn)槠湫略龅木幋a特性,使其增加了編碼復(fù)雜度,使用單處理器的編碼速度已經(jīng)不能滿足視頻的實(shí)時(shí)傳輸和大規(guī)模的共享要求,因此研究一種高效的視頻并行編碼策略是目前的重要課題。
作為一種開放的H.264/AVC編碼器,X264比較注重實(shí)用性。它在保證了編碼效率未明顯降低的情況下,舍棄了如多參考幀和幀間預(yù)測中不必要的塊模式等這些具有極高復(fù)雜性的技術(shù);另外X264實(shí)現(xiàn)了指令級(jí)并行,在此基礎(chǔ)上,人們又提出了線程級(jí)并行方法,其中包括GOP級(jí)、幀級(jí)、片級(jí)和宏塊級(jí)并行策略[1-2]。但是其研究方法都不夠充分,絕大多數(shù)還是針對單一粒度進(jìn)行并行實(shí)施。本文主要研究通過多線程來實(shí)現(xiàn)片級(jí)和幀間宏塊級(jí)的并行。
本文介紹片級(jí)多線程并行編碼算法和幀間宏塊級(jí)并行編碼算法及其實(shí)現(xiàn)過程,片級(jí)多線程并行編碼算法只對一幀圖像進(jìn)行編碼,在系統(tǒng)中只需保存與該幀圖像編碼相關(guān)的一些參考幀圖像數(shù)據(jù)便可,所以對內(nèi)存需要量?。?],同時(shí)通過實(shí)驗(yàn)表明,在編碼碼率相對恒定的條件下,幀間宏塊級(jí)多線程并行編碼算法比片級(jí)并行編碼具有更高的編碼速度。本文提出可以根據(jù)兩種算法的特點(diǎn),運(yùn)用POSIX線程庫,進(jìn)行多粒度并行編碼算法研究,達(dá)到視頻更好的實(shí)時(shí)編碼的要求。
IEEE的開放系統(tǒng)接口標(biāo)準(zhǔn)POSIX線程,通常稱為Pthreads標(biāo)準(zhǔn)。視頻編碼多線程應(yīng)用程序可以在串行計(jì)算機(jī)上開發(fā),并且不作任何改變地在并行計(jì)算機(jī)上運(yùn)行,同時(shí)多線程化的視頻編碼程序要比使用別的并行程序容易編寫得多,另外利用多線程能躲避延遲時(shí)間,當(dāng)一個(gè)線程在等待通信操作時(shí),其他的線程可以利用CPU,這樣可以屏蔽相應(yīng)的開銷,因此本文使用多線程進(jìn)行視頻編碼的并行處理[4]。
在視頻編碼的過程中為了限制誤碼的擴(kuò)散和傳輸,一個(gè)圖像幀可以被編碼成一個(gè)或更多個(gè)片,編碼的各個(gè)片之間是相互獨(dú)立的,在同一幀中每個(gè)片的編碼不依靠其他片作為參考,一個(gè)獨(dú)立幀的搜索范圍也不能超過片的邊界[5-6]。
為了提高視頻編碼的性能,H.264/AVC需要以編碼幀的重構(gòu)圖像作為參考來處理時(shí)間冗余,即幀間預(yù)測模式需要先前已經(jīng)編碼過的參考幀。當(dāng)前幀的當(dāng)前宏塊能夠編碼之前,至少其參考幀中的對應(yīng)位置和它附近的8個(gè)相鄰宏塊是可用的[7],如圖1所示,因此實(shí)現(xiàn)幀間宏塊級(jí)并行必須要考慮幀間各個(gè)宏塊之間的依賴性。
圖1 幀間預(yù)測模式的數(shù)據(jù)依賴關(guān)系
加速比是度量采用多線程并行處理比采用單個(gè)線程處理的加速倍數(shù),用來衡量并行算法性能的重要指標(biāo),著重于并行處理相對于串行處理的優(yōu)化效果。在H.264/AVC中加速比主要用來表征采用并行算法后編碼幀率前后的變化情況。
加速比越大,算法的編碼速度越快,并行性能越好,視頻編解碼的實(shí)時(shí)性越強(qiáng)。
根據(jù)片與片之間相互獨(dú)立的特點(diǎn),同一幀內(nèi)的各個(gè)片可以并行編碼。每一幀分成固定數(shù)量的片,為每個(gè)片分配一個(gè)線程進(jìn)行編碼[8]。在進(jìn)行編碼之前需要對每個(gè)線程進(jìn)行同步,其中主要操作就是參考圖像幀需要同時(shí)進(jìn)行更新。片級(jí)并行不用考慮前后幀之間的參考問題,每一幀的分片數(shù)可以人為設(shè)定,因此使并行編碼具有更大的自由度。片級(jí)的并行程度理論上取決于幀的分片數(shù),分片數(shù)越大,獲得的并行加速比越大,但由于在編碼過程中要加入片頭等信息,這樣就增加了系統(tǒng)開銷,因而在采取片級(jí)并行時(shí),不能無限制地提高分片數(shù)目來獲取加速比,需要對圖像質(zhì)量、視頻壓縮率和并行效率三者做權(quán)衡,來決定每幀采用的分片數(shù)。假如幀I,P和B的排列順序?yàn)镮BBPBBP,其N個(gè)線程的Slice級(jí)并行方法如圖2所示。
圖2 Slice并行方法示意圖
片級(jí)多線程并行編碼算法實(shí)現(xiàn)過程如下:
步1:主線程依次讀入幀,對每一幀按照設(shè)定的thread來進(jìn)行slice劃分,通過主線程來創(chuàng)建各個(gè)片的線程,每個(gè)片獨(dú)立進(jìn)行編碼。
步2:當(dāng)創(chuàng)建的片級(jí)線程數(shù)目達(dá)到設(shè)定的線程數(shù)時(shí),主線程將處于堵塞狀態(tài),幾個(gè)slice并行編碼,各個(gè)片之間不相互參考,僅參考已經(jīng)編碼完的圖像。
步3:當(dāng)所有片級(jí)線程都編碼完成時(shí)返回到主線程,主線程繼續(xù)讀入下一幀,如果所有的幀都編碼完成則結(jié)束,否則轉(zhuǎn)入步2。
幀間宏塊級(jí)并行方法如圖3所示,當(dāng)Img0中的第一行已經(jīng)被處理完的時(shí)候,它還不能被立即編碼。這是因?yàn)檫\(yùn)動(dòng)估計(jì)的搜索范圍要大于兩個(gè)宏塊大小。為了準(zhǔn)確地預(yù)測幀的運(yùn)動(dòng)區(qū)域,必須等去塊濾波和四分之一像素插值之后的編碼宏塊被重構(gòu)。如果運(yùn)動(dòng)估計(jì)的搜索范圍是宏塊的兩倍大,那么直到Img0的第三行被編碼完成后Img1左上角的第一個(gè)宏塊才能被編碼。在圖3中,Img1中當(dāng)前正在編碼的宏塊可以和Img0中帶有相同顏色的宏塊同時(shí)進(jìn)行編碼。此后,只要判斷宏塊間不存在數(shù)據(jù)依賴性,Img1中的宏塊就可以和Img0的一些宏塊同時(shí)進(jìn)行編碼。通過增加幀間并行,在X264編碼器中提供了更多的并行性[9]。此算法的并行機(jī)理在于:當(dāng)前幀要編碼的宏塊跟其余幀的其他宏塊同時(shí)編碼的條件是必須等當(dāng)前幀的宏塊要參考的其余幀的宏塊編碼完成。
幀間宏塊級(jí)多線程并行算法實(shí)現(xiàn)過程如下:
步1:主線程依次讀入幀,然后通過主線程來創(chuàng)建輔助線程,先創(chuàng)建的線程進(jìn)行編碼,隨后的幀只有當(dāng)其參考幀中所依賴的宏塊編碼完成后才能開始編碼。
圖3 幀間宏塊級(jí)并行方法示意圖
步2:當(dāng)創(chuàng)建的輔助線程達(dá)到設(shè)定的線程數(shù)時(shí),主線程將處于堵塞狀態(tài),輔助線程并行的編碼各幀中沒有相互依賴關(guān)系的宏塊。
步3:當(dāng)最先被創(chuàng)建輔助線程的幀編碼完成時(shí)將返回到主線程,主線程繼續(xù)讀入新幀(直到?jīng)]有新幀轉(zhuǎn)步4)并為其創(chuàng)建新的線程,以保證用于并行編碼的線程達(dá)到設(shè)定的線程數(shù),然后重復(fù)步2。
步4:當(dāng)所有的幀編碼完成之后,輔助線程釋放,主線程完成后續(xù)工作并退出。
算法使用VS2008開發(fā)平臺(tái),以X264為研究對象,實(shí)驗(yàn)用C語言編寫。實(shí)驗(yàn)設(shè)備是一臺(tái)雙核PC機(jī):操作系統(tǒng)為Microsoft Windows XP Professional(SP3),CPU規(guī)格為Intel Core 2 Duo CPU T5800(2.00 GHz),內(nèi)存為 2.00 Gbyte,硬盤為 160 Gbyte。
實(shí)驗(yàn)采用主要編碼檔次,其主要的編碼參數(shù)設(shè)置為:B幀為2幀;參考圖像為1幀;環(huán)路濾波可用;CABAC熵編碼算法可用;運(yùn)動(dòng)估計(jì)的搜索范圍為正負(fù)16個(gè)像素點(diǎn)。
實(shí)驗(yàn)選取了運(yùn)動(dòng)緩慢的Akiyo和運(yùn)動(dòng)劇烈的Coastguard兩個(gè)視頻序列,對片級(jí)并行編碼算法和幀間宏塊級(jí)并行編碼算法分別在QCIF和CIF兩種不同的格式下進(jìn)行測試,測試序列均為300幀,設(shè)置keyint_max為250。
表1是片級(jí)多線程并行和幀間宏塊級(jí)多線程并行兩種方法在不同線程數(shù)下編碼幀率(單位為f/s)的測試結(jié)果。
表1 兩種并行方法在不同線程數(shù)下的幀率
圖4和圖5分別是視頻序列Akiyo和Coastguard在兩種并行算法實(shí)驗(yàn)測試下,不同線程數(shù)目對應(yīng)的加速比的關(guān)系圖。
圖4 Akiyo兩種算法下加速比和線程數(shù)目關(guān)系
圖5 Coastguard兩種算法下加速比和線程數(shù)目關(guān)系
由測試結(jié)果可以看出,在設(shè)定的實(shí)驗(yàn)條件下,幀間宏塊級(jí)多線程并行編碼算法比片級(jí)多線程并行編碼算法具有更高的加速比。另外,對于片級(jí)并行算法,并不是設(shè)定的線程數(shù)越多,得到的加速比就越高,尤其對于運(yùn)動(dòng)緩慢的視頻序列,而當(dāng)線程數(shù)為2時(shí),加速比達(dá)到了最大。
表2是片級(jí)并行和幀間宏塊級(jí)并行兩種方法在不同線程數(shù)下編碼碼率(單位為kbit/s)的測試結(jié)果。
表2 兩種并行方法在不同線程數(shù)下的編碼碼率
表3是片級(jí)并行和幀間宏塊級(jí)并行兩種方法在不同線程數(shù)下峰值信噪比(單位為dB)的測試結(jié)果。
表3 兩種并行方法在不同線程數(shù)下的峰值信噪比
由表2的測試結(jié)果可知,幀間宏塊級(jí)多線程并行編碼算法得出的編碼碼率相對恒定,基本保持不變;片級(jí)多線程并行編碼算法的編碼碼率隨著線程數(shù)目的增大先增加后保持不變。由表3可以看出,兩種算法下的峰值信噪比變化不大,片級(jí)多線程并行編碼算法的相對偏低,因片與片之間的獨(dú)立性破壞了片與片邊界處數(shù)據(jù)的相關(guān)性。
通過上面研究和實(shí)驗(yàn)可以得出,在編碼碼率相對恒定的條件下,幀間宏塊級(jí)多線程并行編碼算法比片級(jí)并行編碼具有更高的編碼速度,同時(shí)因?yàn)槠?jí)并行編碼方法容易產(chǎn)生條帶效應(yīng),所以要考慮圖像質(zhì)量,但是片級(jí)并行編碼因只對一幀圖像進(jìn)行編碼,在系統(tǒng)中只需保存與該幀圖像編碼相關(guān)的一些參考幀圖像數(shù)據(jù)便可,對內(nèi)存需求要少,系統(tǒng)開銷要少,所以在進(jìn)行X264并行編碼的過程中,需要對圖像質(zhì)量、內(nèi)存利用率和并行效率三者做權(quán)衡來折中考慮這兩種算法,同時(shí)也可折中這兩種算法的優(yōu)缺點(diǎn)來研究視頻編碼的并行處理。
本文分別研究了片級(jí)多線程并行編碼算法和幀間宏塊級(jí)并行編碼算法,通過實(shí)驗(yàn)得出了這兩種算法的優(yōu)劣勢。對比實(shí)驗(yàn)結(jié)果表明,在編碼碼率相對恒定的條件下,幀間宏塊級(jí)多線程并行編碼算法比片級(jí)并行編碼具有更高的編碼速度,但因其需要對多幀圖像進(jìn)行并行編碼,在系統(tǒng)中需保存與多幀圖像編碼有關(guān)的參考幀圖像數(shù)據(jù),所以占用大量的內(nèi)存,于是提出可以結(jié)合兩種算法的特點(diǎn),將兩種算法結(jié)合進(jìn)行多線程并行編碼算法研究。另外,因?qū)嶒?yàn)條件的限制,沒有在更多核上進(jìn)行這兩種算法的比較,所以實(shí)驗(yàn)結(jié)果不夠全面,未來的研究重點(diǎn)是實(shí)現(xiàn)X264最大粒度的并行。
[1]蔣興昌,周軍,羅傳飛.H.264并行編碼算法的研究[J].電視技術(shù),2008,32(2):33 - 35.
[2]MEENDERINCK C,AZEVEDO A,ALVAREZ M,et al.Parallel Scalability of H.264[C]//Proceedings of FirstWorkshop on programmability issues for multi-core computers.Goteborg:[s.n.],2008:1 -164.
[3]許昌滿,李國平,王國中.AVS編碼器Slice并行編碼算法研究與實(shí)現(xiàn)[J].中國圖象圖形學(xué)報(bào),2009,14(6):1108 -1113.
[4]BUTENHOF D R.Programming with POSIX threads[M].[S.l.]:Addison -Wesley,1997.
[5]WIEGAND T,SULLIVAN G J,BJONTEGAARD G,et all.Overview of the H.264/AVC video coding standard[J].IEEE Transactions on Circuits and Systems for Video Technology,2003,13(7):560 -576.
[6]SULLIVAN G,TOPIWALA P,LUTHRA A.The H.264/AVC advanced video coding standard:Overview and introduction to the fldelity range extension[C]//Proceedings of SPIE conference on applications of digital image processing XXVII.[S.l.]:SPIE,2004:454 -474.
[7]ZHAO Z,LIANG P.Data partition for wavefront parallelization of H.264 video encoder[J].IEEE International Symposium on Circuits and Systems,2006(5):21 -24.
[8]MEENDERINCK C,AZEVEDO A,JUURLINK B,et al.Parallel scalability of video decoders[J].Journal of Signal Processing Systems,2009,57(2):173-194.
[9]CHEN Y,LI E,ZHOU X,et al.Implementation of H.264 encoder and decoder on personal computers[J].Journal of Visual Communications and Image Representation,2006,17(2):509 -532.