一.函数调用关系图:

二. 源码分析注释:

/*============Analysed by: yangxin============Date:        2018.10============Function:    checkMerge2Nx2N_rd0_4()      merge预测技术============Note:        merge预测技术只针对2Nx2N,这种模式下当前CU在只有一个pu,也只有一个tu
*/
/* sets md.bestMode if a valid merge candidate is found, else leaves it NULL */
void Analysis::checkMerge2Nx2N_rd0_4(Mode& skip, Mode& merge, const CUGeom& cuGeom)
{uint32_t depth = cuGeom.depth;ModeDepth& md = m_modeDepth[depth];Yuv *fencYuv = &md.fencYuv;/* Note that these two Mode instances are named MERGE and SKIP but they may* hold the reverse when the function returns. We toggle between the two modes */Mode* tempPred = &merge;Mode* bestPred = &skip;X265_CHECK(m_slice->m_sliceType != I_SLICE, "Evaluating merge in I slice\n");tempPred->initCosts();tempPred->cu.setPartSizeSubParts(SIZE_2Nx2N);tempPred->cu.setPredModeSubParts(MODE_INTER);tempPred->cu.m_mergeFlag[0] = true;bestPred->initCosts();bestPred->cu.setPartSizeSubParts(SIZE_2Nx2N);bestPred->cu.setPredModeSubParts(MODE_INTER);bestPred->cu.m_mergeFlag[0] = true;MVField candMvField[MRG_MAX_NUM_CANDS][2]; // double length for mv of both listsuint8_t candDir[MRG_MAX_NUM_CANDS];uint32_t numMergeCand = tempPred->cu.getInterMergeCandidates(0, 0, candMvField, candDir);//--得到merge候选列表PredictionUnit pu(merge.cu, cuGeom, 0);bestPred->sa8dCost = MAX_INT64;int bestSadCand = -1;int sizeIdx = cuGeom.log2CUSize - 2;int safeX, maxSafeMv;if (m_param->bIntraRefresh && m_slice->m_sliceType == P_SLICE){safeX = m_slice->m_refFrameList[0][0]->m_encData->m_pir.pirEndCol * m_param->maxCUSize - 3;maxSafeMv = (safeX - tempPred->cu.m_cuPelX) * 4;}//--遍历所有merge候选,选择最小的sa8dCost作为最优mv进行下一步的RDO--------------------------------------------------------/for (uint32_t i = 0; i < numMergeCand; ++i){if (m_bFrameParallel){// Parallel slices bound checkif (m_param->maxSlices > 1){// NOTE: First row in slice can't negativeif (X265_MIN(candMvField[i][0].mv.y, candMvField[i][1].mv.y) < m_sliceMinY)continue;// Last row in slice can't reference beyond bound since it is another slice area// TODO: we may beyond bound in future since these area have a chance to finish because we use parallel slices. Necessary prepare research on load balanceif (X265_MAX(candMvField[i][0].mv.y, candMvField[i][1].mv.y) > m_sliceMaxY)continue;}if (candMvField[i][0].mv.y >= (m_param->searchRange + 1) * 4 ||candMvField[i][1].mv.y >= (m_param->searchRange + 1) * 4)continue;}if (m_param->bIntraRefresh && m_slice->m_sliceType == P_SLICE &&tempPred->cu.m_cuPelX / m_param->maxCUSize < m_frame->m_encData->m_pir.pirEndCol &&candMvField[i][0].mv.x > maxSafeMv)// skip merge candidates which reference beyond safe reference areacontinue;tempPred->cu.m_mvpIdx[0][0] = (uint8_t)i; // merge candidate ID is stored in L0 MVP idxX265_CHECK(m_slice->m_sliceType == B_SLICE || !(candDir[i] & 0x10), " invalid merge for P slice\n");tempPred->cu.m_interDir[0] = candDir[i];tempPred->cu.m_mv[0][0] = candMvField[i][0].mv;tempPred->cu.m_mv[1][0] = candMvField[i][1].mv;tempPred->cu.m_refIdx[0][0] = (int8_t)candMvField[i][0].refIdx;tempPred->cu.m_refIdx[1][0] = (int8_t)candMvField[i][1].refIdx;//--运动补偿motionCompensation(tempPred->cu, pu, tempPred->predYuv, true, m_bChromaSa8d && (m_csp != X265_CSP_I400 && m_frame->m_fencPic->m_picCsp != X265_CSP_I400));//--bit计算tempPred->sa8dBits = getTUBits(i, numMergeCand);//--失真计算tempPred->distortion = primitives.cu[sizeIdx].sa8d(fencYuv->m_buf[0], fencYuv->m_size, tempPred->predYuv.m_buf[0], tempPred->predYuv.m_size);if (m_bChromaSa8d && (m_csp != X265_CSP_I400 && m_frame->m_fencPic->m_picCsp != X265_CSP_I400)){tempPred->distortion += primitives.chroma[m_csp].cu[sizeIdx].sa8d(fencYuv->m_buf[1], fencYuv->m_csize, tempPred->predYuv.m_buf[1], tempPred->predYuv.m_csize);tempPred->distortion += primitives.chroma[m_csp].cu[sizeIdx].sa8d(fencYuv->m_buf[2], fencYuv->m_csize, tempPred->predYuv.m_buf[2], tempPred->predYuv.m_csize);}//--代价计算tempPred->sa8dCost = m_rdCost.calcRdSADCost((uint32_t)tempPred->distortion, tempPred->sa8dBits);if (tempPred->sa8dCost < bestPred->sa8dCost){bestSadCand = i;std::swap(tempPred, bestPred);//--交换左右值}}///---------------------------------------------------------------------------------------------------///* force mode decision to take inter or intra */if (bestSadCand < 0)return;/* calculate the motion compensation for chroma for the best mode selected */ //--为选择的最优模式进行色度的运动补偿评估*****if ((!m_bChromaSa8d && (m_csp != X265_CSP_I400)) || (m_frame->m_fencPic->m_picCsp == X265_CSP_I400 && m_csp != X265_CSP_I400)) /* Chroma MC was done above */motionCompensation(bestPred->cu, pu, bestPred->predYuv, false, true);/-------------------------------RDO的计算---------------------------------------------------//if (m_param->rdLevel)//--开启rate distortion optimizations{if (m_param->bLossless)bestPred->rdCost = MAX_INT64;elseencodeResAndCalcRdSkipCU(*bestPred); //--skip==encode residual and compute rd-cost for inter mode,会覆盖帧间模式的RDcost变量,但是sa8d cost没有被破坏/* Encode with residual */tempPred->cu.m_mvpIdx[0][0] = (uint8_t)bestSadCand;tempPred->cu.setPUInterDir(candDir[bestSadCand], 0, 0);tempPred->cu.setPUMv(0, candMvField[bestSadCand][0].mv, 0, 0);tempPred->cu.setPUMv(1, candMvField[bestSadCand][1].mv, 0, 0);tempPred->cu.setPURefIdx(0, (int8_t)candMvField[bestSadCand][0].refIdx, 0, 0);tempPred->cu.setPURefIdx(1, (int8_t)candMvField[bestSadCand][1].refIdx, 0, 0);tempPred->sa8dCost = bestPred->sa8dCost;tempPred->sa8dBits = bestPred->sa8dBits;tempPred->predYuv.copyFromYuv(bestPred->predYuv);encodeResAndCalcRdInterCU(*tempPred, cuGeom);//--merge==encode residual and compute rd-cost for inter modemd.bestMode = tempPred->rdCost < bestPred->rdCost ? tempPred : bestPred;}elsemd.bestMode = bestPred;//--不使用RDO/* broadcast sets of MV field data */md.bestMode->cu.setPUInterDir(candDir[bestSadCand], 0, 0);md.bestMode->cu.setPUMv(0, candMvField[bestSadCand][0].mv, 0, 0);md.bestMode->cu.setPUMv(1, candMvField[bestSadCand][1].mv, 0, 0);md.bestMode->cu.setPURefIdx(0, (int8_t)candMvField[bestSadCand][0].refIdx, 0, 0);md.bestMode->cu.setPURefIdx(1, (int8_t)candMvField[bestSadCand][1].refIdx, 0, 0);checkDQP(*md.bestMode, cuGeom);
}

