AMVP预测函数:根据AMVP候选准则为该帧建立MVP候选列表,调用pcCU->fillMvpCand( uiPartIdx, uiPartAddr, eRefPicList, iRefIdx, pcAMVPInfo ) 填充候选列表(下一篇介绍该函数)
构建好候选列表后,按以下流程选择最优MVP:

  1. 将最优MVP索引置为0,最优MVP赋给中间变量cBestMv。
  2. 进行RDcost计算得到当前Cost,利用当前Cost与最小Cost相比较,若当前Cost更小,则交换Cost值,同时将最佳MVP类TComMv赋给cBestMv,设置最佳MVP的索引,记录Cost值、
  3. 将当前最佳MVP存入cMvPred[eRefPicList][iRefIdx]中
  4. 设置该PU所包含的所有4x4的块的 MVP数量,最佳MVP索引。

代码如下:

// AMVP
// 对当前参考帧创建MVP,并选出最佳MVP
// 将最佳MVP存入rcMvPred中,将最佳参考帧索引放入pcCU->setMVPIdxSubParts( iBestIdx, eRefPicList, uiPartAddr, uiPartIdx, pcCU->getDepth(uiPartAddr));
Void TEncSearch::xEstimateMvPredAMVP( TComDataCU* pcCU, TComYuv* pcOrgYuv, UInt uiPartIdx, RefPicList eRefPicList, Int iRefIdx, TComMv& rcMvPred, Bool bFilled, Distortion* puiDistBiP )
{AMVPInfo*  pcAMVPInfo = pcCU->getCUMvField(eRefPicList)->getAMVPInfo(); //MVP的候选数量、MVP候选的具体值TComMv     cBestMv;Int        iBestIdx   = 0;TComMv     cZeroMv;TComMv     cMvPred;Distortion uiBestCost = std::numeric_limits<Distortion>::max();UInt       uiPartAddr = 0;Int        iRoiWidth, iRoiHeight;Int        i;pcCU->getPartIndexAndSize( uiPartIdx, uiPartAddr, iRoiWidth, iRoiHeight ); //得到当前PU起始4x4块的地址,得到PU的大小// Fill the MV Candidatesif (!bFilled){/*AMVP候选列表的建立;空域A0 A1先选,然后是B0 B1 B2. 若空域候选填不满候选列表,进行时域候选Input:*\ 当前PU块的索引*\ 当前PU块对应的第一个4x4CU的索引*\ 当前参考图像列表及参考帧Out:*\ MVP候选列表pcAMVPInfo,包含两个TComMV类以及,int型MVP数量*/pcCU->fillMvpCand( uiPartIdx, uiPartAddr, eRefPicList, iRefIdx, pcAMVPInfo );}// initialize Mvp index & Mvp// 初始话最优MVP索引为0iBestIdx = 0;cBestMv  = pcAMVPInfo->m_acMvCand[0];if (pcAMVPInfo->iN <= 1){rcMvPred = cBestMv;pcCU->setMVPIdxSubParts( iBestIdx, eRefPicList, uiPartAddr, uiPartIdx, pcCU->getDepth(uiPartAddr));pcCU->setMVPNumSubParts( pcAMVPInfo->iN, eRefPicList, uiPartAddr, uiPartIdx, pcCU->getDepth(uiPartAddr));if(pcCU->getSlice()->getMvdL1ZeroFlag() && eRefPicList==REF_PIC_LIST_1){(*puiDistBiP) = xGetTemplateCost( pcCU, uiPartAddr, pcOrgYuv, &m_cYuvPredTemp, rcMvPred, 0, AMVP_MAX_NUM_CANDS, eRefPicList, iRefIdx, iRoiWidth, iRoiHeight);}return;}if (bFilled){assert(pcCU->getMVPIdx(eRefPicList,uiPartAddr) >= 0);rcMvPred = pcAMVPInfo->m_acMvCand[pcCU->getMVPIdx(eRefPicList,uiPartAddr)];return;}m_cYuvPredTemp.clear(); //暂时的预测值,用于计算cost//-- Check Minimum Cost.for ( i = 0 ; i < pcAMVPInfo->iN; i++){Distortion uiTmpCost;/*以该MVP作为真实MV进行运动补偿,得到暂时的预测值利用暂时的预测值计算SAD得到失真,最后计算RDcost*/uiTmpCost = xGetTemplateCost( pcCU, uiPartAddr, pcOrgYuv, &m_cYuvPredTemp, pcAMVPInfo->m_acMvCand[i], i, AMVP_MAX_NUM_CANDS, eRefPicList, iRefIdx, iRoiWidth, iRoiHeight);if ( uiBestCost > uiTmpCost ){uiBestCost = uiTmpCost;cBestMv   = pcAMVPInfo->m_acMvCand[i]; //最佳MVPiBestIdx  = i; //最佳MVP索引(*puiDistBiP) = uiTmpCost;}}m_cYuvPredTemp.clear();// Setting Best MVPrcMvPred = cBestMv;pcCU->setMVPIdxSubParts( iBestIdx, eRefPicList, uiPartAddr, uiPartIdx, pcCU->getDepth(uiPartAddr)); //将该PU包含的每一个4X4块都需要设定MVP索引pcCU->setMVPNumSubParts( pcAMVPInfo->iN, eRefPicList, uiPartAddr, uiPartIdx, pcCU->getDepth(uiPartAddr));return;
}

