学习笔记 | AVS3 | SbTMVP

SbTMVP, SubBlock Temporal Motion Vector Prediction,子块时域运动矢量导出

AVS3编码算法描述文档中的描述如下:

“AVS3一阶段中,对于direct和skip模式,若当前的编码单元子类型为“时域”,则对参考图像队列1中参考索引值为0的图像中与当前编码单元的左上角亮度样本坐标位置相同的亮度样本所在的时域运动信息存储单元存储的L0运动矢量进行缩放来导出当前编码单元的前向运动矢量和后向运动矢量,当前编码单元的L0和L1参考帧索引设为0。如果时域运动信息存储单元里的L0运动矢量不可用,则采用空域导出方法导出当前编码单元的运动矢量。

在AVS3二阶段中,对该基于时域信息的运动矢量导出方法进行了改进。首先将当前大小为2Mx2N编码单元划分为四个MxN的子块,接着用编码单元的四个顶点分别为每个子块找到对应的时域运动信息存储单元,即参考图像队列1中参考索引值为0的图像中的与顶点亮度样本坐标位置相同的亮度样本所在的时域运动信息存储单元,然后对对应时域运动信息存储单元中的运动矢量进行缩放以得到对应子块的运动矢量。当前编码单元的L0和L1参考帧索引均设为0。如果时域运动信息存储单元中L0运动矢量可用,则使用L0运动矢量,如果L0运动矢量不可用,则使用L1运动矢量;如果两者都不可能用,则使用一阶段导出的运动矢量作为当前子块的运动矢量”

个人理解:其核心思想是四个子块可以使用不同的TMVP

接下来结合HPM参考软件中的代码实现,来看一下TMVP和SbTMVP的具体效果。

1)TMVP

从TMVP map表中获取坐标的函数为 get_colocal_scup(), 如下:

int get_colocal_scup(int scup, int pic_width_in_scu, int pic_height_in_scu)
{
    const int mask = (-1) ^ 3;  //-4
    int bx = scup % pic_width_in_scu;
    int by = scup / pic_width_in_scu;
    int xpos = (bx & mask) + 2;  //(bx & mask) 表示取4的整倍数。也就是说scu的4倍整数,也就是实际是16x16的粒度。
    int ypos = (by & mask) + 2;  // +2 表示距离16x16左上角坐标偏移(+8,+8)。

    if (ypos >= pic_height_in_scu)
    {
        ypos = ((by & mask) + pic_height_in_scu) >> 1;
    }
    if (xpos >= pic_width_in_scu)
    {
        xpos = ((bx & mask) + pic_width_in_scu) >> 1;
    }

    return ypos * pic_width_in_scu + xpos;
}

TMVP map 表是以16x16的粒度来存储 mv 信息的,且以16x16左上角坐标偏移 (+8,+8) 位置处的CU信息为准(存储和获取参考时都是)。

假设当前位置是4个8x8的CU(如下图所示),也只保存红点位置处CU的mv信息,获取参考时也是红点位置。

假设当前CU是32x16(如下图),那么其在获取TMVP时其实是获取了参考图像红点位置处的mv信息。

再极端一点,对于64x64的CU,该CU内所有区域都是以左上角顶点偏移(+8,+8)位置的mv信息作为参考。也就是说对于较大尺寸的CU,其右下侧的区域距离红点位置处较远,可能mv信息会不太准确。因此,引入了SbTMVP,使四个子块可使用不同的mv信息。

2)SbTMVP

同样以32x16 CU为例(如下图),均分为四个子块,取四个顶点坐标,以该坐标为索引找到TMVP map中的mv信息(注意:TMVP map是以16x16粒度存储信息的)。
那么最终结果是CU左侧两个子块使用参考图像红点位置处的mv信息,CU右侧两个子块使用参考图像绿点位置处的mv信息。

3) 注意点

根据官方的开关测试结果,该工具带来的实际编码增益并不大,只有0.1%左右。

但是如果要支持AVS3 High Profile编码,对于大小在16x16及以上的CU的SKIP和DIRECT模式,且类型为TMVP的mv,且未开启Affine,AWP和ETMVP时,默认使用SbTMVP。

对于使用SbTMVP模式的CU,只是在预测时分成四个子块处理,而变换和量化仍按照CU原尺寸。
另外,保存当前CU信息、更新邻近MV信息、编码完成后更新TMVP map表等操作都需要使用四个子块的MV信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值