HM学习心得

帧内模式决策的认识

最近,随着对HM认识的了解更加深入,对一些以前只是在理论上认识的知识,在HM的实现上如何实现有了具体的认知。现在总结下,对帧内模式决策的认识。
首先,分析下帧内模式决策的理论知识。在HEVC帧内模式决策的最佳模式过程需要四个过程(其实也可以说是三个过程)。
首先,是对35种帧内模式进行RMD(粗选择)。在RMD中主要实现对35种模式低复杂度代价的计算,根据PU的大小选取代价较小的前几个模式构成初始候选模式集,进行下一过程。
其次,进行MPM(最有可能模式选择)。所谓的MPM即,判断RMD后的模式是否包含有当前PU左邻近与上邻近的最佳模式。如果RMD后的模式不包含当前PU左邻近与上邻近的最佳模式,则将相应不包含的模式纳入初始候选模式集;反之,则不进行处理。 再次,对经MPM的初始候选模式集进行RDO过程。此时的RDO过程是在TU最大尺寸上进行的,从候选模式集中选出RDcost最小的模式,作为当前PU的最佳模式。
最后,在最佳模式上进行RQT,即在最佳模式上决定最佳TU分割。(之所以说三个过程就可以,那是因为前三个过程已经确定了最佳模式,只不过在RDO中也涉及到了TU,所以就说是四个过程了。)
具体代码实现如下各图所示。

图1 RMD


图2 MPM


以下程序为RDO过程:

for( UInt uiMode = 0; uiMode < numModesForFullRD; uiMode++ )//对RMD和MPM后的模式集进行RDO
    {
      // set luma prediction mode
      UInt uiOrgMode = uiRdModeList[uiMode];
      
      pcCU->setLumaIntraDirSubParts ( uiOrgMode, uiPartOffset, uiDepth + uiInitTrDepth );
      
      // set context models
      if( m_bUseSBACRD )
      {
        m_pcRDGoOnSbacCoder->load( m_pppcRDSbacCoder[uiDepth][CI_CURR_BEST] );
      }
      
      // determine residual for partition
      UInt   uiPUDistY = 0;
      UInt   uiPUDistC = 0;
      Double dPUCost   = 0.0;
#if HHI_RQT_INTRA_SPEEDUP
      xRecurIntraCodingQT( pcCU, uiInitTrDepth, uiPartOffset, bLumaOnly, pcOrgYuv, pcPredYuv, pcResiYuv, uiPUDistY, uiPUDistC, true, dPUCost );
#else
      xRecurIntraCodingQT( pcCU, uiInitTrDepth, uiPartOffset, bLumaOnly, pcOrgYuv, pcPredYuv, pcResiYuv, uiPUDistY, uiPUDistC, dPUCost );
#endif
      
      // check r-d cost
      if( dPUCost < dBestPUCost )
      {
#if HHI_RQT_INTRA_SPEEDUP_MOD
        uiSecondBestMode  = uiBestPUMode;
        dSecondBestPUCost = dBestPUCost;
#endif
        uiBestPUMode  = uiOrgMode;
        uiBestPUDistY = uiPUDistY;
        uiBestPUDistC = uiPUDistC;
        dBestPUCost   = dPUCost;
        
        xSetIntraResultQT( pcCU, uiInitTrDepth, uiPartOffset, bLumaOnly, pcRecoYuv );
        
        UInt uiQPartNum = pcCU->getPic()->getNumPartInCU() >> ( ( pcCU->getDepth(0) + uiInitTrDepth ) << 1 );
        ::memcpy( m_puhQTTempTrIdx,  pcCU->getTransformIdx()       + uiPartOffset, uiQPartNum * sizeof( UChar ) );
        ::memcpy( m_puhQTTempCbf[0], pcCU->getCbf( TEXT_LUMA     ) + uiPartOffset, uiQPartNum * sizeof( UChar ) );
        ::memcpy( m_puhQTTempCbf[1], pcCU->getCbf( TEXT_CHROMA_U ) + uiPartOffset, uiQPartNum * sizeof( UChar ) );
        ::memcpy( m_puhQTTempCbf[2], pcCU->getCbf( TEXT_CHROMA_V ) + uiPartOffset, uiQPartNum * sizeof( UChar ) );
        ::memcpy( m_puhQTTempTransformSkipFlag[0], pcCU->getTransformSkip(TEXT_LUMA)     + uiPartOffset, uiQPartNum * sizeof( UChar ) );
        ::memcpy( m_puhQTTempTransformSkipFlag[1], pcCU->getTransformSkip(TEXT_CHROMA_U) + uiPartOffset, uiQPartNum * sizeof( UChar ) );
        ::memcpy( m_puhQTTempTransformSkipFlag[2], pcCU->getTransformSkip(TEXT_CHROMA_V) + uiPartOffset, uiQPartNum * sizeof( UChar ) );
      }
#if HHI_RQT_INTRA_SPEEDUP_MOD
      else if( dPUCost < dSecondBestPUCost )
      {
        uiSecondBestMode  = uiOrgMode;
        dSecondBestPUCost = dPUCost;
      }
#endif
    } // Mode loop

RQT过程的主要函数为:

xRecurIntraCodingQT( pcCU, uiInitTrDepth, uiPartOffset, bLumaOnly, pcOrgYuv, pcPredYuv, pcResiYuv, uiPUDistY, uiPUDistC, false, dPUCost );
该函数中,倒数第二个参数,主要用于实现是在最大TU时进行,还是在各深度TU进行。

如果要统计各个过程所需的时间,只要调用系统函数clock()即可。即在程序开始前记录时间,结束时记录时间,两者之差就是该过程所需时间了。



  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要下载和安装HM NIS Edit,您需要先准备以下工具和资源: 1. NIS Edit Nullsoft Installation System (NSIS):这是HM NIS Edit所依赖的安装工具。您可以从官方网站或其他可信的软件下载网站获取NSIS的安装程序。 一旦您已经获得了NSIS的安装程序,您可以按照以下步骤下载和安装HM NIS Edit: 1. 打开您的网络浏览器并访问HM NIS Edit的官方网站或其他可靠的软件下载网站。 2. 在网站的搜索栏中输入“HM NIS Edit”。 3. 找到适用于您操作系统的HM NIS Edit下载链接,并单击下载按钮。 4. 下载完成后,找到下载的安装程序文件并双击运行它。 5. 按照安装向导的指示,选择您想要安装HM NIS Edit的目标文件夹和其他设置。 6. 点击“下一步”或“继续”按钮,直到安装完成。 7. 在安装完成后,您可以在系统的开始菜单或桌面上找到HM NIS Edit的快捷方式,双击它即可打开程序。 请注意,具体的安装步骤可能因您的操作系统和下载源的不同而有所差异。确保从官方网站或其他可信的软件下载网站获取安全可靠的HM NIS Edit安装程序。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [使用HM NIS Edit 创建一个简单的脚本打包程序](https://blog.csdn.net/flysh05/article/details/124616168)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [nisedit203-src.zip](https://download.csdn.net/download/wm9028/11838677)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [QT 的打包成一个安装程序 , 其中的问题,和HM Nis Edit 打包成安装程序的时候 没有语言的问题。](https://blog.csdn.net/she666666/article/details/127038569)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值