VTM3.0代码阅读:MMVD相关的一些类和函数

本文深入探讨VTM3.0中MMVD(Multi-Motion Vector Difference)的相关实现,主要集中在getInterMergeCandidates函数。MMVD与普通merge及CIIP模式竞争,选取merge列表的前两个baseMV,以此为基础,通过4个方向的8步偏移生成64个MVP,最终选择最优MVP。
摘要由CSDN通过智能技术生成

MMVD是在getInterMergeCandidates函数中进行的,同时和普通merge模式以及CIIP模式竞争。
MMVD选择merge列表的前两个MergeMode作为baseMV,然后分别以这两个baseMV为中心,上下左右四个方向,每个方向分别都有8步偏移的MVD。
baseMV加上方向偏移的MVD,就得到了MMVD模式的MVP,然后在这248=64 个MVP中选最优作为MMVD模式的MVP。

class MergeCtx		//MergeCtx存放merge列表的信息
{
   						//MMVD的baseMV同样存储在其中
public:
	//.....
#if JVET_L0054_MMVD
  MvField mmvdBaseMv[MMVD_BASE_MV_NUM][2];	//存放MMVD的两个baseMV,双向
  void setMmvdMergeCandiInfo(PredictionUnit& pu, int candIdx);	//由candIdx获得偏移mvd,继而获得MVP等运动信息赋给pu
#endif
  void setMergeInfo( PredictionUnit& pu, int candIdx );
};
//merge列表构建完成之后,获取merge列表的前两个mergeMode为MMVD的baseMV
void PU::getInterMMVDMergeCandidates(const PredictionUnit &pu, MergeCtx& mrgCtx, const int& mrgCandIdx)
{
   
  int refIdxList0, refIdxList1;
  int k;
  int currBaseNum = 0;				//目前已获得的baseMV个数
  const uint16_t maxNumMergeCand = mrgCtx.numValidMergeCand;

  for (k = 0; k < maxNumMergeCand; k++)
  {
   
    if (mrgCtx.mrgTypeNeighbours[k] == MRG_TYPE_DEFAULT_N)
    {
   
      refIdxList0 = mrgCtx.mvFieldNeighbours[(k << 1)].refIdx;
      refIdxList1 = mrgCtx.mvFieldNeighbours[(k << 1) + 1].refIdx;

      if ((refIdxList0 >= 0) && (refIdxList1 >= 0))		//双向
      {
   
        mrgCtx.mmvdBaseMv[currBaseNum][0] = mrgCtx.mvFieldNeighbours[(k << 1)];
        mrgCtx.mmvdBaseMv[currBaseNum][1] = mrgCtx.mvFieldNeighbours[(k << 1) + 1];
      }
      else if (refIdxList0 >= 0)					//前向
      {
   
        mrgCtx.mmvdBaseMv[currBaseNum][0] = mrgCtx.mvFieldNeighbours[(k << 1)];
        mrgCtx.mmvdBaseMv[currBaseNum][1] = MvField(Mv(0, 0), -1);
      }
      else if (refIdxList1 >= 0)					//后向
      {
   
        mrgCtx.mmvdBaseMv[currBaseNum][0] = MvField(Mv(0, 0), -1);
        mrgCtx.mmvdBaseMv[currBaseNum][1] = mrgCtx.mvFieldNeighbours[(k << 1) + 1];
      }

      currBaseNum++;

      if (currBaseNum == MMVD_BASE_MV_NUM)		//满两个baseMV跳出
        break;
    }
  }

  if (currBaseNum < MMVD_BASE_MV_NUM)		//如果merge列表候选不足两个,MMVD的baseMV补0
  {
   
    for (k = currBaseNum; k 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值