H.266/VVC代碼學習47:雙向光流(BDOF)

VVC中包含雙向光流(BDOF)工具。 BDOF(以前稱爲BIO)已包含在JEM中。與JEM版本相比,VVC中的BDOF是一個簡單的版本,在乘法次數和乘法大小方面需要更少的計算。

1 使用條件

BDOF用於在4x4子塊級別上優化CU的雙向預測信號。如果BDOF滿足以下所有條件,則將BDOF應用於CU:
1.使用“真正的”雙預測模式,即兩個參考幀中的一幀在當前幀之前,另一幀在當前幀之後;
2.兩個參考幀到當前幀的距離(即POC差)是相同的
3.兩個參考幀均爲短期參考幀;
4.CU未使用Affine模式或ATMVP模式進行編碼;
5.CU需要超過64個亮度像素值(4x16這種不可取);
6.CU高度和寬度均大於或等於8
7.對於BCW權重:要求等權重
8.當前CU未啓用加權預測;
9.當前CU不使用CIIP模式或TPM模式。

2 計算方法

BDOF僅應用於亮度分量。顧名思義,BDOF模式基於光流概念,該概念假設對象的運動是平滑的。對於每個4x4子塊,通過最小化L0和L1預測樣本之間的差異來計算運動細化(vx,vy),然後使用運動細化來調整4x4子塊中的雙向預測樣本值。 BDOF過程中將應用以下步驟:

2.1 計算水平和垂直梯度值

在這裏插入圖片描述
計算方法:直接計算兩個相鄰樣本之間的差來計算兩個預測信號的梯度值,如下:
在這裏插入圖片描述
其中I是列表k中預測信號座標(i,j)的樣本值,shift1是根據亮度比特深度計算的:

shift1 = max(6,bitDepth-6//對於10比特深度一般爲6

2.2 計算梯度的自相關和互相關

梯度的自相關和互相關S1,S2,S3,S5和S6計算如下:
在這裏插入圖片描述
其中的一些參量定義如下:
在這裏插入圖片描述
其中Ω是圍繞4×4子塊的6×6窗口,並且nanb的值分別設置爲:

na = min(1,bitDepth-11//對於10比特深度一般爲-1
nb = min(4,bitDepth-8//對於10比特深度一般爲 2

2.3 得到細化後的運動

使用上述互相關和自相關S,推導出細化後的運動(vx,vy)
在這裏插入圖片描述
其中的一些參量定義如下:
在這裏插入圖片描述

2.4 得到

基於運動細化和梯度,爲4×4子塊中的每個樣本計算以下調整,得到低階無窮小量:
在這裏插入圖片描述
最後,通過如下調整雙向預測樣本來計算CU的BDOF樣本:
在這裏插入圖片描述
這些值可以使BDOF處理中的乘數不超過15位,並且BDOF處理中的中間參數的最大位寬保持在32位以內。

3 實現與擴展

爲了導出梯度值,需要生成在當前CU邊界之外的列表k中的一些預測像素I(前面所述的4x4擴展到6x6)。如下圖所示
在這裏插入圖片描述
VVC中的BDOF在CU的邊界周圍使用了一個擴展的行/列。爲了控制生成邊界外預測樣本的計算複雜度,直接在附近的整數位置(使用座標對座標進行運算)獲取參考像素,從而生成擴展區域(白色位置)中的預測像素,這其中沒有插值操作,正常的8抽頭運動補償插值濾波器用於在CU(灰色位置)內生成預測樣本。這些擴展的像素值僅用於梯度計算中。對於BDOF過程中的其餘步驟,如果需要在CU邊界之外的任何樣本和梯度值,則從其最近的像素中填充(即重複)它們。

當CU的寬度和/或高度大於16時,它將被分成寬度和/或高度等於16個亮度樣本的子塊,並且在BDOF處理中將子塊邊界視爲CU邊界。 BDOF處理的最大單位大小限制爲16x16。
對於每個子塊,可以跳過BDOF過程。當初始L0和L1預測樣本之間的SAD小於閾值時,將BDOF處理不應用於子塊。閾值設置爲等於8 x W x(H >> 1),其中W表示子塊寬度,H表示子塊高度。爲了避免SAD計算的額外複雜性,初始L0和L1預測樣本之間的SAD在DVMR過程中計算得到的值在此重複使用。

如果當前塊啓用了BCW,即BCW權重索引指示權重不相等,則將禁用雙向光流。類似地,如果對於當前塊啓用了WP,即,對於兩個參考圖片中的任一個,luma_weight_lx_flag 標誌爲1,則也禁用了BDOF。當CU用對稱MVD模式或CIIP模式編碼時,BDOF也被禁用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章