在HEVC中,使用了AMVP技术,利用空域和时域上的运动向量的相关性,为当前PU建立候选预测MV(MVP)列表。编码器从中选出最优的预测MV,并对MV进行差分编码;解码端会构造相同的列表,仅需要运动向量残差(MVD)与预测MV在该列表中的序号即可计算当前PU的MV。
简单来说,AMVP的作用就是建立当前PU的候选MVP列表,运动估计ME会从该列表中找到率失真最优的MVP作为起点,进行搜索。
AMVP整体处理在predInterSearch中完成,主要调用的函数有xEstimateMvPredAMVP,xMotionEstimation,xCopyAMVPInfo,xCheckBestMVP。
主要包含4个过程:
1.调用xEstimateMvPredAMVP建立候选列表并选出最优候选MVP。其中候选列表的建立是通过fillMvpCand函数完成,详见:http://blog.csdn.net/lin453701006/article/details/78419479。
2.调用xMotionEstimation进行运动估计找到最优MV。
3.调用xCheckBestMVP比较更新最优MVP。
4.更新失真和bit信息。
xMotionEstimation在之前已经进行了学习,xCopyAMVPInfo代码很少,很容易看懂,就是完成了AMVP信息的复制,不再详细学习了。下面来学习一下另外两个函数。
xEstimateMvPredAMVP
xEstimateMvPredAMVP首先调用fillMvpCand构造候选列表,然后计算每一个候选的Cost,最后比较Cost找到最优MV设为最优MVP。
// AMVP
Void TEncSearch::xEstimateMvPredAMVP( TComDataCU* pcCU, TComYuv* pcOrgYuv, UInt uiPartIdx, RefPicList eRefPicList, Int iRefIdx, TComMv& rcMvPred, Bool bFilled, Distortion* puiDistBiP )
{
AMVPInfo* pcAMVPInfo = pcCU->getCUMvField(eR