基于子块的TMVP (SbTMVP)

VTM中提出的基于子块的TMVP(subblock-based temporal motion vector prediction ,SbTMVP)和HEVC中的TMVP类似。TMVP计算方法可以参考扩展的merge模式中1.2节时域候选列表构建。

SbTMVP和TMVP主要有以下两点不同:

  • TMVP在CU级预测运动而SbTMVP在sub-CU级预测运动。

  • TMVP直接使用同位图像的同位块计算时域MV,而SbTMVP在计算同位块前先进行一个运动偏移,这个运动偏移来自当前CU的空域相邻块的MV。

SbTMVP计算当前CU的子CU的MV分为两步:

1、如下图所示,检查当前CU的空域相邻块A1,如果A1的参考图像正好是当前图像的同位图像则用A1的MV作为运动偏移,否则运动偏移设为(0,0)。

2、使用第1步得到的运动偏移(将当前块的坐标加上运动偏移)从同位图像获得子CU的运动信息(MV和参考图像索引)。如下图所示,图中假设使用A1的MV作为运动偏移,然后对每个子CU获取其在同位图像中对应块的运动信息,然后按照TMVP的处理方法将获得的MV进行缩放得到子CU的MV。

在VTM5中,基于子块的merge list内既包含SbTMVP候选项也包含affine merge候选项。在序列参数集(sequence parameter set ,SPS)中有标志位表明是否使用SbTMVP模式,如果允许使用SbTMVP模式那么在基于子块的merge list中SbTMVP候选项在affine merge候选项前面。该list中候选项数量在SPS中指定,VTM5规定最多候选数量为5。

在SbTMVP中子CU的大小固定为8x8,且和affine merge模式一样只有当CU宽高都大于等于8时才使用SbTMVP模式。

Adaptive motion vector resolution (AMVR)

在HEVC中当slice header中use_integer_mv_flag=0时,MVD(CU的MV和MVP的差值)按照1/4亮度像素精度传输。VVC提出了CU级的AMVR,AMVR允许CU的MVD使用不同精度编码。

其中可选精度如下:

  • Normal AMVP模式:1/4亮度像素精度,整亮度像素精度,4倍亮度像素精度。

  • Affine AMVP模式:1/4亮度像素精度,整亮度像素精度,1/16亮度像素精度。.

在CU级,只有当MVD至少有一个非零分量时才需要传输其精度。如果所有MVD分量(水平分量和垂直分量)都是0,则MVD默认使用1/4亮度像素精度。

当一个CU至少有一个非零MVD分量时,有一个标志位表示该CU的MVD是否使用1/4亮度像素精度,如果该标志位为0则表示使用1/4亮度像素精度不需要再传其他标志位。否则,对于Normal AMVP模式的CU需要第二个标志位表示是否使用整亮度像素精度或4倍亮度像素精度。对于Affine AMVP模式的CU需要第二个标志位表示是否使用整亮度像素精度或1/16亮度像素精度。为了确保重建的MV有同样的精度MVP会四舍五入到和MVD同样的精度。MVP朝0进行四舍五入(也就是负MVP朝正无穷方向,正MVP朝负无穷方向)。

在VTM5中两种模式的像素精度定义如下:

const MvPrecision Mv::m_amvrPrecision[3] = { MV_PRECISION_QUARTER, MV_PRECISION_INT, MV_PRECISION_4PEL }; // for cu.imv=0, 1 and 2
const MvPrecision Mv::m_amvrPrecAffine[3] = { MV_PRECISION_QUARTER, MV_PRECISION_SIXTEENTH, MV_PRECISION_INT }; // for cu.imv=0, 1 and 2

