李程達,陳 煒
(福建郵科通信技術有限公司,福建 福州 350002)
H.264/AVC作為新一代視頻壓縮技術,引入了CAV?LC和CABAC兩種全新的熵編碼方法。CAVLC和CA?BAC是在充分考慮編碼數據特性的基礎上對數據進行壓縮,算法利用了相鄰數據間的相關性,可以動態調整編碼表,這些都為H.264/AVC的高壓縮率奠定了基礎。其中,CAVLC根據已編碼句法元素的情況,動態調整編碼中使用的碼表,取得了極高的壓縮比。本文在對CAVLC編碼原理分析的基礎上,優化了相關算法,并針對該算法設計了相應的電路結構,實現了待編碼殘差塊的數據特征處理,簡化了后續運算的復雜性,提高了處理能力。
在H.264/AVC中,CAVLC用于亮度和色度殘差塊數據的編碼,其利用了4×4量化塊的多種特性,例如,4×4塊經過預測、變換、量化后,非零系數主要集中在低頻部分,在經過zig-zag掃描后高頻系數部分連續零個數較多,量化后在數據經過zig-zag掃描得到的數據序列中,DC系數附近的非零系數幅值較大,最后高頻位置上的非零系數值通常是1或-1。相鄰的 4×4塊的非零系數的數目是相關的,非零系數數目用查找表的方式編碼,查找表的選擇取決于相鄰塊非零系數數目,體現了基于上下文設計的思想[1]。
CAVLC制定了可自適應動態調整的碼表,將非零系數值Level和零游程Run分開編碼,進一步減少了數據中的冗余信息,為H.264/AVC卓越的編碼效率奠定了基礎。其編碼過程描述如圖1所示。

對CAVLC的5個流程分析后可以發現,順序步驟之間并沒有很強烈的數據依賴關系,考慮硬件實現的優勢是可以將編碼的流程并行計算,因此針對硬件實現,對編碼的軟件算法進行了優化改進,具體如下:
1)改變編碼的順序流程,將5個步驟所需的參數計算部分并行執行,從而減少時鐘周期的損耗。
2)結合編碼過程對數據序列中的數據進行分析,編碼需要用到的是殘存塊數據的3種特征,分別為是否為0、是否為1和系數符號。考慮到硬件實現過程中位運算的獨特優勢,分別用標志位的方式來標示整個數據序列的數據特征。在編碼過程中,對數據序列的大部分運算操作轉化為對標志位的位運算,這樣不但減少了硬件邏輯的損耗,同時進一步提高了處理速度,例如,對于掃描后數據序列0,3,0,1,-1,-1,0,1,0,0,0,0,0,0,0,0,用16 bit的標志位分別標示16個數據的非零屬性,得出標志為0101 1101 0000 0000(1表示該位對應的系數為非零系數,0表示該系數為0),為1屬性標志為0001 1101 0000 0000(1表示該位對應的系數幅值為1,0表示該系數幅值不為1),負數屬性標志為 0000 1100 0000 0000(1表示該位對應的系數為負數,0表示該系數為正數)。
3)在圖1的步驟1中,定長表格的碼字是6 bit,高4 bit表示非零系數數目TotalCoeffs,最低2 bit表示拖尾系數的數目T1s,因此可以利用算術運算代替查表操作,節省電路面積。
在CAVLC編碼過程中,除句法元素Level之外,其余元素的編碼都是根據標準定義的碼表,求出相應的入口地址得到該句法元素對應的編碼碼字?;谏鲜鏊惴▋灮乃枷?,在對系統進行模塊劃分后,本文提出了一種高效的CAVLC編碼器實現方法,其硬件結構框圖如圖2所示(CAVLC編碼器部分用實線框表示,虛線框代表在整個H.264/AVC編碼器系統中與CAVLC相關的前后接口模塊)。其中虛線為控制信號,實線為數據流。

