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。
HEVC代码学习19:MV、MVD、MVP概念解析_第1张图片
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,HM,HEVC代码学习)