在代码阅读中,可以看到MV、MVD、MVP三个概念,在开始学习的时候就很糊涂,一直买具体来看下,也找不到具体在哪里有讲解,现在来关注学习一下。

先来逗比一下,名词解析:
MVP——most valuable player,那MVD是什么呢?most valuable dog。好冷。。。。。算了开始正题吧。

概念

MV在之前已经详细学习过了,是通过当前帧和参考帧进行搜索求出的,是一个指示最佳匹配块位置的矢量。

对每一个块的MV都进行编码,那么将花费很多的比特数,特别是小尺寸块。空间相邻的块之间存在相关性,因此可以根据邻近已编码的块进行预测,预测得到的运动矢量即为MVP。时域上也是存在相关性的,因此也可以进行时域预测,可以得到时域MVP。

为了进一步减少编码比特数,采用了残差编码,即对当前MV和预测MV(MVP)的差值进行编码,这个差值即为MVD。

三者之间的关系:MV=MVP+MVD
MV的数据结构详见:
http://blog.csdn.net/lin453701006/article/details/73116271
MV通过xMotionEstimation得到。
http://blog.csdn.net/lin453701006/article/details/70860150
MVD的实际计算在predInterSearch完成。
http://blog.csdn.net/lin453701006/article/details/72458327

发展

在H.264中,使用当前块的左侧、上方、右上方的块的中值作为当前块的MV预测值,即MVP。

MVP= median(MV1,MV2,MV3)

在HEVC中增加了merge和AMVP。
merge下直接用候选块的MV作为当前块的MV,即当前块与候选块共用一个MV,从而节省了开销,此时不存在MVD。当MVD=0时会启动merge模式。merge模式下,编解码器会依照相同的规则建立候选列表,因此只需要传输候选列表的索引。
merge部分的代码目前我只看了getInterMergeCandidates,用于构建候选列表,见:
http://blog.csdn.net/lin453701006/article/details/71436116

AMVP是从时域和空域中选定多个候选块组成一个集合,在该集合中寻找最优的MV匹配,选出最优预测MV进行差分编码。AMVP模式下需要传输最优候选块的索引、参考帧下标、以及MVD。
AMVP相关函数见:
http://blog.csdn.net/lin453701006/article/details/72842344

代码中的位置