x265中checkMerge2Nx2N_rd0_4()分析(版本2.8)相关推荐

  1. 如何使用netwokx进行复杂网络的中心性分析?

    如何使用netwokx进行复杂网络的中心性分析? 这是本学期在大数据哲学与社会科学实验室做的第七次分享了. 第一次分享的是: 如何利用"wordcloud+jieba"制作中文词云 ...

  2. maven pom java版本_Maven更新POM中的JDK版本(比如更新为JDK1.8)

    默认POM如果不指定JDK版本为1.5,而有些项目需要使用泛型这些,就必须使用1.8版本的JDK,所以需要手动修改POM. 打开pom.xml文件修改,增加如下配置节点: [...] [...] or ...

  3. Vue中computed分析

    Vue中computed分析 在Vue中computed是计算属性,其会根据所依赖的数据动态显示新的计算结果,虽然使用{{}}模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的,在模板中放入太 ...

  4. cmd查看php服务器,如何在windows中查看php版本

    如何在windows中查看php版本 发布时间:2020-06-25 15:19:17 来源:亿速云 阅读:155 作者:Leah 如何在windows中查看php版本?针对这个问题,这篇文章详细介绍 ...

  5. 爬坑”无法找到 .NET Core SDK。请检查确保已安装此项且 global.json 中指定的版本(如有)与所安装的版本相匹配“

    这几天需要用到神器dnspy,从GITHub上获取了源码[dnspy源码]后在本地生成,意外的在打开解决方案是VS提示"无法找到 .NET Core SDK.请检查确保已安装此项且 glob ...

  6. 人工智能中的分析学快速入门之著名教材

    分析学方面,特别是微积分方面的教材特别多,这里推荐几本国内外非常著名的教材,以供大家参考,国外的教材写的比较生动详尽,将理论的来龙去脉交代得非常清楚:国内的教材则写的比较简洁,框架比较清晰.两者各有优 ...

  7. x265源码分析 main函数 x265.cpp

    图片转载于x265源码流程分析_Dillon2015的博客-CSDN博客_x265编码流程 cliopt.prase main ()函数--解析函数参数并进行编码准备工作:x265.cpp (1)Ge ...

  8. android 最新sdk版本,详解如何在Android studio中更新sdk版本和build-tools版本

    一.首先看下Android开发用到的sdk目录: build-tools 保存着一些Android平台相关通用工具,比如adb.和aapt.aidl.dx等文件. aapt即Android Asset ...

  9. 《MATLAB语音信号分析与合成(第二版)》:第3章 语音信号在其他变换域中的分析技术和特性

    <MATLAB语音信号分析与合成(第二版)>:第3章 语音信号在其他变换域中的分析技术和特性 前言 1. 数据与函数路径设置 2. MATLAB仿真一:信号倒谱图.声道冲激响频谱.声门激励 ...

  10. 刘笑天:Ansys workbench机械设计模块中静力分析案例

    附赠仿真学习包,包含结构.流体.电磁.热仿真等多学科视频教程,点击领取: ​​​​​​仿真秀粉丝专属礼包 作者:刘笑天 这个案例演示ANSYS WORKBENCH 14.0机械设计模块中静力分析模块, ...

