HEVC代码学习19:MV、MVD、MVP概念解析
在代码阅读中,可以看到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概念解析相关推荐
- HEVC代码学习:帧间预测——MVP过程中MV的获取、传递及存储
作为一个视频编码小白,最近开始着手啃HEVC帧间预测的代码,想用博客记录一下自己的学习过程,也想与大家分享.交流一下. HEVC代码的学习主要是参考两位大神岳麓吹雪.NB_vol_1的博客以及HM参考 ...
- HEVC代码学习——帧间预测:预测MV获取(xEstimateMvPredAMVP、fillMVPCand)
HEVC帧间预测在AMVP模式下是依靠xEstimateMvPredAMVP函数获取预测MV(MVP)的. 这部分内容的学习还可以参考这两篇博客: HEVC代码学习15:AMVP相关函数 HM编码器代 ...
- HEVC代码学习39:decodeCtu和xDecodeCU函数
在之前 HEVC代码学习38:decompressSlice函数 学习中提到,解码slice会遍历所有CTU,调用decodeCtu和decompressCtu解码每一个CTU.下面就来学习一下dec ...
- 【深度学习】梯度和方向导数概念解析(代码基于Pytorch实现)
[深度学习]梯度和方向导数概念解析(代码基于Pytorch实现) 文章目录 1 方向导数 2 梯度 3 自动求导实现 4 梯度下降4.1 概述4.2 小批量梯度下降 5 总结 1 方向导数 方向导数的 ...
- HEVC代码学习42:estIntraPredLumaQT函数
在之前的 HEVC代码学习37:帧内预测代码整体学习 中已经提到,estIntraPredLumaQT是亮度帧内预测的入口函数,下面将对该函数进行详细学习. estIntraPredLumaQT中完成 ...
- c语言注释语句执行吗,C语言学习笔记之C语言概念解析(附资料分享)每一个语句都必须以分号结尾但预处理命令函数头和花括号“}”之后不能加分号...
[[怪兽爱C语言]C语言学习笔记之C语言概念解析(附资料分享)]https://toutiao.com/group/6582429294901854728/?iid=15906422033&a ...
- HEVC代码学习15:AMVP相关函数
在HEVC中,使用了AMVP技术,利用空域和时域上的运动向量的相关性,为当前PU建立候选预测MV(MVP)列表.编码器从中选出最优的预测MV,并对MV进行差分编码:解码端会构造相同的列表,仅需要运动向 ...
- HEVC代码学习13:predInterSearch函数
在上一章的xCheckRDCostInter学习中,我们知道了,进行帧间搜索的入口实际是predInterSearch,今天我们就来对他进行学习. 推荐看大神博客 http://blog.csdn.n ...
- HEVC代码学习18:运动估计和运动补偿总结
经过了这段时间对帧间预测部分代码的学习,算是大体上了解了其工作原理.只看理论不看代码,体会不深刻,在看了代码后,有了一种恍然大悟的感觉,很多算法实现和看原理时理解的不一样.下面来整理一下之前写的博客, ...
最新文章
- 世界四大重要检索系统简介
- 征稿 | 2019年全国知识图谱与语义计算大会(CCKS2019)第二轮征稿启事
- 统计一个整数的所有因子的个数_【题解循环嵌套】1095:数1的个数
- 从零开始搭建Ubuntu 环境下的Android 源码开发环境
- [swift] LeetCode 338. Counting Bits
- Python 实int型和list相互转换 现把float型列表转换为int型列表 把列表中的数字由float转换为int型...
- P1352 没有上司的舞会[树形dp]
- leetcode之前K个高频元素
- JVM调优总结:一些概念
- 关于HP C7K的firmware management中的power policy理解
- java调用服务器打印机不登录_java – 从网络服务器打印到没有中介的热敏打印机...
- jdbc c3p0 mysql_JDBC+C3P0+DBCP 基本使用
- 基于RV1126平台imx291分析
- html用css设置图片大小,css如何设置图片大小?
- 计算机健康小知识,电脑一族护肤保健小常识
- Android compileSdkVersion27+ was not granted this permission: android.permission.WRITE_SETTINGS.
- BEEF的简介与使用
- EPW的输入文件浅析
- 亚马逊云科技连续12年蝉联Gartner云基础设施和平台服务魔力象限领导者
- 记一次针对鹅厂的盗号追踪——盗号,朋友,以及妹子的故事