1 CABAC引擎
1.1 HEVC的編解碼引擎
HEVC中的CABAC引擎使用基於表的概率轉換過程,(在64個不同的代表性概率狀態之間)。
在HEVC中,在計算新的range範圍之前,將表示編碼引擎狀態的範圍ivlCurrRange
量化爲4個值的集合。使用包含所有64x4x8位的表來實現HEVC狀態轉換,以近似ivlCurrRange * pLPS(pStateIdx)
的值,其中pLPS是最小可能符號(LPS)的概率,pStateIdx
是當前狀態。
而且,可以使用LUT來實現解碼。如下使用LUT獲得第一ivlLpsRange
。然後,使用ivlLpsRange
更新ivlCurrRange
並計算輸出binVal
。
1.2 VVC的編解碼引擎
在VVC中,CABAC在每個Slice的開頭都調用了QP相關的初始化過程。給定切片的亮度QP的初始值,表示爲上下文模型的初始概率狀態,表示爲preCtxState
,計算方法如下
其中,slopeIdx
和offsetIdx
限制爲3位,總初始化值由6位精度表示。概率狀態preCtxState
直接表示線性域中的概率。
因此,preCtxState
在輸入到算術編碼引擎之前只需要進行適當的移位操作即可,並且可以保存對數到線性域的映射以及256字節的表。
2 變換系數熵編解碼
在HEVC中,使用不重疊的係數組(CG或子塊)對編碼塊的變換系數進行編碼,並且每個CG都包含編碼塊的4×4塊的係數。
在VVC中,係數組大小的選擇僅取決於TB大小,即刪除對通道類型的依賴性。所以各種CG(如1x16、2x8、8x2、2x4、4x2和16x1)都是可用的。
根據預定義的掃描順序對編碼塊內的CG和CG內的變換系數進行編碼。爲了限制每個像素的上下文編碼容器的最大數量,TB的面積和色彩分量用於得出TB的上下文編碼容器的最大數量。
對於亮度TB,上下文編碼的bin的最大數量等於TB_zosize x 1.75
。
對於色度TB,上下文編碼容器(CCB)的最大數量等於TB_zosize x 1.25
。
其中,TB_zosize
表示係數歸零後TB內的樣本數。
注意,CCB計數不考慮ts下的coded_sub_block_flag
。與HEVC不同,在HEVC中,殘差編碼被設計用於變換系數幅值的統計和信號特性,而分別使用兩個單獨的殘差編碼結構分別用於變換系數和變換跳過係數。
2.1 普通變換系數的殘差編碼
在變換系數編碼中,首先將變量remBinsPass1
設置爲上下文編碼的bin的最大數量,並在發信號通知上下文編碼的bin時將其減少1。
1、當remBinsPass1
大於或等於4時,將使用上下文編碼的bin對包括sig_coeff_flag,abs_level_gt1_flag
,par_level_flag
和abs_level_gt3_flag
在內的第一遍編碼進行編碼。
2-1、如果在第一遍編碼中上下文編碼的bin的數量不大於Mccb,則通過使用Golomb-rice
碼使用abs_remainder
的語法元素對指示在第一遍中進一步編碼的級別信息的其餘部分進行編碼和旁路編碼。
2-2、當remBinsPass1
在進行第一遍編碼時變得小於4時,指示爲在第一遍中進一步編碼的其餘係數部分將使用abs_remainder
的語法元素進行編碼,而在第一遍中未進行編碼的係數通過使用Golomb-Rice
編碼和旁路編碼的bin,在第二遍中使用dec_abs_level
的語法元素直接對其進行編碼。
每個TB都會重置remBinsPass1
。對於sig_coeff_flag
,abs_level_gt1_flag
,par_level_flag
和abs_level_gt3_flag
使用上下文編碼,到對其餘係數使用旁路編碼,每TB最多隻能發生一次轉換。
對於係數子塊,如果remBinsPass1
小於4,則使用旁路編碼對整個係數子塊進行編碼。
3、在所有上述級別編碼之後,最終旁路所有sig_coeff_flag
等於1的掃描位置的符號。
統一的Rice參數可以用於Pass 2和Pass3。唯一的區別是Pass 2和Pass 3的baseLevel
分別設置爲4和0。Rice參數不僅根據本地模板中相鄰五個變換系數的絕對level的總和確定,而且還考慮了相應的基本level:
2.2 變換跳過係數的殘差編碼
與HEVC相似,VVC支持TS模式。 在TS模式中,信號的統計特性與變換系數的統計特性不同,並且將變換應用於此類殘差以實現低頻分量周圍的能量壓縮通常不太有效。 與自然相機捕獲的內容相反,通常在屏幕內容中發現具有此類特徵的殘差。
3 係數編碼上下文模型
與變換系數級別的絕對值有關的語法元素的概率模型的選擇取決於此區域中的絕對值或部分重構的絕對值。用於選擇概率模型的模板如下圖所示, 黑色方塊指定當前掃描位置,藍色方塊表示使用的本地相鄰像素。
所選擇的概率模型取決於此相鄰像素的絕對值(或部分重構的絕對值)的總和,以及相鄰像素中大於0的絕對級別數(由sig_coeff_flag
的數量等於1得出)。 上下文建模和二值化取決於當前塊的以下條件:
•numSig
:當前塊非零值數量;
•sumAbs1
:在本地鄰居進行第一次通過之後,部分重構的絕對值的總和(absLevel1);
•sumAbs
:相鄰塊中重構的絕對值之和
•對角線位置(d
):變換塊內當前掃描位置的水平和垂直座標之和
基於numSig
,sumAbs1
和d
的值,選擇用於編碼sig_flag
,par_flag
,gt1_flag
和gt2_flag
的概率模型。基於sumAbs
和numSig
的值選擇用於二值化abs_remainder
的Rice參數。
VVC中,基於跳過高頻係數的精簡32點MTS(RMTS32)用於降低32點DST-7 / DCT-8的計算複雜性。並且,它伴隨着考慮所有類型的零輸出(即,RMTS32和DCT2中高頻分量的現有零輸出)的係數編碼變化。具體地,基於減小的TU尺寸來對最後的非零係數位置編碼的二進制化進行編碼,並且對於最後的非零係數位置編碼的上下文模型選擇由原始TU尺寸來確定。另外,使用60個上下文模型對變換系數的sig_coeff_flag
進行編碼。上下文模型索引的選擇基於最大五個先前部分重建的絕對級別之和,即locSumAbsPass1
,如下所示