許詩卉
(上海交通大學(xué)電子信息與電氣工程學(xué)院,上海 200240)
H.266/VVC 作為目前最新的視頻編碼標(biāo)準(zhǔn),比上一代H.265/HEVC 提高50%的壓縮率[1]。在VVC 中,視頻聯(lián)合視頻專家組(JVET,Joint Video Experts Team)依然選用CABAC(Context-Based Adaptive Binary Arith?metic Coding)作為熵編碼的唯一算法。
CABAC 編碼器一般選用DSP(Digital Signal Pro?cessing)、FPGA(Field Programmable Gate Array)和ASIC(Application-Specific Integrated Circuits)等技術(shù)實現(xiàn)。其中DSP 的性能存在爭議[21],根據(jù)文獻[21-22]ASIC 的處理速度平均比FPGA 快3-5 倍,因此專用的ASIC 設(shè)計已經(jīng)成為視頻編碼器實現(xiàn)的主要解決方案。
近年來,有很多改進方案通過提高并行度[5,8,11,13]來提高熵編碼的吞吐率,例如Z.Liu[12]采用2 bin 并行的重歸一化操作,Wei Fei[5]將四個BAE(算術(shù)編碼引擎,Binary Arithmetic Encoding)單元級聯(lián)從而實現(xiàn)4bins/cycle 的吞吐率。但是這種結(jié)構(gòu)會使關(guān)鍵路徑長度增加2-4 倍。另外一些學(xué)者試圖從面積或功耗的角度降低成本[6,9],例如A.L.d.M.Martins 等人[9]將一元碼和FL(定長編碼,F(xiàn)ixed Length)編碼引擎級聯(lián)實現(xiàn)EGk(K 階指數(shù)哥倫布編碼,Kth Exp-Golomb)二值化編碼,平均可以節(jié)省50%的硬件資源,但是也需要犧牲一半的頻率。目前還沒有關(guān)于針對系統(tǒng)級的存儲優(yōu)化和架構(gòu)優(yōu)化層面提高吞吐量方面的研究。
本文提出基于塊合并的數(shù)據(jù)重排技術(shù),通過對待編碼語法元素的排布方式進行優(yōu)化合并,可以節(jié)省69%的存儲空間。此外還提出基于語法元素分組的二值化選擇管理技術(shù),通過調(diào)整二值化架構(gòu)把編碼時鐘的占比率提高了20.13%。該方案在TSMC 28nm 工藝下綜合得到的最高頻率是480MHz,可以處理1.47bins/cycle。
如圖1 所示,視頻編碼架構(gòu)包括幀內(nèi)預(yù)測、幀間預(yù)測、變換/量化、環(huán)路濾波、熵編碼等模塊。作為視頻編碼的最后環(huán)節(jié),熵編碼根據(jù)隨機過程的統(tǒng)計信息進行預(yù)測編碼,是一種無損壓縮算法。經(jīng)過熵編碼處理待編碼語法元素(SE),但可能會消耗整個處理時間的24%以上[2]。
圖1 視頻編碼架構(gòu)
熵編碼過程包括3 個主要步驟:①二值化(BZR,Binarization);②上下文建模與更新(Context Modeling and Updating);③二進制算術(shù)編碼(BAE,)Binary Arith?metic Encoding。圖2 是我們的熵編碼器架構(gòu)。在這種結(jié)構(gòu)中EC_CTRL 主要負(fù)責(zé)編碼控制,CABAC_BZR 負(fù)責(zé)對語法元素進行二值化;CTX_INIT、CTA_MAG 共同完成上下文初始化與更新工作,上下文數(shù)據(jù)存儲在CTX_RAM 里;BAE 模塊將bin 字符串編碼成bit 流后通過SP(Stream Packer)打包輸出。中間插入buffer 平衡BZR 和BAE 的速度。
上述架構(gòu)中EC_CTRL 需要和CABAC_BZR 進行交互握手,得到響應(yīng)信號后再向下編碼下一個語法元素,交互信號需要額外2 個cycle 來實現(xiàn),會增加硬件電路中的氣泡。與此同時,由于傳統(tǒng)設(shè)計中基于塊劃分的存儲結(jié)構(gòu),存儲待編碼語法元素的RAM 空間利用率比較低,一個字長(64bit)的最低利用率僅有6.25%,也存在優(yōu)化空間。
在ASIC 設(shè)計里普遍采用基于塊劃分的存儲方式,根據(jù)CU(Coding Unit)、PU(Prediction Unit)、TU(Trans?form Unit)等的劃分情況,把單個Unit 內(nèi)的語法元素進行合并(即單個字內(nèi)存儲的語法元素不能跨越CUPUTU 的劃分邊界)。這樣:在Intra 模式下,1 個CTU 最多需要存儲的非殘差語法元素的個數(shù)為:1CTU+2SAO+64×(1CU+1TT+6RC)=515(x64bit);在In?ter 模式下,對于單向預(yù)測的PB 塊最小尺寸為4×8 和8×4,對于雙向預(yù)測的PB 塊,最小尺寸為8×8,為此最多需要存儲的非殘差語法元素的個數(shù)為:1CTU+2SAO+64×(2PU+1TT+6RC)=579(x64bit)。無論在Intra 還是Inter 模式下,最多需要存儲的殘差語法元素的個數(shù)為:64×64×16×1.5/256=384。為此,硬件實現(xiàn)時需要兩塊RAM,一塊大小為579×64 Bit 用來存放一個CTU 的非殘差語法元素,一塊大小為384×256 Bit 用來存放一個CTU 的殘差語法元素。
在對多個視頻測試序列中的語法元素進行統(tǒng)計分析后,與TU 相關(guān)的語法元素(存放在TT(Transform Tree)和RC(Residual Coding)中)占總數(shù)據(jù)量的72.97%~83.12%,他們的存儲效率與塊尺寸有極大的相關(guān)性,具體數(shù)值如表1 和表2 所示。理想情況下TT 和RC對存儲空間的平均利用率為10.49%。綜上所述,本文決定對TT 和RC 兩個部分進行存儲優(yōu)化。
表1 TT 部分存儲空間利用率
表2 RC 部分存儲空間利用率
分析表1 和表2 中的數(shù)據(jù)可得小于16x16 的塊存儲空間利用率不足25%,小于8×8 的塊存儲利用率剛好是6.25%。HEVC 中編碼塊基于四叉樹進行劃分,因此當(dāng)合并塊的個數(shù)是4 的倍數(shù)或者是16 的倍數(shù)時更有利于硬件結(jié)構(gòu)的實現(xiàn)?;谏鲜鎏匦?,本文選擇16×16 尺寸作為分界點,對于大于等于16×16 的CU 塊和TU 塊依然基于塊劃分存儲語法元素,對于小于16×16的塊把它們的信息一律合并到一個字長里(64bit),為了尋址方便,在單個字長內(nèi)采用等分的方式,即有效信息中間會存在若干bit 的保留位。
經(jīng)過優(yōu)化后的存儲器非殘差語法元素采用64bit位寬的RAM:在Intra 模式下,最多需要1CTU+2SAO+64CU+16TT+7RC+16×1.5RC=114(個字);在Inter 模式下,對于單向預(yù)測的PB 塊最小尺寸為4×8 和8×4,對于雙向預(yù)測的PB 塊,最小尺寸為8×8,為此最多需要1CTU+2SAO+64×2PU+16TT+7RC+16×1.5RC=178(個字)。存儲殘差語法元素的空間不變。綜上所述,優(yōu)化后的設(shè)計在硬件實現(xiàn)時需要兩塊RAM,一塊大小為178×64 Bit 用來存放一個CTU 的非殘差語法元素,一塊大小為384×256 Bit 用來存放一個CTU 的殘差語法元素。和優(yōu)化前的相比,存儲非殘差語法元素的RAM 比原來節(jié)省69%的存儲空間。
H.265 里一共用到5 種二值化方式:一元碼(Unary)、截斷一元碼(TU,Truncated Unary)、截斷萊斯碼(TR,Truncated Rice Binarization)、定長編碼(FL,F(xiàn)ixed Length)、K 階指數(shù)哥倫布編碼(EGk,Kth Exp-Golomb)。H.266 除了上述幾種二值化方式外新增截斷二元碼(TB,Truncated Binary)。其中FL、TR、EGK 等模塊可以被多個語法元素共用,其他用特殊方式進行二值化的語法元素,比如H.265 里的part_mode(PM)等需要單獨模塊來處理。二值化模塊的結(jié)構(gòu)如圖3 所示。
圖3 二值化模塊
如圖3 所示,在基于語法元素分組的設(shè)計結(jié)構(gòu)中所有語法元素的二值化都在CABAC_BZR 模塊進行,A.B.Hmida[7]和N.Neji 等人[15]的設(shè)計也也基于該結(jié)構(gòu)。如圖2 中所示,控制模塊和二值化模塊之間通過二相握手協(xié)議進行交互,控制模塊向CABAC_BZR 塊發(fā)送編碼請求信號cabac_req,待編碼完成后CA?BAC_BZR 模塊將二值化后的數(shù)據(jù)發(fā)送到Buffer 進行緩存,并且向CTRL 模塊返回響應(yīng)信號cabac_ack,CTRL 模塊接到cabac_ack 信號后可以進入下一個狀態(tài),即每次二值化最少需要2 個cycle 完成。FL 二值化只需要根據(jù)各個語法元素的cMax 值對數(shù)據(jù)做拼接操作,交互信號使每個bin 都有至少1 個cycle 氣泡。經(jīng)統(tǒng)計,H.265 里一共有56 種語法元素,其中用FL 方式二值化的有39 種,即69.64%的語法元素都需要消耗額外1 個cycle 來進行二值化;H.266 里一共有111種語法元素,其中用FL 二值化的有76 個即68.46%的語法元素都需要消耗額外1 個cycle 執(zhí)行二值化編碼,氣泡總數(shù)相當(dāng)可觀。
本課題通過對二值化架構(gòu)進行微調(diào)整,把FL 編碼提到語法元素的預(yù)處理模塊(如圖4 所示),這樣用FL方式編碼的語法元素可以經(jīng)過選擇器篩選后直接送入Buffer 中等待后續(xù)模塊的處理,有效減少了上述由握手信號帶來的額外時鐘消耗,使編碼時鐘占比率提高了20.13%。
圖4 改進后的熵編碼器結(jié)構(gòu)
本文用Verilog 語言實現(xiàn)了如圖3 中所述的編碼器架構(gòu),用Cadence NCsim 工具進行電路仿真和功能驗證,并通過的Cadence Genus 工具進行邏輯綜合,綜合過程基于TSMC 28nm 的工藝庫。表3 中列出了本文實驗結(jié)果以及和之前工作的比較。
表3 與其他論文的結(jié)果對比
仿真過程的輸入激勵由官方測試模型HM16.20 獲得,用Perl 語言編碼的腳本對得到的測試激勵進行處理,調(diào)整成第2 小節(jié)中我們需要的順序。
如表3 所示,所提出的架構(gòu)平均每個周期編碼1.47 個bin,最高工作頻率為480MHz,編碼器的吞吐量可以達到706Mbits/s,遠(yuǎn)遠(yuǎn)大于2560×1600@60fps 的視頻序列實時編碼時所需要的423.44Mbits/s[8]時的吞吐率。如圖5 所示為歸一化后的面積效率對比,可以看到本文設(shè)計的面積效率是文獻[8]中設(shè)計的1.73 倍。
圖5 面積效率對比
本文提出了基于HEVC 視頻編碼標(biāo)準(zhǔn)的CABAC編碼器的硬件設(shè)計,并且提出了非殘差語法元素的存儲優(yōu)化方案,使該RAM 可以節(jié)省掉69%的硬件資源。同時優(yōu)化后的架構(gòu)可以將編碼時鐘占比率提高20.13%,跟以往設(shè)計相比可以實現(xiàn)1.73 倍的面積效率。