HM代码阅读2:AMVP预测函数Void TEncSearch::xEstimateMvPredAMVP()相关推荐

  1. HM代码阅读1: 帧间预测函数Void TEncSearch::predInterSearch()

    AMVP理论知识简单回顾(含GPB) MVP主要是为了给当前PU提供一个运动矢量的预测,可加快ME的计算速度以及提升准确性.并且在后续编码中也只用编码MVD,减少了传输bit数. HM中获取每个参考图 ...

  2. HM代码阅读3:AMVP候选填充函数Void TComDataCU::fillMvpCand ()

    AMVP候选理论回顾 根据图像中块与块的相关性计算,针对当前块,空域上与其相关性最强的块的位置如下图所示: 时域上相关性的最强的块如下图所示: HM中该MVP填充流程如下: 计算得到当前PU左上.左下 ...

  3. HM代码阅读0:Win10下安装HM16.23,编码一个视频,main函数阅读

    HEVC理论知识的学习告了一段落了,说实话脑子里还是嗡嗡的,剩下的部分就一边阅读代码一边掌握吧. 1. HM16.23安装 首先需要安装Cmake,参考以下博客,照步骤安装即可 https://blo ...

  4. HM编码器代码阅读(16)——帧间预测之AMVP模式(四)预测MV的获取

    帧间预测的原理 AMVP的原理 帧间预测的实质就是为当前的PU在参考帧中寻找一块最相似块(相似度的判断准则有SAD等方法).但是参考图像通常都比较大,我们直接去搜索的话就太费时了,应该使用某种方法在参 ...

  5. HEVC代码学习——帧间预测:预测MV获取(xEstimateMvPredAMVP、fillMVPCand)

    HEVC帧间预测在AMVP模式下是依靠xEstimateMvPredAMVP函数获取预测MV(MVP)的. 这部分内容的学习还可以参考这两篇博客: HEVC代码学习15:AMVP相关函数 HM编码器代 ...

  6. HM编码器代码阅读(32)——帧间预测之AMVP/Merge模式(七)encodeResAndCalcRdInterCU函数:残差计算、变换量化

    encodeResAndCalcRdInterCU 原理和细节 经过运动估计.运动补偿,我们得到了MV以及参考块,那么接下来是计算残差.计算MVD,然后对系数进行变换.量化. encodeResAnd ...

  7. HM编码器代码阅读(14)——帧间预测之AMVP模式(二)predInterSearch函数

    简介     predInterSearch主要的工作是ME(运动估计)和MC(运动补偿).     函数中有一个bTestNormalMC变量,它表示是否进行正常的MC过程,正常的MC过程就是进行M ...

  8. HM编码器代码阅读(15)——帧间预测之AMVP模式(三)xGetBlkBits函数

    GetBlkBits函数的主要功能是计算使用某种PU划分模式的时候,该种模式占用的比特数 Void TEncSearch::xGetBlkBits( PartSize eCUMode, Bool bP ...

  9. HM编码器代码阅读(30)——帧间预测之AMVP模式(五)运动估计

    运动估计 通过 点击打开链接 介绍的方法得到MVP之后,可以根据该MVP确定运动估计的搜索起点,然后进行运动估计 xMotionEstimation就是进行运动估计的入口函数     1.先进行一些初 ...

最新文章

  1. Java项目:OA办公自动化系统设计和实现(java+springboot+freemarker+mysql+maven+mybatis+jpa)
  2. [Silverlight] UI 测试/UI 自动化相关知识
  3. [android] 手机卫士黑名单功能(列表展示)
  4. WEB框架原理(socket)
  5. C++——《算法分析与设计》实验报告——贪心算法与回溯法
  6. 现代软件工程系列 结对编程 (II) 电梯调度程序
  7. 我理解的 Java 泛型
  8. notepad可以运行python吗,notepad+中怎么设置直接运行python代码
  9. python的装饰器很有用吗_你真的了解python装饰器么
  10. from_子句-内连接-左连接-右连接
  11. git 查看某些文档的历史版本_10分钟了解git
  12. 虚拟机中安装vmware tools 到 Debian 时出现 找不到kernel headers的提示
  13. c语言添加vmp保护代码,易语言使用vmp加壳保护程序
  14. c语言算开方程序,C语言计算开方
  15. WPF MVVM 框架
  16. python删除表格第一行不动_Excel教程,教你如何设置表格第一行和第一列固定不动,一直显示...
  17. luogu P4238 【模板】多项式乘法逆
  18. 半年成长 —— 任平生
  19. 【阅读笔记】Federated Learning for Privacy-Preserving AI
  20. SpringCloud(五)Eureka服务注册与发现

热门文章

  1. C++程序设计基础之(第三章)函数
  2. 计算机空格键作用,电脑空格键有哪些作用?你知道几个?
  3. nginx简介及作用
  4. Genero BDL 数据类型(1)
  5. python实现划词翻译
  6. 什么是ROM、RAM、DRAM、SRAM和FLASH的区别
  7. ORA-3136 WARNING: inbound connection timed out
  8. mybatis-plus使用updateById更新数据不生效,需要使用lambdaUpdate
  9. LightOJ - 1395
  10. sco unix和linux区别,SCOUNIX到Linux操作系统的程序移植问题有哪些呢?