既然是运动矢量,必然是在帧间预测部分。而在上一部分提到,merge只是使用候选块MV来构建MV的候选列表,因此,在merge中是不需要计算MV的,也没有MVP和MVD。
在代码中,实际计算MV、MVP、MVD是在predInterSearch函数中(http://blog.csdn.net/lin453701006/article/details/72458327)。
首先会使用AMVP来计算MVP(http://blog.csdn.net/lin453701006/article/details/72842344),找到最优MVP作为运动估计的起点进行整像素和亚像素搜索就得到了MV(http://blog.csdn.net/lin453701006/article/details/70860150),最终通过MV-MVP计算MVD。

HEVC代码学习19:MV、MVD、MVP概念解析相关推荐

  1. HEVC代码学习:帧间预测——MVP过程中MV的获取、传递及存储

    作为一个视频编码小白,最近开始着手啃HEVC帧间预测的代码,想用博客记录一下自己的学习过程,也想与大家分享.交流一下. HEVC代码的学习主要是参考两位大神岳麓吹雪.NB_vol_1的博客以及HM参考 ...

  2. HEVC代码学习——帧间预测:预测MV获取(xEstimateMvPredAMVP、fillMVPCand)

    HEVC帧间预测在AMVP模式下是依靠xEstimateMvPredAMVP函数获取预测MV(MVP)的. 这部分内容的学习还可以参考这两篇博客: HEVC代码学习15:AMVP相关函数 HM编码器代 ...

  3. HEVC代码学习39:decodeCtu和xDecodeCU函数

    在之前 HEVC代码学习38:decompressSlice函数 学习中提到,解码slice会遍历所有CTU,调用decodeCtu和decompressCtu解码每一个CTU.下面就来学习一下dec ...

  4. 【深度学习】梯度和方向导数概念解析(代码基于Pytorch实现)

    [深度学习]梯度和方向导数概念解析(代码基于Pytorch实现) 文章目录 1 方向导数 2 梯度 3 自动求导实现 4 梯度下降4.1 概述4.2 小批量梯度下降 5 总结 1 方向导数 方向导数的 ...

  5. HEVC代码学习42:estIntraPredLumaQT函数

    在之前的 HEVC代码学习37:帧内预测代码整体学习 中已经提到,estIntraPredLumaQT是亮度帧内预测的入口函数,下面将对该函数进行详细学习. estIntraPredLumaQT中完成 ...

  6. c语言注释语句执行吗,C语言学习笔记之C语言概念解析(附资料分享)每一个语句都必须以分号结尾但预处理命令函数头和花括号“}”之后不能加分号...

    [[怪兽爱C语言]C语言学习笔记之C语言概念解析(附资料分享)]https://toutiao.com/group/6582429294901854728/?iid=15906422033&a ...

  7. HEVC代码学习15:AMVP相关函数

    在HEVC中,使用了AMVP技术,利用空域和时域上的运动向量的相关性,为当前PU建立候选预测MV(MVP)列表.编码器从中选出最优的预测MV,并对MV进行差分编码:解码端会构造相同的列表,仅需要运动向 ...

  8. HEVC代码学习13:predInterSearch函数

    在上一章的xCheckRDCostInter学习中,我们知道了,进行帧间搜索的入口实际是predInterSearch,今天我们就来对他进行学习. 推荐看大神博客 http://blog.csdn.n ...

  9. HEVC代码学习18:运动估计和运动补偿总结

    经过了这段时间对帧间预测部分代码的学习,算是大体上了解了其工作原理.只看理论不看代码,体会不深刻,在看了代码后,有了一种恍然大悟的感觉,很多算法实现和看原理时理解的不一样.下面来整理一下之前写的博客, ...

最新文章

  1. 世界四大重要检索系统简介
  2. 征稿 | 2019年全国知识图谱与语义计算大会(CCKS2019)第二轮征稿启事
  3. 统计一个整数的所有因子的个数_【题解循环嵌套】1095:数1的个数
  4. 从零开始搭建Ubuntu 环境下的Android 源码开发环境
  5. [swift] LeetCode 338. Counting Bits
  6. Python 实int型和list相互转换 现把float型列表转换为int型列表 把列表中的数字由float转换为int型...
  7. P1352 没有上司的舞会[树形dp]
  8. leetcode之前K个高频元素
  9. JVM调优总结:一些概念
  10. 关于HP C7K的firmware management中的power policy理解
  11. java调用服务器打印机不登录_java – 从网络服务器打印到没有中介的热敏打印机...
  12. jdbc c3p0 mysql_JDBC+C3P0+DBCP 基本使用
  13. 基于RV1126平台imx291分析
  14. html用css设置图片大小,css如何设置图片大小?
  15. 计算机健康小知识,电脑一族护肤保健小常识
  16. Android compileSdkVersion27+ was not granted this permission: android.permission.WRITE_SETTINGS.
  17. BEEF的简介与使用
  18. EPW的输入文件浅析
  19. 亚马逊云科技连续12年蝉联Gartner云基础设施和平台服务魔力象限领导者
  20. 记一次针对鹅厂的盗号追踪——盗号,朋友,以及妹子的故事

热门文章

  1. php购物车面试题,php 购物车 细节
  2. STL容器板子(vector篇)
  3. 首都师范 博弈论 4 3 1公共物品的供给博弈
  4. PS插件:Photoshop遥感影像处理插件
  5. OpenCV-图像轮廓检测
  6. 路由器重温——POS接口配置管理——SDH
  7. 别告诉我你懂PPT.李治.扫描版.pdf
  8. 麦克斯韦方程组揭示了什么
  9. 概率论与数理统计浙大第五版 第八章 部分习题+R代码
  10. 解决vi中文乱码问题