位于函数void EncCu::xCheckRDCostMerge2Nx2N()
原理介绍:VVC/VTM:帧间预测——Combined inter and intra prediction (CIIP)

      if (isIntrainterEnabled){int numTestIntraMode = 4;// prepare for Intra bits calculationconst TempCtx ctxStart(m_CtxCache, m_CABACEstimator->getCtx());const TempCtx ctxStartIntraMode(m_CtxCache, SubCtx(Ctx::MHIntraPredMode, m_CABACEstimator->getCtx()));// for Intrainter fast, recored the best intra mode during the first round for mrege 0int bestMHIntraMode = -1;double bestMHIntraCost = MAX_DOUBLE;pu.mhIntraFlag = true;// save the to-be-tested merge candidatesuint32_t MHIntraMergeCand[NUM_MRG_SATD_CAND];for (uint32_t mergeCnt = 0; mergeCnt < std::min(NUM_MRG_SATD_CAND, (const int)mergeCtx.numValidMergeCand); mergeCnt++){MHIntraMergeCand[mergeCnt] = RdModeList[mergeCnt];}for (uint32_t mergeCnt = 0; mergeCnt < std::min(std::min(NUM_MRG_SATD_CAND, (const int)mergeCtx.numValidMergeCand), 4); mergeCnt++){uint32_t mergeCand = MHIntraMergeCand[mergeCnt];acMergeBuffer[mergeCand] = m_acRealMergeBuffer[mergeCand].getBuf(localUnitArea);// estimate merge bitsuint32_t bitsCand = mergeCand + 1;if (mergeCand == pu.cs->slice->getMaxNumMergeCand() - 1){bitsCand--;}// first roundfor (uint32_t intraCnt = 0; intraCnt < numTestIntraMode; intraCnt++){pu.intraDir[0] = (intraCnt < 2) ? intraCnt : ((intraCnt == 2) ? HOR_IDX : VER_IDX);// fast 2if (mergeCnt > 0 && bestMHIntraMode != pu.intraDir[0]){continue;}int narrowCase = PU::getNarrowShape(pu.lwidth(), pu.lheight());if (narrowCase == 1 && pu.intraDir[0] == HOR_IDX){continue;}if (narrowCase == 2 && pu.intraDir[0] == VER_IDX){continue;}// generate intrainter Y predictionif (mergeCnt == 0){bool isUseFilter = IntraPrediction::useFilteredIntraRefSamples(COMPONENT_Y, pu, true, pu);m_pcIntraSearch->initIntraPatternChType(*pu.cu, pu.Y(), isUseFilter);m_pcIntraSearch->predIntraAng(COMPONENT_Y, pu.cs->getPredBuf(pu).Y(), pu, isUseFilter);m_pcIntraSearch->switchBuffer(pu, COMPONENT_Y, pu.cs->getPredBuf(pu).Y(), m_pcIntraSearch->getPredictorPtr2(COMPONENT_Y, intraCnt));}pu.cs->getPredBuf(pu).copyFrom(acMergeBuffer[mergeCand]);if (pu.cs->slice->getReshapeInfo().getUseSliceReshaper() && m_pcReshape->getCTUFlag()){pu.cs->getPredBuf(pu).Y().rspSignal(m_pcReshape->getFwdLUT());}m_pcIntraSearch->geneWeightedPred(COMPONENT_Y, pu.cs->getPredBuf(pu).Y(), pu, m_pcIntraSearch->getPredictorPtr2(COMPONENT_Y, intraCnt));// calculate costif (pu.cs->slice->getReshapeInfo().getUseSliceReshaper() && m_pcReshape->getCTUFlag()){pu.cs->getPredBuf(pu).Y().rspSignal(m_pcReshape->getInvLUT());}distParam.cur = pu.cs->getPredBuf(pu).Y();Distortion sadValue = distParam.distFunc(distParam);if (pu.cs->slice->getReshapeInfo().getUseSliceReshaper() && m_pcReshape->getCTUFlag()){pu.cs->getPredBuf(pu).Y().rspSignal(m_pcReshape->getFwdLUT());}m_CABACEstimator->getCtx() = SubCtx(Ctx::MHIntraPredMode, ctxStartIntraMode);uint64_t fracModeBits = m_pcIntraSearch->xFracModeBitsIntra(pu, pu.intraDir[0], CHANNEL_TYPE_LUMA);double cost = (double)sadValue + (double)(bitsCand + 1) * sqrtLambdaForFirstPass + (double)fracModeBits * sqrtLambdaForFirstPassIntra;insertPos = -1;updateDoubleCandList(mergeCand + MRG_MAX_NUM_CANDS + MMVD_ADD_NUM, cost, RdModeList, candCostList, RdModeList2, pu.intraDir[0], uiNumMrgSATDCand, &insertPos);if (insertPos != -1){for (int i = int(RdModeList.size()) - 1; i > insertPos; i--){swap(acMergeTempBuffer[i - 1], acMergeTempBuffer[i]);}swap(singleMergeTempBuffer, acMergeTempBuffer[insertPos]);}// fast 2if (mergeCnt == 0 && cost < bestMHIntraCost){bestMHIntraMode = pu.intraDir[0];bestMHIntraCost = cost;}}}pu.mhIntraFlag = false;m_CABACEstimator->getCtx() = ctxStart;}。。。。if (isIntrainterEnabled){pu.mhIntraFlag = true;for (uint32_t mergeCnt = 0; mergeCnt < uiNumMrgSATDCand; mergeCnt++){if (RdModeList[mergeCnt] >= (MRG_MAX_NUM_CANDS + MMVD_ADD_NUM)){pu.intraDir[0] = RdModeList2[mergeCnt];pu.intraDir[1] = DM_CHROMA_IDX;uint32_t bufIdx = (pu.intraDir[0] > 1) ? (pu.intraDir[0] == HOR_IDX ? 2 : 3) : pu.intraDir[0];bool isUseFilter = IntraPrediction::useFilteredIntraRefSamples(COMPONENT_Cb, pu, true, pu);m_pcIntraSearch->initIntraPatternChType(*pu.cu, pu.Cb(), isUseFilter);m_pcIntraSearch->predIntraAng(COMPONENT_Cb, pu.cs->getPredBuf(pu).Cb(), pu, isUseFilter);m_pcIntraSearch->switchBuffer(pu, COMPONENT_Cb, pu.cs->getPredBuf(pu).Cb(), m_pcIntraSearch->getPredictorPtr2(COMPONENT_Cb, bufIdx));isUseFilter = IntraPrediction::useFilteredIntraRefSamples(COMPONENT_Cr, pu, true, pu);m_pcIntraSearch->initIntraPatternChType(*pu.cu, pu.Cr(), isUseFilter);m_pcIntraSearch->predIntraAng(COMPONENT_Cr, pu.cs->getPredBuf(pu).Cr(), pu, isUseFilter);m_pcIntraSearch->switchBuffer(pu, COMPONENT_Cr, pu.cs->getPredBuf(pu).Cr(), m_pcIntraSearch->getPredictorPtr2(COMPONENT_Cr, bufIdx));}}pu.mhIntraFlag = false;}

VVC/VTM:代码学习——CIIP详细过程相关推荐

  1. 估值一亿的AI核心代码(简洁详细过程+题目存在漏洞)

    以上图片来自新浪微博. 本题要求你实现一个稍微更值钱一点的 AI 英文问答程序,规则是: 无论用户说什么,首先把对方说的话在一行中原样打印出来: 消除原文中多余空格:把相邻单词间的多个空格换成 1 个 ...

  2. VVC/JEM代码学习26:m_pcTrQuant-transformN*N

    在H.266中,做完主变换后,还要进行二次变换,然后才进行量化: Void TComTrQuant::transformNxN( TComTU & rTu,const ComponentID ...

  3. VVC/JEM代码学习12:transformNxN

    对残差次数进行量化编码的函数,相比于HEVC,JEM中加入了二次变换,即在第一次主变换又进行第二次变换:此外,还加入了EMT,和DCT2是并列关系,根据相关索引进行选择; Void TComTrQua ...

  4. 学习Python全套代码【超详细】Python入门、核心语法、数据结构、Python进阶【致那个想学好Python的你】

    大家早上好,本人姓吴,如果觉得文章写得还行的话也可以叫我吴老师.欢迎大家跟我一起走进数据分析的世界,一起学习! 感兴趣的朋友可以关注我的数据分析专栏,里面有许多优质的文章跟大家分享哦. 文末附上详细的 ...

  5. VVC/VTM:帧间预测——Combined inter and intra prediction (CIIP)

    Combined inter and intra prediction (CIIP) CIIP,顾名思义,就是说对编码块进行帧间预测Pred_inter和帧内预测Pred_intra,将两个预测块加权 ...

  6. 【记录爬虫实战过程】入门学习·详细过程·爬取天气信息并通过pyecharts进行可视化展示1

    文章目录 前言 正文 1.导入对应模块 2.确定爬取的网站 3.得到数据 4.数据处理 5.将所得数据写入CSV 完整代码 补充:数据可视化 前言 入门学习这个部分是跟着b站教学视频做的,记录了所有过 ...

  7. H.266/VVC代码学习20:角度预测入口 / 特殊模式的PDPC技术(predIntraAng)

    1.predIntraAng函数 predIntraAng是帧内0~66这67种预测的入口.其中可细分为: 模式0:PLANAR模式 模式1:DC模式 模式2~66:角度模式 此函数在亮度预测和色度预 ...

  8. 库存物资管理系统代码,详细过程和总结

    库存物资管理系统实验要求如下: 1.背景资料 1.有一个存放商品的仓库,每天都有商品出库和入库. 2.每种商品都有名称.生产厂家.型号.规格等. 3.出入库时必须填写出入库单据,单据包括商品名称.生产 ...

  9. HEVC代码学习:帧间预测——MVP过程中MV的获取、传递及存储

    作为一个视频编码小白,最近开始着手啃HEVC帧间预测的代码,想用博客记录一下自己的学习过程,也想与大家分享.交流一下. HEVC代码的学习主要是参考两位大神岳麓吹雪.NB_vol_1的博客以及HM参考 ...

最新文章

  1. 图片相册社区类型小程序模板
  2. Android用户界面
  3. opencv复杂变换cvPyrDown [6]
  4. 正则表达+验证 [记录]
  5. 87-Moving average of oscillator,移动平均振荡指标.(2015.7.4)
  6. 自然语言处理的学习心得
  7. 银行家算法和安全性算法笔记
  8. 武昌理工学院计算机巧业怎样,最潮高校宿管员巧念育人经 做学生们的“知心大姐”...
  9. JavaScript实现Sleep效果
  10. Mysql中删除语句delete、truncate、drop的区别
  11. JS实现限制可移动div的移动范围
  12. 博客园添加页首导航菜单
  13. 形式语言与自动机学习复述笔记
  14. 零基础创作专业wordpress网站05-将主页面设置为主页
  15. 上海国际快递物流展浅谈快递自动化分拣设备市场“起风了”!
  16. 计算机二级python证书有用吗_计算机二级对找工作重要吗 用处大不大
  17. frp内网穿透硬盘录像机的设置
  18. CEVA DSP构成
  19. C++ 图像 和 视频 转换
  20. 基于python对密立根油滴实验数据处理改进

热门文章

  1. 计算机械结构变形,机械结构设计-力学原理设计准则
  2. 【java】方法练习1-商品总价对应折扣
  3. 视觉镜头上的闪回画面
  4. 网络安全工程师做什么?
  5. 自动化测试到底怎么做(单元测试自动化,接口自动化,UI自动化)
  6. 大数据时代对存储发展的要求有哪些
  7. Java代码加密混淆工具有哪些?
  8. matlab中种子填充算法
  9. 蓝牙芯片|伦茨科技-智能蓝牙BLE5.2芯片ST17H66
  10. 初始化Weex项目遇到的问题记录