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