在执行完xCheckRDCostMerge2N*2N函数完后,会执行此函数。FRUC包含两种技术,一种是模板匹配,一种是双边匹配。该计算的关键在于怎么推导MV,下次再看吧。

#if VCEG_AZ07_FRUC_MERGE
Void TEncCu::xCheckRDCostMerge2Nx2NFRUC( TComDataCU*& rpcBestCU, TComDataCU*& rpcTempCU , Bool *earlyDetectionSkipMode )
{
#if JVET_C0024_QTBTUInt uiWIdx = g_aucConvertToBit[rpcBestCU->getWidth(0)];UInt uiHIdx = g_aucConvertToBit[rpcBestCU->getHeight(0)];
#endifUChar uhDepth = rpcTempCU->getDepth( 0 );const UChar uhFRUCME[2] = { FRUC_MERGE_BILATERALMV , FRUC_MERGE_TEMPLATE };//双边匹配和模板匹配
#if VCEG_AZ06_ICBool bICFlag = rpcTempCU->getICFlag( 0 );
#endif///循环两次,一次是双边匹配(时域),一次是模板匹配(空域)/for( Int nME = 0 ; nME < 2 ; nME++ ){
#if JVET_D0077_SAVE_LOAD_ENC_INFOif( m_pcPredSearch->getSaveLoadTag(rpcBestCU->getZorderIdxInCtu(), uiWIdx, uiHIdx) == LOAD_ENC_INFO && uhFRUCME[nME] != m_pcPredSearch->getSaveLoadFrucMode( uiWIdx, uiHIdx ) ){continue;}
#endif
#if !JVET_C0024_QTBTrpcTempCU->setPartSizeSubParts( SIZE_2Nx2N, 0, uhDepth );
#endif//设置运动补偿参数rpcTempCU->setPredModeSubParts( MODE_INTER, 0, uhDepth ); // interprets depth relative to LCU levelrpcTempCU->setCUTransquantBypassSubParts( false,     0, uhDepth );rpcTempCU->setMergeFlagSubParts( true, 0, 0, uhDepth ); // interprets depth relative to LCU levelrpcTempCU->setMergeIndexSubParts( 0, 0, 0, uhDepth ); // interprets depth relative to LCU levelrpcTempCU->setFRUCMgrModeSubParts( uhFRUCME[nME] , 0 , 0 , uhDepth );
#if VCEG_AZ06_ICrpcTempCU->setICFlagSubParts( bICFlag, 0, uhDepth );
#endifBool bAvailable = m_pcPredSearch->deriveFRUCMV( rpcTempCU , uhDepth , 0 , 0 ); //基于FRUC推导块的MV;
#if JVET_C0024_QTBTm_pppcFRUCBufferCU[uiWIdx][uiHIdx]->copyPartFrom( rpcTempCU , 0 , uhDepth, rpcTempCU->getWidth(0), rpcTempCU->getHeight(0) );
#elsem_ppcFRUCBufferCU[uhDepth]->copyPartFrom( rpcTempCU , 0 , uhDepth );
#endifif( bAvailable )//如果上面推导出来的MV可用{UInt iteration = 1 + !rpcTempCU->isLosslessCoded(0) ;//无损,则等于1,有损,则等于2;//iteration开始,残差系数全为0迭代1次,否则2次//for( UInt uiNoResidual = 0; uiNoResidual < iteration; uiNoResidual++ ){if( uiNoResidual > 0 )//第二次迭代;{
#if JVET_C0024_QTBTrpcTempCU->copyPartFrom( m_pppcFRUCBufferCU[uiWIdx][uiHIdx] , 0 , uhDepth, rpcTempCU->getWidth(0), rpcTempCU->getHeight(0) );
#elserpcTempCU->copyPartFrom( m_ppcFRUCBufferCU[uhDepth] , 0 , uhDepth );
#endif}// do MC
#if JVET_C0024_QTBTm_pcPredSearch->motionCompensation ( rpcTempCU, m_pppcPredYuvTemp[uiWIdx][uiHIdx] );//做运动补偿
#if COM16_C806_OBMC//进行重叠块运动补偿m_pcPredSearch->subBlockOBMC( rpcTempCU, 0, m_pppcPredYuvTemp[uiWIdx][uiHIdx], m_pppcTmpYuv1[uiWIdx][uiHIdx], m_pppcTmpYuv2[uiWIdx][uiHIdx] );
#endif// estimate residual and encode everything,估计残差并且编码所有数据,计算失真m_pcPredSearch->encodeResAndCalcRdInterCU( rpcTempCU,m_pppcOrigYuv    [uiWIdx][uiHIdx],m_pppcPredYuvTemp[uiWIdx][uiHIdx],m_pppcResiYuvTemp[uiWIdx][uiHIdx],m_pppcResiYuvBest[uiWIdx][uiHIdx],m_pppcRecoYuvTemp[uiWIdx][uiHIdx],(uiNoResidual? true:false)
#if COM16_C806_EMT, rpcBestCU->getTotalCost()
#endif);
#elsem_pcPredSearch->motionCompensation ( rpcTempCU, m_ppcPredYuvTemp[uhDepth] );
#if COM16_C806_OBMCm_pcPredSearch->subBlockOBMC( rpcTempCU, 0, m_ppcPredYuvTemp[uhDepth], m_ppcTmpYuv1[uhDepth], m_ppcTmpYuv2[uhDepth] );
#endif// estimate residual and encode everythingm_pcPredSearch->encodeResAndCalcRdInterCU( rpcTempCU,m_ppcOrigYuv    [uhDepth],m_ppcPredYuvTemp[uhDepth],m_ppcResiYuvTemp[uhDepth],m_ppcResiYuvBest[uhDepth],m_ppcRecoYuvTemp[uhDepth],(uiNoResidual? true:false)
#if COM16_C806_EMT, rpcBestCU->getTotalCost()
#endif);
#endifif ( uiNoResidual == 0 && rpcTempCU->getQtRootCbf(0) == 0 ){//在第一次迭代中,如果残差系数全为0,则不进行第二次迭代过程;uiNoResidual++;}rpcTempCU->setSkipFlagSubParts( rpcTempCU->getQtRootCbf(0) == 0, 0, uhDepth );//设置SkipFlag;Int orgQP = rpcTempCU->getQP( 0 );xCheckDQP( rpcTempCU );xCheckBestMode(rpcBestCU, rpcTempCU, uhDepth);rpcTempCU->initEstData( uhDepth, orgQP, false );}//iteration结束///}}循环结束,一次双边匹配,一次模板匹配/
}
#endif

