VTM3.0代码阅读:getAffineControlPointCand函数

getAffineControlPointCand函数在getAffineMergeCand中用于获取AffineMerge候选的构造对。该函数处理PU的控制点MV和可用性,结合预定义组合和模型索引进行4参数或6参数AffineMerge的候选测试。
摘要由CSDN通过智能技术生成

getAffineControlPointCand函数在getAffineMergeCand函数中被调用,用来得到AffineMerge候选列表中的“构造对候选”。
参数:pu即当前pu、mi[4]为构造候选的pu四个角控制点的mv、isAvailable记录四个控制点中哪个可用哪个不可用。
verIdx[4]为6组预定义组合候选的一种组合、modelIdx指明当前要test的候选在6组中的标号idx。
verNum表示当前要test的组合候选是4参数/6参数Affine、AffineMergeCtx即Affine候选列表。

void PU::getAffineControlPointCand( const PredictionUnit &pu, MotionInfo mi[4], bool isAvailable[4], int verIdx[4], int modelIdx, int verNum, AffineMergeCtx& affMrgType )
{
   
  int cuW = pu.Y().width;
  int cuH = pu.Y().height;
  int vx, vy;
  int shift = MAX_CU_DEPTH;		//7
  int shiftHtoW = shift + g_aucLog2[cuW] - g_aucLog2[cuH];

  // motion info
  Mv cMv[2][4];						//构造的Affine候选,前向后向4控制点
  int refIdx[2] = {
    -1, -1 };
  int dir = 0;
  EAffineModel curType = (verNum == 2) ? AFFINEMODEL_4PARAM : AFFINEMODEL_6PARAM;

  if ( verNum == 2 )				//两个控制点,即4参数Affine
  {
   
    int idx0 = verIdx[0], idx1 = verIdx[1];
    if ( !isAvailable[idx0] || !isAvailable[idx1] )		//控制点有一个不可用,直接return
    {
   
      return;
    }

    for ( int l = 0; l < 2; l++ )
    {
   
      if ( mi[idx0].refIdx[l] >= 0 && mi[idx1].refIdx[l] >= 0 )
      {
   
        // check same refidx and different mv
        if ( mi[idx0].
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值