本系列主要介紹視頻編解碼芯片的設計,以HEVC視頻編碼標準為基礎,簡要介紹編解碼芯片的整體硬件架構設計以及各核心模塊的算法優化與硬件流水線設計。
參考幀壓縮引擎對存儲在幀存儲器中的數據進行壓縮,以減少外部帶寬和功耗。當運動補償幀的像素必須寫入外部DRAM時,參考幀壓縮引擎將對這些像素進行壓縮。在運動估計期間,參考幀壓縮引擎解壓縮先前幀的像素并將其傳輸到視頻編解碼器。
本文將先介紹一種優化的參考幀壓縮的預測方法和熵編碼算法,然后介紹其VLSI實現和性能評估。
1
概述
對于支持UHD實時編碼的視頻編碼器來說,幀間預測中的帶寬問題逐漸成為系統設計的瓶頸。參考幀壓縮是一種減少視頻編碼器訪存帶寬的有效方案,不僅可以減小讀參考幀像素的帶寬,還能減少編碼器向外存寫入重建幀像素的帶寬。
對于現有的參考幀算法,有如下4個衡量標準:
1、壓縮率:壓縮率表示壓縮后和壓縮前的參考幀數據大小的比。壓縮率越小,代表該參考幀壓縮算法的效果越好,訪存帶寬越小。
2、吞吐率:太復雜的壓縮算法可能會導致幀壓縮模塊的吞吐率過小,不能滿足高分辨率視頻實時編碼的要求。
3、模塊透明度:參考幀壓縮模塊必須能夠支持編碼器從任意位置取參考像素時能夠立即解碼,而不需要預先載入其他位置的參考像素。
4、硬件實現:參考幀壓縮的算法必須易于硬件實現,以簡化硬件設計時的難度。
2
算法設計
數據結構
在整個HEVC視頻編碼器系統中,環路濾波單元處理的基本單元塊高度為4。因此,為了能讓參考幀壓縮模塊能夠支持整個編碼器系統的數據讀寫,本文提出的參考幀壓縮算法的壓縮基本單元大小為8×4,最終的壓縮碼流數據結構如下所示。
圖1
其中,“F”代表該8×4左上角的像素;“G”代表該8×4的分組模式;“M”代表該8×4塊中每個分組的編碼模式;“D”代表編碼后的殘差;“T”代表符號位。
由圖可知,每個8×4塊的壓縮數據可能存在3種類型:“Ori Data”、“NotAll Zero”和“All Zero”,分別代表了該殘差分布的3種類型。在本設計中,我們用每個8×4塊壓縮后碼流的長度信息標記其數據類型。每個8×4塊壓縮后的碼流長度用一個8比特的數表示,并且和壓縮后的碼流一起存入外部存儲器中。如果碼流長度等于8,那么該8×4塊壓縮碼流為“All Zero”類型;如果碼流長度大于8且小于256,那么該8×4塊壓縮碼流為“Not All Zero”類型;如果碼流長度等于0,那么該8×4塊壓縮碼流為“Ori Data”類型。
“Ori Data”代表壓縮后的碼流長度大于等于256比特,將該8×4塊的原始像素打包進最終碼流中,并且將碼流長度標記為0。
“Not All Zero”類型是最基本的數據類型,代表該8×4塊在經過了預測和熵編碼階段后,將殘差的熵編碼結果以及預測的模式信息打包進了最終碼流。
“All Zero”代表該8×4塊的所有像素等于同一個值,只存儲該8×4塊左上角的像素,并將碼流長度標記為8。
DPCM預測
在預測之前,每幀圖像會被劃分為若干8×4的塊。考慮到算法復雜度的限制,本文采用了DPCM預測方法,如下所示,其中箭頭表示該像素的預測方向。
圖2
左上角的像素會被直接打包進壓縮碼流的“F”部分,該像素將會作為參考幀壓縮模塊解壓縮階段的起點;第1列的剩余3個像素的殘差等于該像素與其上方像素的差值;第2列到第8列的28個像素的殘差等于該像素與其左側像素的差值。
小值優化的半定長編碼
在熵編碼階段,本文針對預測殘差的分布特征,對[1]中提出的半定長編碼方案做了小值優化。首先,每個8×4塊被劃分為8個2×2的子編碼塊,根據每個小塊內殘差的最大絕對值得到其編碼模式CM,如下表所示。
表1
小值優化的半定長編碼規則如下表所示,其中S是殘差的符號位,S代表S的取反值。
表2
如果2×2子編碼塊內的某個殘差等于2CM-1,則在“T”中增加一位0;如果等于-2CM-1,在“T”中增加一位 1。在確定了2×2子編碼塊的編碼模式CM后,該2×2子編碼塊內的4個殘差值可以根據上表得到其編碼值。
由數據結構圖可知, “F”部分和“G”部分的長度是固定的。在確定了“M”部分的數值后,可以得到“D”部分的長度,以及“D”部分中各個殘差的長度。“T”部分的長度可以由總長度減去“F”、“G”、“M”和“D”的長度得到。
子編碼塊分組
如果相鄰的子編碼塊擁有相同的編碼模式,那么可以用同一個“M”來表示這個子編碼塊組的編碼模式,減少 “M”部分的長度。下圖描述了4種分組方式以及對應的分組模式“G”。
圖3
3
VLSI設計
參考幀壓縮模塊的壓縮階段的流水級如下所示。
圖4
第1個流水級,對8×4編碼塊做DPCM預測,且將左上角像素放入最終碼流的“F”部分,并根據殘差獲得每個2×2子編碼塊的編碼模式“M”,在此基礎上得到2×2子編碼塊的分組方式“G”。
第2個流水級,對8×4塊內的殘差同時編碼,并且放入最終碼流的“D”部分。
第3個流水級,如果第1個流水級計算得到所有殘差等于0,那么將左上角像素打包進最終碼流中,并將碼流長度記錄為8;如果第2個流水級編碼得到的“D”加上“F”、“G”、“M”、“T”的總碼流長度大于等于256,那么將該原始32個像素打包到最終碼流中,并將碼流長度記錄為0;如果碼流長度小于256,那么將第1個流水級以及第2個流水級得到“F”、“G”、“M”、“D”和“T”部分打包到一起輸出到外部存儲器中,并記錄碼流長度。
參考幀壓縮模塊的解壓縮階段的流水級如下所示。
圖5
第1個流水級,解析出碼流中的“F”、“G”、“M”、“D”和“T”。
第2個流水級,根據第1個流水級中的編碼模式“M”分離出“D”部分中各個殘差的編碼值。
第3個流水級,參照小值優化的半定長編碼規則表,對“D”中各個殘差同時解碼。
第4個流水級,根據第3個流水級得到的殘差值以及第1個流水級得到的左上角像素值恢復得到整個8×4塊的32個像素。
參考幀壓縮模塊的編解碼階段的每個流水級均為2個時鐘周期,也就是說設計的吞吐率是32/2=16,如果是YUV420的視頻序列,則吞吐率是16/1.5=10.67。
4
性能評估
對Class A~E的序列進行測試,得到最終的壓縮率的測試結果如下所示。
圖6
在壓縮率方面,本文提出的參考幀壓縮算法的平均壓縮率約為56.1%,因為采用了較小的編碼塊(8×4)和較簡單的壓縮算法,影響了最終的壓縮效果。
在硬件面積方面,本文提出的參考幀壓縮架構的等效邏輯門數目僅為43.98K,這同樣歸因于較小的編碼塊和較簡單的壓縮算法。
在吞吐率方面,本文提出的參考幀壓縮架構的吞吐率高達5.3G 像素/s,能夠在Level B級的數據復用時,支持UHD 4K×2K@60fps實時編碼的硬件設計。
參考文獻:
[1] L. Guo, D. Zhou and S. Goto.A New Reference Frame RecompressionAlgorithm and Its VLSI Architecture for UHDTV Video Codec[J].IEEE Transactionson Multimedia, 2014, 16(8):2323-2332.