/*
函数的作用:检验当前PU的相邻PU的运动信息是否可以继承,可以的话保存并返回true,否则返回false
函数的返回值是一个bool类型
形参说明
1、const PredictionUnit &pu  当前编码单元PU
2、const RefPicList &refPicList  当前PU的参考列表
3、const int &refIdx  当前PU参考图像在参考列表中的索引
4、const Position &pos
5、const MvpDir &dir  相邻块的方向,函数中根据这个方向,可以获取到当前PU的相邻块的位置
6、AffineAMVPInfo &affiAMVPInfo  用于存放AMVP候选列表的结构体
*/bool PU::addAffineMVPCandUnscaled( const PredictionUnit &pu, const RefPicList &refPicList, const int &refIdx, const Position &pos, const MvpDir &dir, AffineAMVPInfo &affiAMVPInfo )
{CodingStructure &cs = *pu.cs;    //定义了一个存放当前PU编码信息的cs变量const PredictionUnit *neibPU = NULL;   //定义了一个PU指针,用于指向当前PU的相邻PUPosition neibPos;    //位置信息变量,用于存放相邻块的位置信息//根据相邻块的方向参数dir,得到指定方向的相邻PU的位置信息switch ( dir ){case MD_LEFT:  //左边neibPos = pos.offset( -1, 0 );break;case MD_ABOVE:  //上方neibPos = pos.offset( 0, -1 );break;case MD_ABOVE_RIGHT:  //右上方neibPos = pos.offset( 1, -1 );break;case MD_BELOW_LEFT:  //左下方neibPos = pos.offset( -1, 1 );break;case MD_ABOVE_LEFT:  //左上方neibPos = pos.offset( -1, -1 );break;default:break;}/*
调用cs.getPURestricted( neibPos, pu, pu.chType )来获得具体的相邻PU
返回值用变量neibPU接收
函数形参说明:
1、neibPos  相邻块的位置
2、pu 当前PU
3、pu.chType 当前PU的类型,是属于亮度PU还是色度PU,0表示luma、1表示chroma*/neibPU = cs.getPURestricted( neibPos, pu, pu.chType );/*
用一个if判断当前相邻块是否可用
判断条件满足一个,则表示当前相邻PU不可用,条件如下:
1、相邻PU不存在,即还未被编码
2、相邻PU已经被编码,但是使用的不是帧间预测
3、相邻PU已经被编码,但是使用的不是仿射模式
4、当前PU没有使用默认的Merge类型
*/if (neibPU == NULL || !CU::isInter(*neibPU->cu) || !neibPU->cu->affine || neibPU->mergeType != MRG_TYPE_DEFAULT_N){return false;}//定义运动矢量MV数组,用于存储AffineMvMv outputAffineMv[3];//定义一个运动信息变量neibMi,用于存放当前相邻PU的运动信息const MotionInfo& neibMi = neibPU->getMotionInfo( neibPos );
//定义一个整形变量currRefPOC ,用于存放当前编码PU的参考图像的POC,picture order count代表显示顺序const int        currRefPOC = cs.slice->getRefPic( refPicList, refIdx )->getPOC();
//定义一个参考列表变量refPicList2nd,如果当前参考列表为L0,那么refPicList2nd就为L1,反之则反const RefPicList refPicList2nd = (refPicList == REF_PIC_LIST_0) ? REF_PIC_LIST_1 : REF_PIC_LIST_0;
/*检查指定的参考图片列表,如果该列表不可用,检查其他列表*/for ( int predictorSource = 0; predictorSource < 2; predictorSource++ ) // examine the indicated reference picture list, then if not available, examine the other list.{//定义一个参考列表变量eRefPicListIndex,如果predictorSource为0,则eRefPicListIndex为当前PU的参考列表,否则为另一个参考列表const RefPicList eRefPicListIndex = (predictorSource == 0) ? refPicList : refPicList2nd;//定义了一个neibRefIdx,存放是当前相邻PU的参考图像在当前PU参考图像列表中的索引值或者另一个参考列表中的索引值const int        neibRefIdx = neibMi.refIdx[eRefPicListIndex];/*满足条件,跳过本次循环,进行下一次循环1、((neibPU->interDir & (eRefPicListIndex + 1)) == 0)  没看懂2、相邻PU的参考图像的POC与当前PU的POC不相同两个条件够满足才可用获得相邻PU的运动信息*/if ( ((neibPU->interDir & (eRefPicListIndex + 1)) == 0) || pu.cu->slice->getRefPOC( eRefPicListIndex, neibRefIdx ) != currRefPOC ){continue;}
/*
调用xInheritedAffineMv函数来继承当前PU相邻PU的运动信息
函数的参数说明:
1、pu 当前编码的PU
2、neibPU  相邻的PU
3、eRefPicListIndex  相邻PU的3参考列表
4、outputAffineMv  一个长度为3的MV数组,用于存放继承的相邻PU的运动信息
*/xInheritedAffineMv( pu, neibPU, eRefPicListIndex, outputAffineMv );
//调整继承得到的运动矢量的分辨率为1/16像素精度,帧间获得的运动矢量的像素精度要求为1/16像素精度outputAffineMv[0].roundAffinePrecInternal2Amvr(pu.cu->imv);outputAffineMv[1].roundAffinePrecInternal2Amvr(pu.cu->imv);
//将调整后由继承得到的运动矢量放入AMVP候选列表中affiAMVPInfo.mvCandLT[affiAMVPInfo.numCand] = outputAffineMv[0];affiAMVPInfo.mvCandRT[affiAMVPInfo.numCand] = outputAffineMv[1];
//如果是六参数仿射模型,还需要多添加一个继承的运动矢量到AMVP候选列表当中if ( pu.cu->affineType == AFFINEMODEL_6PARAM ){outputAffineMv[2].roundAffinePrecInternal2Amvr(pu.cu->imv);affiAMVPInfo.mvCandLB[affiAMVPInfo.numCand] = outputAffineMv[2];}
//将AMVP候选列表的数目自增1affiAMVPInfo.numCand++;
//成功继承相邻PU的运动信息return true;}return false;
}