精度转换代码如下:

  void changePrecision(const MvPrecision& src, const MvPrecision& dst){const int shift = (int)dst - (int)src;if (shift >= 0){*this <<= shift;}else{const int rightShift = -shift;const int nOffset = 1 << (rightShift - 1);
#if JVET_N0335_N0085_MV_ROUNDINGhor = hor >= 0 ? (hor + nOffset - 1) >> rightShift : (hor + nOffset) >> rightShift;ver = ver >= 0 ? (ver + nOffset - 1) >> rightShift : (ver + nOffset) >> rightShift;
#elsehor = hor >= 0 ? (hor + nOffset) >> rightShift : -((-hor + nOffset) >> rightShift);ver = ver >= 0 ? (ver + nOffset) >> rightShift : -((-ver + nOffset) >> rightShift);
#endif}}
​void roundToPrecision(const MvPrecision& src, const MvPrecision& dst){changePrecision(src, dst);changePrecision(dst, src);}

参考

JVET-N1002

JVET-M0246

JVET-M0165

感兴趣的请关注微信公众号Video Coding

VVC帧间预测(五)SbTMVP和AMVR相关推荐

  1. H.266/VVC帧间预测总结

    一.帧间预测基本原理 帧间预测是利用视频帧与帧之间的相关性,去除视频帧间的时间冗余信息.统计表明,帧间差绝对值超过3的像素平均不到一帧像素的4%,因此,采用高效的帧间编码方式,可以很大程度上提高视频压 ...

  2. DCC2020:VVC帧间预测中的几何划分

    本文来自DCC2020论文<Advanced Geometric-based Inter Prediction for Versatile Video Coding> 几何划分相较于三角划 ...

  3. VVC帧间预测(一)扩展的merge模式

    VVC在HEVC的基础上增加了很多新的帧间预测工具,在VTM5里新增的帧间预测工具如下: Extended merge prediction Merge mode with MVD (MMVD) AM ...

  4. VVC帧间预测(十)帧间帧内联合预测CIIP

    帧间帧内联合预测(Combined inter and intra prediction ,CIIP),在HEVC中一个CU在预测时要么使用帧内预测要么使用帧间预测,二者只能取其一.而VVC中提出的C ...

  5. H.266/VVC帧间预测技术学习:帧间和帧内联合预测(Combined inter and intra prediction, CIIP)

    在HEVC中一个CU在预测时要么使用帧内预测要么使用帧间预测,二者只能取其一.而VVC中提出的CIIP技术,是将帧间预测信号与帧内预测信号相结合. 在VVC中,当CU以Merge模式编码时,且CU包含 ...

  6. H.266/VVC帧间预测技术学习:带有运动矢量差的Merge技术(Merge mode with MVD)

    在VVC的扩展Merge模式当中,当前CU生成的Merge list中选择一个率失真代价值最小的候选项直接作为自己的运动信息.除了常规Merge模式,VVC还引入了带运动矢量差(Merge mode ...

  7. H.266/VVC帧间预测技术学习:几何划分模式(Geometric partitioning mode, GPM)

    几何划分模式 (Geometric partitioning mode ,GPM)原理 针对图像中运动物体的边界部分,VVC采用了几何划分模式进行帧间预测.如下图所示,GPM模式在运动物体的边界处进行 ...

  8. 【十三】 H.266/VVC | 帧间预测技术 | 解码端运动向量修正技术(DMVR)

    目的:为了提高merge模式下双向预测MV的准确性 基本思路:双向预测是在list0和list1中分别寻找一个运动向量,然后将MV0和MV1所指向的预测块进行加权得到最终预测块,而DMVR技术不是直接 ...

  9. H.266/VVC帧间预测技术学习:解码端运动矢量细化(Decoder side motion vector refinement, DMVR)

    解码端运动矢量细化(Decoder side motion vector refinement, DMVR) 为了提高Merge模式的MV的准确性,在VVC中使用了基于双边匹配(BM)的解码端运动矢量 ...

  10. H.266/VVC帧间预测技术学习:CU级双向加权预测(Bi-prediction with CU-level weight)

    CU级双向加权预测(Bi-prediction with CU-level weight ,BCW) 在HEVC中,通过对从两个不同参考图片获得的两个预测信号求平均和/或使用两个不同运动矢量来生成双向 ...

最新文章

  1. windows下把Apache加入系统服务
  2. Java RMI(远程方法调用) 实例与分析 (转)
  3. c++中std::set自定义去重和排序函数
  4. Codeforces Round #588 (Div. 2) F. Konrad and Company Evaluation 图论 + 建反图 好题
  5. html ul左侧浮动,UL里的LI元素左浮动层一行显示时使其居中的方法
  6. Qt编译错误:无法解析的外部符号 __imp__CloseServiceHandle __imp__OpenSCManager
  7. centos6 5从命令行进入图形界面
  8. pandas mysql index_Pandas从入门到精通(3)- Pandas多级索引MultiIndex
  9. spring + groovy 转
  10. 车rc陀螺仪测试软件,利用加速度计和陀螺仪测量车辆运动
  11. 戴尔台式机安装win 7系统
  12. 【编程基本功练习0】zoj 3486
  13. Python与Memcached交互
  14. 轻轻松松的记住Linux系统目录结构
  15. 《程序员》2012年4期精彩内容:创业
  16. 【报告分享】淘宝直播2021年度报告-淘榜单淘宝直播(附下载)
  17. 任务一: SpringMVC基本应用
  18. Ubuntu安装nvm
  19. 插画“城市景色”练习
  20. 义务教师 obligatory tutor

热门文章

  1. 怎样查看C语言的程序内容,什么手机软件能看c语言文件?
  2. linebreak_vue-cli构建的项目,eslint一直报CRLF/LF的linebreak错误
  3. 2019年 PMP认证
  4. javaweb sso_试驾SSO
  5. A Game of Thrones(59)
  6. 展望2010:3G的应用与服务年
  7. idea插件HttpClient插件如何使用?
  8. 问道图语言_GraphQL_v1.0.0
  9. c语言中 amp 是什么意思6,c语言中amp;amp;NBSP是什么意思
  10. 第一章--数据库系统基本概念(一)