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也被禁用。

猜你喜欢

转载自blog.csdn.net/weixin_42979679/article/details/103178225