王 堯,湯心溢
(1.中國科學院上海技術物理研究所 中國科學院紅外探測與成像技術重點實驗室,上海 200083;2.中國科學院大學,北京 100049;3.上??萍即髮W 信息科學與技術學院,上海 201210)
作為新一代視頻編碼標準,H.265/HEVC(high efficiency video coding)可支持3840 pixel×2160 pixel以上級別高清視頻的壓縮編碼,同時幀率達到30 幀/s以上級標準,要求視頻流編碼具有更高的壓縮率。H.265/HEVC標準同上一代H.264/AVC標準相比,在相同的圖像質量下碼流數據可減少50%左右[1],同時也要求更復雜的編碼計算;同CAVLC(context-based adaptive variable-length coding)相比,CABAC(context-based adaptive binary arithmetic coding,上下文自適應二進制算術編碼)可節(jié)省9%~14%的碼流數據,同時要求運算量提高約40%[2]。
HEVC標準的結構框圖如圖1所示,主要分為預測、量化、濾波和熵編碼部分。其中,熵編碼采用CABAC 編碼器,輸入為量化后的殘差數據流,通過CABAC 編碼器后輸出比特流,即最終的H.265 視頻數據流。本文基于HEVC標準,在硬件加速方面對CABAC的二進制算術編碼器進行了設計實現與優(yōu)化。
CABAC 編碼器分為3 部分:二值化,上下文建模,以及二進制算術編碼器。二值化過程將輸入的非二進制殘差數據語法元素轉化為二進制序列(bins);在上下文建模過程中,對二值化后的序列中每個符號(bin)出現的概率進行估計,分為最大概率符號(most probability symbol,MPS)和最小概率符號(least probability symbol,LPS);二進制算術編碼器則將此序列通過算術編碼的形式編碼為最終的比特流符號,完成HEVC編碼輸出。該算術編碼的本質就是用一個碼字表示一段數據流,這個碼字是對一段數據流不斷分割后獲得的[3]。每個bin 在編碼完成后都需要對其上下文模型進行更新,即概率估計過程,該過程在上下文建模部分中完成,更新當前概率狀態(tài)索引σ和LPS的值。CABAC 算術編碼器整體結構如圖2所示。
在CABAC編碼中,概率狀態(tài)(state)代表當前符號所對應的LPS出現概率,概率狀態(tài)估計值由一組有限的集合表示,LPS概率取值區(qū)間為[0.01875,0.5],對應64個概率索引值。概率理論值可由公式(1)計算得出:
式中:σ為概率狀態(tài)索引;pσ為索引值σ對應的LP S出現概率理論值;α為迭代計算系數。
圖1 HE VC編碼架構Fig.1 HEVCcoding architecture
圖2 CABAC算術編碼器基本結構Fig.2 Basicstructureof CABACarithmeticencoder
邊界情況下,當MPS出現時,概率狀態(tài)索引σ根據特定的規(guī)則跳轉增加[4],LPS對應的概率降低;當LPS出現時,概率狀態(tài)索引σ跳轉降低至對應的下一個值,LPS概率升高。當σ=0時,LPS與MPS所對應的符號互換。CABAC概率估計更新模型如圖3[4]所示,該更新過程決定了二進制算術編碼過程中概率狀態(tài)索引和LPS的輸入值,同時將當前編碼符號bin輸入至二進制算術編碼器中。
在二進制算術編碼模塊中,輸入數據包括當前待編碼符號bin,LPS值,以及上下文建模/更新后的概率狀態(tài)索引σ。該模塊主要負責編碼區(qū)間的更新,并將更新好的編碼區(qū)間打包輸出比特流。描述編碼區(qū)間的參數由low和range構成,low為當前區(qū)間的下界值,range為當前區(qū)間長度,每輸入一個bin,二進制算術編碼通過σ和目前的range值查表得到bin=LPS時所對應的range更新值,記為rLPS,之后將對lo w和range的取值進行更新。
圖3 CABAC的概率估計更新模型Fig.3 CABAC probabilityestimation update model
對當前符號bin,如果bin=LPS,則當前區(qū)間更新為:
如果bin=MPS,則當前區(qū)間更新為:
low和range值更新完畢后,編碼數據通過重歸一化[5]進行實時的打包輸出,完成二進制算術編碼器的比特流輸出。CABAC二進制算術編碼器的算法流程如圖4所示,虛線所示流程為概率估計更新的計算過程,可在上下文建模部分中完成[6],其中σ的更新計算通常使用查找表的方式代替式(1)的概率轉移運算。隨著新的編碼區(qū)間計算完畢,會產生部分已確定的編碼位,后來輸入的符號無法修改這部分編碼。重歸一化的目的是將已確定的編碼位進行及時的打包輸出,并保證更新后的編碼區(qū)間仍然可以用有限位的精度來表示。
圖4 CABAC二進制算術編碼器的算法流程Fig.4 Algorithm flow of CABAC binary arithmetic encoder
根據硬件平臺的并行運算特性,該二進制算術編碼器采用如圖5所示的多級流水線的硬件加速結構,通過犧牲硬件資源提高數據編碼速度。編碼器主要針對常規(guī)編碼模式,支持四路bin 并行輸入,首先對輸入數據進行預處理,提取編碼二進制bin值、當前LPS取值及索引值σ;之后依據圖4所示的二進制算術編碼器算法流程,以硬件流水線的形式計算每個bin 對應的rLPS、新的range值和low值,并對編碼區(qū)間進行重歸一化,最后以每8個比特作為一個字節(jié)打包輸出編碼比特流,完成編碼器輸出。
圖5 二進制算術編碼器多級流水線硬件結構Fig.5 Multi-stage pipeline hardware structure of binary arithmetic encoder
該二進制算術編碼器在流水線結構中分為4個編碼階段。在第一階段中,對每個bin,編碼器判斷當前字符bin是否為LPS,并根據輸入的概率狀態(tài)索引σ查表得到rLPS值。由于此時尚未讀取到最新的range值,rLPS的計算依賴于該range值的最高兩位,其可能取值有4種,所以需要計算并存儲每個bin的所有4種rLPS 取值,記錄為rLPSTab,并在第二階段range的更新中通過式(4)的規(guī)則進行查表讀取,解決了rLPS對range值的數據依賴問題:
在每路rLPSTab的計算中,各使用一路寄存器保存rLPSTab的值,該過程每次需要1個時鐘周期進行數據更新;在第二階段中,編碼器需要通過寄存器維護最新的編碼區(qū)間長度range_last的值,根據當前bin是否為LPS、range_last 以及通過式(4)查表讀取到的rLPS值,通過式(2)、(3)得到更新后的編碼區(qū)間長度range_update,并各使用一路寄存器進行數據暫存。編碼階段1、2 采用如圖6所示的電路計算結構,在range 計算后需要對range值進行重整,當bin 為MPS時,在計算后的range值(rMPS)最高位為0時需要對其算術左移一位,可以通過二選一MUX 解決;當bin 為LPS時,range值即為重整后的rLPS值,此時range的重整過程被預存在 rLPSupdateTab 中,rLPSupdateTab 保留了4種rLPS值所對應的重整結果,可在編碼階段1 內預先完成,需要時從LUT 中調取,避免了本級流水線對range值的數據依賴。之后,根據當前bin是否為LPS,得到編碼階段2 對應的range_update 結果,進行l(wèi)ow的計算。數據從預處理到計算結果送入編碼階段3的過程需要2個時鐘周期。
在第三階段中,編碼器需要通過寄存器維護最新的編碼區(qū)間下界low_last的值,根據當前bin是否為LPS、rMPS和low_last,通過式(2)、(3)得到更新后的low_update;第四階段為重歸一化過程,由于low的部分高位二進制數值不再隨輸入而產生變化,需要重新維護編碼區(qū)間,判斷已確定的編碼比特,將緩沖比特序列算術左移,將待輸出的bit 存放在比特暫存區(qū)中,并將已確定的二進制編碼數據以8個bit 為一個單位打包輸出,即為二進制算術編碼器的輸出比特流。由于每個bin 從輸入該模塊到輸出比特流需要依賴數據打包等待過程,完成比特輸出需要1~3個不等的時鐘周期,為防止數據溢出,設置深度為64 bit的比特buffer,將四路編碼進行緩沖存儲。編碼階段3、4的電路結構如圖7所示。
在實際運算中,對概率估計更新過程,使用查表法代替乘法運算,可大大減少運算時間,節(jié)省時鐘周期和資源占用。采用概率狀態(tài)轉移查找表,表示每個σ對應的下一個概率狀態(tài)及概率估計值,將概率估計更新后的概率數據存放在SRAM 中,在下一次概率估計更新時對SRAM 進行讀取和重新寫入,以完成概率模型的動態(tài)更新,避免了使用寄存器存儲大量數據導致的芯片資源和面積消耗。本文的二進制算術編碼器對概率估計更新進行了運算效率的優(yōu)化,由于編碼器模塊每次的輸入為同一數據塊中連續(xù)的4個bin,可將該并行輸入的4個bin的概率估計更新過程簡化為只計算其中第一個bin的概率估計更新,減少硬件資源占用和運算時間;這一過程對輸入的二進制編碼數據進行打包處理,即以4個符號的包為單位進行編碼(對應文獻[7]中N=4的情況),并將概率估計更新的計算結果在SRAM 中進行更新。當輸入的4 bit 序列的后三位為交替出現的序列,即{LPS,MPS,LPS}或{MPS,LPS,MPS}時,對于編碼效率的影響最小,此時只有1個bin的概率估計更新值受到1次σ跳轉的影響[7];而對于最差情況[8],輸入的4 bit 序列的后三位為同一符號,即{LPS,LPS,LPS}或{MPS,MPS,MPS}時,此組序列僅有3次σ跳轉的偏差,整體而言可兼顧運算資源與編碼效率的平衡,并將算術編碼器部分的SRAM 使用數量減少為原始算法[9]的2/5,同時略微提高硬件編碼速度。
圖6 Range_update的計算結構Fig.6 Calculation structure of range_update
圖7 Low的計算和比特輸出Fig.7 Calculation and bit output of low
對本文的二進制算術編碼器在Vivado 2018.2 平臺上進行前仿真,仿真結果如圖8所示,在不考慮初始化及中斷復位的情況下,該算術編碼器每個時鐘周期可以完成4個bin的編碼,相比文獻[3]的結構有顯著的編碼速度提升。
采用Xilinx的xczu9eg-ffvb1156 FPGA 對本文的二進制算術編碼器模塊進行硬件實現,綜合實現后的資源占用情況如表1所示。
在本文設計中,將DSP 乘法器運算全部轉化為查找表運算,避免了時序問題的同時提高整體編碼速度,數據輸出時延為3~5個時鐘周期。本文與其他參考文獻的實現結果對比如表2所示,與文獻[3]相比,本文的二進制算術編碼器消耗了大量的LUT 資源用于概率索引查找表以及range、low的快速計算,而每個Slice可提供4個6 輸入的LUT,在該系列Xilinx 器件中每個CLB 邏輯單元對應2個Slice,導致承載LUT的CLB的數量消耗為文獻[3]的4倍左右,與后者每時鐘周期0.7個bin的編碼速度對比,本文在犧牲了大量片上資源的基礎上,獲得了更快的編碼速度,實時性更強,在相同條件下可支持1080p 視頻數據在30~60 f/s 幀率下的實時編碼,符合基于HEVC高效的CABAC二進制算術編碼器的設計要求。
圖8 二進制算術編碼器仿真結果Fig.8 Binary arithmetic encoder simulation results
表1 二進制算術編碼器資源使用情況Table1 Binary arithmetic encoder resource usage
表2 與其他文獻實現結果對比Table2 Comparison with implementation results of other references
本文實現了HEVC的CABAC二進制算術編碼器常規(guī)編碼模式下的硬件加速結構,基于并行流水線對二進制算術編碼器進行硬件結構設計與實現,通過SRAM 存儲概率估計更新數據,使用查找表優(yōu)化概率估計及編碼區(qū)間的計算過程,避免DSP 乘法運算,縮短運行時間。結果表明,本文的硬件CABAC二進制算術編碼器平均每時鐘周期可以完成4個bin的編碼,適用于對HEVC 視頻編碼實時性要求較高的場合,功耗相對有限,編碼效率高,支持較高幀率的1080p 視頻實時編碼,具有較快的數據編碼傳輸能力。