更多关于视频编码知识和资源的分享,更精致的文章排版,欢迎关注博主微信公众号,一起交流、学习、进步!!!

【二十】 H.266/VVC | 仿射运动估计AMVP继承相邻块的运动信息函数 | addAffineMVPCandUnscaled函数相关推荐

  1. 【二十一】 H.266/VVC | 仿射运动估计AMVP候选列表的构建 | fillAffineMvpCand函数

    /* 函数的作用: 构建Affine AMVP list候选列表 函数的参数说明: 1.PredictionUnit &pu 当前编码的PU 2.const RefPicList &e ...

  2. 【二十二】 H.266/VVC | 选择最优的仿射AMVP候选项 | xEstimateAffineAMVP函数

    /* 函数的所用:从构建的仿射AMVP候选列表中选择最优的候选项 函数的参数说明: 1.PredictionUnit& pu, 当前编码的PU 2.AffineAMVPInfo& af ...

  3. H.266/VVC帧间预测技术学习:带有运动矢量差的Merge技术(Merge mode with MVD)

    在VVC的扩展Merge模式当中,当前CU生成的Merge list中选择一个率失真代价值最小的候选项直接作为自己的运动信息.除了常规Merge模式,VVC还引入了带运动矢量差(Merge mode ...

  4. H.266/VVC代码学习32:VTM5.0解码端最上层函数

    解码部分的研究不像编码端那样需要精雕细琢,但如果想研究一个内容划分或选择模式等的最终结果是怎样,那么应该从解码端入手.下面让我们来学习解码端的框架及最上层的三个函数. 文章目录 1 main() 2 ...

  5. 【十六】 H.266/VVC | VVC中帧间预测技术详细总结 | 所有帧间预测技术代码汇总

    前言 ​ 帧间预测是影响视频编码性能的关键环节之一,H.266/VVC帧间预测在传统只能应对简单的平移运动的基础上,采用了仿射运动模型,可以描述更加复杂的缩放.旋转等运动.为了更好的发挥合并模式(Me ...

  6. H.266/VVC帧间预测总结

    一.帧间预测基本原理 帧间预测是利用视频帧与帧之间的相关性,去除视频帧间的时间冗余信息.统计表明,帧间差绝对值超过3的像素平均不到一帧像素的4%,因此,采用高效的帧间编码方式,可以很大程度上提高视频压 ...

  7. H.266/VVC帧内预测总结

    一.帧内预测基本原理 帧内预测技术是利用同一帧中相邻像素的相关性,利用当前块相邻区域的重建像素预测当前块中像素的技术,如下图所示,当前CU可以利用相邻A.B.C.D和E位置处的重建像素来预测当前CU中 ...

  8. 【九】 H.266/VVC中帧间仿射运动补偿预测

    一.前言 HEVC中在进行运动补偿时只考虑了平移运动,而在真实的世界存在各种运动,例如缩放.旋转等非平移运动.在H.266/VVC中提出了基于块的仿射变换运动补偿预测.如下图所示,一个块的仿射运动向量 ...

  9. H.266/VVC帧间预测技术学习:高级运动矢量预测(Advanced Motion Vector Prediction, AMVP)

    高级运动矢量预测模式(Advanced Motion Vector Prediction,AMVP) AMVP模式是H.265/HEVC中提出的新的MV预测技术,H.266/VVC仍采用了该技术,并在 ...

最新文章

  1. 第八届蓝桥杯决赛 图书排列
  2. java开发环境及数据类型实验_实验项目1 Java开发环境与语言基础
  3. tomee_一罐将其全部统治:Apache TomEE + Shrinkwrap == JavaEE引导
  4. QT 多屏参数获取和设置
  5. 第6课 仿Siri机器人-语音朗读和语音识别
  6. 15日直播预告丨SQL条件等价改写秘笈(主讲人:怀晓明)
  7. 《iOS9开发快速入门》——第2章,第2.1节Xcode 7.0的新特性
  8. 知乎:国家何时整治程序员的高效现象?
  9. weui 加载提示_WeUI与WeUI.JS配合切换进入页面显示加载动画
  10. 端口扫描实验和Dos攻击实验
  11. 利用qiskit实现量子门以及态的初始化
  12. Gitgub学习笔记(二)
  13. 如何快速分割多个视频,提取每个原音频单独保存
  14. ArcGIS10.6表统计数据
  15. 推荐几个比较骚的技术公众号【文末福利】
  16. Tableau——方向图标的应用
  17. 2007软件英雄会暨CSDN社区英雄榜颁奖典礼邀请人员名单
  18. 中国无尘室饮水机市场趋势报告、技术动态创新及市场预测
  19. 影响计算机网络性能的原因,计算机网络传输效率分析论文
  20. laravel 核心架构(1)服务容器-深入理解控制反转(IoC)和依赖注入(DI)

热门文章

  1. 【趣文】秦始皇与区块链竟然有关系
  2. 浅析正向代理、反向代理、透明代理
  3. java8实战:使用流收集数据之toList、joining、groupBy(多字段分组)(1)
  4. win11玩游戏延迟_win11系统玩游戏卡顿性能提升小技巧
  5. 计算机能直接执行的语言程序是,计算机能够直接执行的程序是什么语言
  6. C++ 两点之间最短距离
  7. 小猿理财:如何成为百万富翁?
  8. 计算机吉祥如意制作贺卡作业,贺卡制作教案
  9. 《网络攻防》 免杀原理与实践
  10. 小米10等UFS字库备份与基带分区说明