VVC—— updateCandList()函数 VTM16.0

该函数用于更新候选模式列表,确保列表按成本升序排列。首先,确定新成本需要插入的位置,然后将列表元素后移为新元素腾出空间。如果列表已满,直接在末尾插入;如果列表不足,扩展列表并插入。最后,返回插入位置。此过程对于算法优化和成本计算至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、找到插入当前cost、mode要移动的步数 

二、从待插入位置开始统一往后移一位,给待插入的cost和mode空出位置

三、插入当前cost和mode

四、返回插入的位置

uint32_t updateCandList(T mode, double uiCost, static_vector<T, N> &candModeList,
                        static_vector<double, N> &candCostList, size_t uiFastCandNum = N, int *iserttPos = nullptr)
{
  CHECK( std::min( uiFastCandNum, candModeList.size() ) != std::min( uiFastCandNum, candCostList.size() ), "Sizes do not match!" );
  CHECK( uiFastCandNum > candModeList.capacity(), "The vector is to small to hold all the candidates!" );

  size_t i;
  size_t shift = 0;
  size_t currSize = std::min( uiFastCandNum, candCostList.size() );
//找到插入uicost要移动的步数
  while( shift < uiFastCandNum && shift < currSize && uiCost < candCostList[currSize - 1 - shift] )
  {
    shift++;
  } 
//从待插入位置开始统一往后移一位,给待插入的cost和mode空出位置
  if( candModeList.size() >= uiFastCandNum && shift != 0 )
  {
    for( i = 1; i < shift; i++ )
    {
      candModeList[currSize - i] = candModeList[currSize - 1 - i];
      candCostList[currSize - i] = candCostList[currSize - 1 - i];
    }
     //插入当前cost和mode
    candModeList[currSize - shift] = mode;
    candCostList[currSize - shift] = uiCost;
    if (iserttPos != nullptr)
    {
      *iserttPos = int(currSize - shift); //插入的位置返回给iserrPos
    }
    return 1;
  }
  else if( currSize < uiFastCandNum ) //若列表长度不足,直接扩充cost,mode列表(merge为6)
  {
    candModeList.insert(candModeList.end() - shift, mode);
    candCostList.insert( candCostList.end() - shift, uiCost );
    if (iserttPos != nullptr)
    {
      *iserttPos = int(candModeList.size() - shift - 1);
    }
    return 1;
  }
  if (iserttPos != nullptr)
  {
    *iserttPos = -1; //当前cost比cost列表中所有值都大,不更新cost列表,返回-1
  }
  return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值