馬雨然,任超偉,張文明
(中國科學(xué)院光電技術(shù)研究所四川成都610209)
H.264視頻編解碼標(biāo)準(zhǔn)是由ITU-T視頻編碼專家組和ISO/IEC運動圖像專家組(MPEG)共同提出的數(shù)字視頻壓縮標(biāo)準(zhǔn)[1]。H.264的熵編碼部分采取了3種編碼方式,不同的方式對應(yīng)不同的解碼方法。在基本檔次中,殘差數(shù)據(jù)的編碼采用基于上下文的自適應(yīng)變長CAVLC編碼,而圖像參數(shù)集,序列參數(shù)集等碼流控制信息采用指數(shù)哥倫布(Exp-Golomb)編碼。主要檔次采用基于上下文的自適應(yīng)二進(jìn)制CABAC編碼。擴(kuò)展檔次只支持CAVLC而不支持CABAC,并且包含了基本檔次的所有功能。
H.264標(biāo)準(zhǔn)具有優(yōu)異的解壓縮性能和良好的網(wǎng)絡(luò)親和性,但這都是以較高的算法復(fù)雜度作為代價換取的。為了解決在CAVLC查表耗時較長的問題,國內(nèi)外學(xué)者對CAVLC解碼算法和結(jié)構(gòu)進(jìn)行了大量研究。黃明政等采用計算方法代替查表方法減少條件判斷,實現(xiàn)零內(nèi)存存取,以此提高解碼速[2]。賈俊玲利用碼字頭部對碼表分組,在熵解碼質(zhì)量沒有下降的情況下,解碼速度提高了4倍[3]。李桃中等人提出了偽并行結(jié)構(gòu)的幅值解碼,半個時鐘周期解碼一個幅值,實現(xiàn)了1080P高清視頻實時解碼[4]。Lo C C等人也提出了最大匹配查找表方法[5]。韓一石等人對碼字前綴進(jìn)行一級索引,對碼字后綴進(jìn)行二級索引,顯著提高了解碼時間和存儲空間[6]。這些方法都旨在改變CAVLC解碼器的吞吐量,調(diào)高解碼速度。
文中介紹了H.264標(biāo)準(zhǔn)解碼的原理和過程,在此基礎(chǔ)上介紹了CAVLC的解碼過程并分析了該過程各個部分的復(fù)雜度。最后提出了分組與計算結(jié)合的算法,提高解碼速度。
H.264標(biāo)準(zhǔn)并沒有明確規(guī)定解碼器如何實現(xiàn),只是規(guī)定了視頻比特流的句法以及解碼方法。解碼器分為兩個模塊:碼流解析和圖像重構(gòu)。其中熵解碼、反變換、反量化是屬于碼流解析部分。解碼過程如圖1所示。
圖1 H.264解碼器結(jié)構(gòu)
開始解碼時,由編碼器的NAL輸出一個壓縮后的H.264壓縮比特流,經(jīng)熵解碼得到量化后的一組變換系數(shù)X,再經(jīng)反量化、反變換,得到殘差利用從該比特流中解碼出的頭信息,解碼器就產(chǎn)生一個預(yù)測塊P,它和編碼器中的原始P是相同的。當(dāng)該解碼器產(chǎn)生的P與殘差相加后,就產(chǎn)生再經(jīng)濾波后,最后就得到濾波后的這個就是最后的解碼輸出圖像。其中熵編碼部分采用可選的CAVLC和CABAC,下面將對CAVLC進(jìn)行分析。
圖像中相鄰的殘差塊相關(guān)性比較大[7],CAVLC將碼表設(shè)計成與圖像殘差塊的非零系數(shù)和拖尾系數(shù)相關(guān),并且本殘差塊的系數(shù)要由相鄰殘差塊的非零系數(shù)個數(shù)解出,這體現(xiàn)的CAVLC基于上下文的思想。
CAVLC主要用于亮度和色度的殘差塊編解碼。經(jīng)過編碼器的預(yù)測、變換和量化后,碼流中的殘差塊數(shù)據(jù)具有以下特點[8]:
1)非零系數(shù)主要集中在低頻部分,而高頻部分主要是0。
2)量化后的數(shù)據(jù)經(jīng)過Zig-zig掃描后,在直流DC附近的系數(shù)幅值都比較大,而在高頻的非零幅值大部分都是+1和-1。
3)相鄰的殘差塊的非零系數(shù)的個數(shù)是相關(guān)的。
CAVLC編解碼充分利用了這些碼流特性,減少數(shù)據(jù)中的冗余信息,提高H.264標(biāo)準(zhǔn)的壓縮比。
CAVLC解碼主要包括非零系數(shù)個數(shù)TotalCoeffs模塊、拖尾系數(shù)符號TrailingOnes模塊、非零系數(shù)幅值Levels模塊、總零個數(shù)TotalZreos模塊和游歷零個數(shù)RunBefores模塊。對于TrailingOnes模塊,其本質(zhì)也是對于非零系數(shù)幅值的解析,本文將其與Levels歸并為同一模塊。這些模塊之間通過一個狀態(tài)機控制進(jìn)行協(xié)調(diào)解碼。每一個模塊解析完成之后,都要計算出所消耗的碼流長度,通過指針偏移調(diào)整碼流的輸入。CAVLC解碼結(jié)構(gòu)如圖2所示。
圖2 CAVLC解碼器結(jié)構(gòu)
通過對CAVLC的運算復(fù)雜度分析,查表部分占23%,RunBrfores占24%,非零系數(shù)幅值的計算占53%[9]。在CAVLC的4個子解碼器中,TotalCoeffs和TotalZeros是基于查表的。Runbefores一部分是用通過查表解析每個非零系數(shù)前0的個數(shù),另一部分是完成Levels和Runbefores的合并,最終形成殘差系數(shù)。而Levels通過不斷循環(huán)計算每個幅值的前綴和后綴,耗時較多。
雖然在H.264標(biāo)準(zhǔn)中明確說明了解碼的流程,但是對于不同的設(shè)計方法會根據(jù)自身設(shè)計的特點定制不同的狀態(tài)機。如果嚴(yán)格按照H.264的解碼流程設(shè)計狀態(tài)圖,則狀態(tài)較多且狀態(tài)跳轉(zhuǎn)繁瑣[10]。本文在采用了一種改進(jìn)的狀態(tài)機,簡化后如圖3所示。
圖3 CAVLC狀態(tài)轉(zhuǎn)換圖
首先解析非零系數(shù)個數(shù)TotalCoeffs,如果TotalCoeffs=0,則整個殘差數(shù)據(jù)塊全部為0,直接回到初始狀態(tài)。若TrailngOnes=0,不需要解析拖尾系數(shù)的符號,直接開始解析Levels;若TotalCoeffs=TrailingOnes,表示除了拖尾系數(shù)之外沒有其他的非零系數(shù),則進(jìn)行TotalZeros解析。不斷循環(huán)解析幅值的前綴和后綴,直到所有幅值解析完畢。解析完幅值之后,當(dāng)TotalCoeffs=maxNumCoeff,表示沒有0存在,直接輸出殘差系數(shù)。
表1 碼表規(guī)律
對于不同的后綴,可以才采用不同的計算方法,例如當(dāng)碼字前的0個數(shù)為5時,規(guī)律如表2所示。
CAVLC關(guān)于TotalCoeffs和TrailingOnes的碼表共有5個,其中定長碼表1個,變長碼表4個。關(guān)于Level_prefix的碼表1個,關(guān)于TotalZeros的碼表15個,關(guān)于RunBefores的碼表7個。整個CAVLC解碼的過程,本質(zhì)就是查表的過程。對于碼流的查表,已經(jīng)提出的有全碼表法,二叉樹法,分組碼表法等[11-13]。本文采用計算方法解析定長碼表,分組方法解析變長碼表,在分過組的變長碼表中部分采用計算方法。
文獻(xiàn)[14]將碼字分解為碼字頭和信息碼,根據(jù)碼字頭進(jìn)行分組,從而提高了解碼速度。但是這沒有考慮到CAVLC碼字的特性。CAVLC根據(jù)大量視頻統(tǒng)計,出現(xiàn)概率高的碼字長度短,出現(xiàn)概率低的碼字長度較長?;谝陨咸攸c,本文根據(jù)碼字前0的個數(shù)進(jìn)行分組來提高解碼速度。
分組查表過程受限于對碼字的判斷和比較,而計算方法可以不通過比較而直接進(jìn)行解析,提高解碼的速度。不同碼表分組情況不同,在分組后盡量使用計算方法代替查找方法。以變長碼表0<=nC<2為例,分組情況如表1所示[11]。
表2 前綴0個數(shù)為5時碼表規(guī)律
不難發(fā)現(xiàn),這種方法將變長編碼分組后,轉(zhuǎn)化為了定長編碼。除了后綴rbsp_data[6:7]為00時,TotalCoeffs和TrailingOnes滿足如下關(guān)系:
nC>=8時為定長表格,計算方法與上述碼字前個數(shù)為5的方法類似。當(dāng)碼流rbsp_data[0:5]!=000011時,TotalCoeffs和TailingOnes滿足如下關(guān)系:
在解碼時,只需要判斷檢測碼流是否為000011。若不是000011,直接根據(jù)碼流計算出非零系數(shù)個數(shù)TotalCoeffs和拖尾系數(shù)個數(shù)TrailingOnes的值,而無需二次查表,減少查找和判斷的次數(shù)。
這種方法縮短了CAVLC解碼過程中對輸入碼流作判斷的次數(shù)、減少了表的遍歷深度和訪問次數(shù),是一種具有可行性的優(yōu)化方案。綜上所述,可概括此CAVLC解碼算法的步驟如下:
step1:根據(jù)nC的取值確定所需要的碼表。
step2:讀取碼流,檢測碼流前綴0的個數(shù)。
step3:根據(jù)前綴0的個數(shù)確定碼表分組,再根據(jù)后綴計算所需要的解碼參數(shù)。
對上述的CAVLC解碼器用verilog HDL硬件語言編寫了程序代碼,采用Xilinx的ISim的仿真功能對代碼進(jìn)行了功能仿真和時序仿真。綜合時選定的FPGA器件為Zynq XC7Z045。
測試序列通過264文件轉(zhuǎn)化為文本文件,作為ISim的Testbench的輸入序列。當(dāng)000101000000 00000000101011(nC=0),1(nC=1),000100111100((nC=1)),1(nC=1),1(nC=0)作為輸入序列時,仿真結(jié)果如圖4所示。通過與264文件產(chǎn)生的殘差系數(shù)對比,可知本文的CAVLC解碼器功能正確。
時序仿真過后,結(jié)果顯示CAVLC解碼器的關(guān)鍵路徑延時為11.870 ns,采用83.3 MHz時鐘,選取三組視頻序列對本文所述的解碼器進(jìn)行測試,統(tǒng)計每個宏塊所消耗的時間周期。實驗結(jié)果如表3所示。
圖4 CAVLC解碼器仿真圖
表3 解碼器測試
從統(tǒng)計結(jié)果可以看出,Akiyo每個宏塊平均消耗的時鐘周期最多,為157.1。為了保證余量,假設(shè)每個宏塊消耗的時鐘周期為200個。根據(jù)吞吐率公式[15](1)計算得到本文所述的設(shè)計吞吐率為416 500 MB/s。
FCLK表示時鐘頻率,NMB表示解碼一個宏塊消耗的平均時鐘周期,表4列出了幀率為30的不同清晰度視頻的吞吐率和本設(shè)計的吞吐率對比。
對比結(jié)果顯示,本設(shè)計的吞吐率要高于1080P視頻所要求的吞吐率,滿足1080P@30fs的視頻解碼。如需解碼幀率為60的視頻碼流,相應(yīng)的吞吐率會變成幀率為30的2倍,本設(shè)計可以滿足720P@60fs的解碼要求。
表4 吞吐率對比
文中從CAVLC解碼原理出發(fā),分析了各個解碼模塊的復(fù)雜度。為了提高CAVLC解碼器的解碼速度,本文提出了CAVLC解碼碼表進(jìn)行分組查表,查表之后通過計算得到殘差系數(shù)的方法,提高了CAVLC解碼系統(tǒng)的吞吐率。實驗結(jié)果表明,本文設(shè)計可以正確的完成解碼,并滿足幀率為30的1080P視頻解碼要求。
[1]International Telecommunication Union.Advanced Video Coding for Generic Audio Visual Services[EB/OL].(2011-11-01).http://citeseerx.ist.psu.edu/showciting?cid=323674.
[2]黃明政,韓一石.一種可實現(xiàn)零內(nèi)存存取的CAVLC 解碼算法[J].計算機工程,2014(3):60.
[3]賈俊玲,劉彥輝.碼字前綴分組的CAVLC解碼優(yōu)化[J].中國新技術(shù)新產(chǎn)品,2010(4):2-3.
[4]李桃中,王進(jìn)祥,蘇陽平,等.H.264中CAVLC解碼器的設(shè)計與優(yōu)化[J].微電子學(xué),2015(3):372-375.
[5]Lo C C,Hsu C W,Shieh M D.Low-complexity multi-standard variable length coding decoder using tree-based partition and classification[J].IET Image Processing,2013,7(3):185-190.
[6]韓一石,王建華,黃明政,等.基于索引查詢的CAVLC解碼算法優(yōu)化[J].計算機工程與應(yīng)用,2012,48(13):167-170.
[7]何騰波,盛利元,蔣文明.H.264/AVC中CAVLC編碼器的硬件設(shè)計與實現(xiàn)[J].電子技術(shù)應(yīng)用,2010(7):66-68.
[8]何騰波.H.264/AVC中CAVLC編碼器的硬件設(shè)計與FPGA實現(xiàn)[D].長沙:中南大學(xué),2010.
[9]Tsai T H,F(xiàn)ang T L,Pan Y N.A novel design of CAVLC decoderwith low powerand high throughput considerations[J].Circuits and Systems for Video Technology,IEEE Transactions on,2011,21(3):311-319.
[10]Xu K,Liu T M,Guo J I,et al.Methods for power/throughput/area optimization ofH.264/AVC decoding[J].Journal of Signal Processing Systems,2010,60(1):131-145.
[11]付永慶,姜靈靈.H.264硬件解碼核的FPGA實現(xiàn)[J].電視技術(shù),2012,36(19):59-63.
[12]李芬,包曉敏.基于CAVLC解碼算法優(yōu)化的研究[J].浙江理工大學(xué)學(xué)報,2013,30(4):550-553.
[13]黃明政,王建華,韓一石,等.一種基于CAVLC解碼的快速碼表查找算法[J].計算機工程,2013,39(2):23-26.
[14]Ghorbani S,Zargari F.A unified architecture for implementation of the entire transforms in the H.264/AVC encoder[J].InternationalJournalof Multimedia and Ubiquitous Engineering,2013,8(1):41-54.
[15]李桃中.高清H.264熵解碼器設(shè)計與實[D].哈爾濱:哈爾濱工業(yè)大學(xué),2014.