該結構將CAVLC編碼的5個子流程歸為3個部分,其中參數計算編碼部分完成了非零系數總數Totalcoeffs和拖尾系數數目T1s、拖尾系數符號T1s_sign、最后非零系數前零總數TotalZeros的編碼。同時,將除拖尾系數之外的非零系數幅值Level和每個非零系數前零個數Run_before的編碼過程分開獨立進行,對3個部分分別設計了具體的運算電路。為了進一步減少電路規模,在電路中加入了預處理模塊,對經過zig-zag掃描后的4×4殘差塊數據序列進行數據特征的抽象,簡化了后續模塊計算的復雜性。整個系統主要由以下部分構成:預處理模塊、Level重映射與編碼部分、參數計算與編碼部分、Run_before計算與編碼部分以及控制器。
系統的編碼流程由控制器控制,控制器由一個Mealy型有限狀態機實現,其狀態轉移圖如圖3所示。系統復位后進入Idle狀態,各模塊進行初始化工作,預處理模塊并行地接收來自系統外部,經過zig-zag掃描后的4×4塊數據,對數據處理后得到相應的數據特征標志。隨后系統啟動參數計算器(Cal狀態),參數計算器計算得出非零系數總數Totalcoeffs、拖尾系數數目T1s、拖尾系數符號T1s_sign和最后非零系數前零總數TotalZeros(CalTo?talzeros狀態)。接下來,控制器根據參數計算器中模塊的輸出信號啟動參數編碼模塊、Level重映射模塊(CT_Lmap狀態)。當Level重映射完成之后,控制器啟動Level編碼器(CodeLevel狀態)。待Level編碼完成后,Run_before計算與編碼部分開始工作,輸出Run_before編碼后的碼字信息(Code_Runbefore狀態)。編碼完CAVLC所有句法元素后,重新讀取下一個4×4塊開始下一輪殘差塊的編碼。此外,在編碼過程中,各個編碼模塊向外部輸出碼字的數值和長度、系統外部的碼字重組、生成模塊根據碼字的信息,完成碼流順序的調整并生成相應的二進制碼流。

參數計算器完成對參數Totalcoeffs,T1s,T1s_sign和TotalZeros的計算,其結構如圖4所示。在參數計算器中共有4個獨立的電路功能模塊,通過對數據特征標志的計算得到參數,具體電路采用移位寄存器、判斷邏輯等結構實現。參數編碼器結構如圖5所示,參數的編碼是基于碼表進行的。Coeff_token的編碼需要總共5個碼表,其中,定長表格以邏輯計算代替查表操作,其余4個表格存放在ROM1中。在TotalZeros編碼過程中,對于4×4塊和2×2塊情況下的碼表分別存于ROM2和ROM3中,每個編碼模塊完成編碼后,輸出相應碼字信息,包括碼字值codeword和碼字長度codelen。


Level編碼器結構如圖6所示,控制器根據輸入的To?talcoeffs和T1s初始化suffixlength,通過信號sel選通MUX依次對Level1~Level16進行編碼,編碼完成后輸出前綴值prefix,后綴值suffix和后綴長度suffixsize,最后控制器根據當前已經編碼的非零系數幅值是否大于相應的閾值對suffixlength進行更新。其中,Level編碼運算過程在模塊Levelcode_gen中實現。

用Verilog HDL語言對本文提出的電路結構進行RTL級描述,采用Synopsys的Design Compiler在SIMC 0.18 μm CMOS單元庫下綜合,最大限制頻率為181 MHz時,規模為2 660門。本文在仿真時采用JVT提供的JM8.6 C程序產生碼流進行了測試,RTL級模型的仿真結果和C程序的運算結果一致。仿真結果顯示,在工作頻率為181 MHz的情況下,本文設計的數據吞吐率為41.97 Msample/s。實現對高清格式視頻(分辨力為1 280×720,30 f/s)的實時處理,需達到的數據吞吐率為41.472 Msample/s(1 280×720×1.5×30)。可以看到,本文提出的CAVLC編碼器設計方案滿足對高清格式視頻的實時處理。
本文提出了一種適用于H.264/AVC的CAVLC編碼器優化算法及其電路結構,通過對編碼流程的重新劃分,安排了緊湊的控制時序,并在電路中設計了數據特征提取的電路單元,減少了后續模塊運算的復雜性。實驗結果表明,本設計電路規模約為2 660門,能夠以41.97 Msample/s的數據吞吐率對視頻進行處理。與同類設計相比[2],電路規模小,處理能力高,可方便用于H.264/AVC編碼芯片中,也可作為IP核嵌入到特定目的的處理器或DSP中。
[1]ITU-T Rec.H.264/ISO/lEC 14496-10 AVC,Drafl ITU-T recommendation and final drafl intemational standard of joint video specification[S].2003.
[2]CHEN T C,HUANG Y W,TSAI C Y,et al.Architecture design of context-based adaptive variable-length coding for H.264/AVC[J].IEEE Trans.Circuits and Systems II:Express Briefs,2006,53(9):832-836.