最新文章

  1. SHELL中的三神器:管道、重定向、backtick
  2. Android之Google推荐的图片加载库Glide介绍
  3. html css position,[CSS]CSS Position 详解
  4. ZZULIOJ 1115: 数组最小值
  5. 2015-2016 Northwestern European Regional Contest (NWERC 2015)
  6. 根据Return Code判断gui连接SAP服务器的问题
  7. vuejs切换导航条高亮路由高亮做法
  8. I2S 总线学习:I2S驱动WM8978
  9. 计算机表格排版,你必须要知道的excel排版技巧
  10. 计算机专业就业方向总结(选择也许更重要)
  11. 使用32驱动1602液晶屏
  12. Vux使用Swiper遇到的问题
  13. openshift/origin学习记录(9)——S2I镜像定制(基于Git)
  14. 从三字经看古代幼儿教育
  15. 将SQL导入JAVA的后续操作
  16. Dojo 1.6 官方教程:Dojo中的事件
  17. 关于黑苹果卡在[IGPU] Scheduler Throttle Cap=100ms的解决办法
  18. ▷Scratch资讯丨华为达芬奇计划
  19. 实用技巧:六招教你去掉图片上的文字
  20. 卸载Adobe Illustrator

热门文章

  1. 进度条制作-GIF动画
  2. 最好用的 10 款 MySQL 管理工具横向测评 - 免费和付费到底怎么选?
  3. 世界各国英文简写一览表
  4. java常用的库_java有哪些常用的库
  5. Tableau如何动态显示销售数据排名
  6. 翻译:《CSS权威指南》(第3版)-概览和目录部分
  7. 常用shell命令归纳总结
  8. 【软件测试】软件测试学习笔记(三)
  9. 计算机一级常用计算公式,全国计算机一级考试题库
  10. 图解设计模式-Chain Of Responsibility模式