VVC/JEM代码学习17:xCheckRDCostMerge2Nx2NFRUC相关推荐

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

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

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

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

  3. H.266/VVC代码学习17:帧内亮度预测的编解码(intra_luma_pred_modes)

    引--亮度预测:H.266/VVC代码学习5:VTM4.0帧内亮度预测代码(estIntraPredLumaQT) 一.结论: 亮度编解码根据MPM列表的值分为两个阶段: 1 亮度模式在MPM列表中: ...

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

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

  5. H.266/VVC代码学习21:帧内角度预测的实现 / 近对角模式的PDPC(xPredIntraAng)

    xPredIntraAng函数的作用是对任意大小的块和任意模式,如何将参考像素的值根据其模式的角度填充进每一个像素. 下图是basketball drill的一个16*16的块,其预测模式为10(偏斜 ...

  6. H.266代码学习:JEM使用方法

    之前在HEVC代码学习0:HM使用+码流分析教程中详细介绍了HM使用方法,而H.266参考代码JEM已经成型,因此这里简单介绍下JEM的使用方法. 阅读建议: JEM使用方法与HM类似,使用中改动在于 ...

  7. H.266代码学习:xIntraCodingTUBlock函数

    今天来继续学习帧内编码的重要函数xIntraCodingTUBlock,上次 H.266代码学习:xRecurIntraCodingLumaQT函数 学习中提到,xIntraCodingTUBlock ...

  8. YOLO 卷积层代码学习

    YOLO 卷积层代码学习 卷积层的初始化 void im2col_cpu(float* data_im,int channels, int height, int width,int ksize, i ...

  9. Keras版Faster-RCNN代码学习(IOU,RPN)1

    最近开始使用Keras来做深度学习,发现模型搭建相较于MXnet, Caffe等确实比较方便,适合于新手练手,于是找来了目标检测经典的模型Faster-RCNN的keras代码来练练手,代码的主题部分 ...

  10. java绘制图形代码_ImagePy_Learn | 图形学绘制代码学习:core\draw\polygonfill.py

    最近在学图形学绘制,想到了ImagePy框架的ROI涂抹交互很方便,于是啃起了绘制代码. 这里主要对ImagePy中一个填充工具进行难点讲解. 让我们好好学习Python中的图形学绘制吧. 例子代码来 ...

最新文章

  1. 用好ASP.NET 2.0的URL映射
  2. 如何高效地逛Github?
  3. [语义]情感分析方向近况·0908
  4. centos7 时间设置
  5. JDBC、Tomcat为什么要破坏双亲委派模型?
  6. 前端学习(1651):前端系列实战课程之json和字符串互转
  7. macOS Big Sur 11当前存在的一些问题(更新中)
  8. 自动化的NSX网络交付
  9. 零基础学python还是c语言-为什么大一先学C语言,而不是Python,你知道为什么吗?...
  10. Profiles在Spring Boot中的使用--环境切换
  11. 【语音识别】基于matlab傅立叶变换0-9数字语音识别【含Matlab源码 384期】
  12. R中输出常见位图和矢量图格式总结
  13. (6.0系统手机)安卓神器Xposed框架ROOT安装指南
  14. csgo服务器显示连接中,CSGO提示连接到官方任意服务器失败怎么办?
  15. 关于zblog模板当中标签、相关文章调用应该怎么来写
  16. 电脑 清理android,怎样清除系统垃圾 手机电脑一举拿下【图文】
  17. ThingJS:次时代3D城市大屏,2款工具3分钟搭建完成!
  18. 判断一个数字是不是素数
  19. 洛谷 P4238 【模板】多项式乘法逆
  20. 用java编国际象棋3之将军与悔棋

热门文章

  1. mysql 管理工具—phpmyadmin docker 版使用
  2. ORACLE ASM 转自三思笔记
  3. html手机背景音乐,HTML插入背景音乐方法【全】
  4. HTML5页面播放音乐
  5. ZooKeeper 会话的秘密
  6. 2020辅警考试计算机知识题,2019年辅警考试题库:计算机概述-计算机软件系统
  7. 【正点原子MP157连载】第二章 STM32MP1简介-摘自【正点原子】STM32MP1 M4裸机CubeIDE开发指南
  8. CSS 命名 BEM 。线上样式不对。已经更新。El-input__suffix偏上。字体样式 苹方-简 PingFangSC-Regular。echarts字体。
  9. Matlab中添加LibPLS安装包
  10. 【Python】勒索病毒模拟