H265的CU划分 hm16.9

注:hm中CU的划分在函数xcompressCU(rpcBestCU,rpcTempCU,....)中进行,本篇博客主要记载hm中的划分原理,假设只划分两个深度分别为0和1,且只考虑帧内预测。由于具体过程已经有很多大神介绍了,所以这里只是记载一些本人在学习的过程中任务比较难理解的地方。

  1. 深度为0:xcompressCU(rpcBestCU[0],rpcTempCU[0],....),对象rpcTempCU[0]是要进行预测,量化,变换,熵编码的对象,rpcBestCU[0]用来保存当前深度最优的情况。   帧内预测入口函数为checkRDcostIntra(rpcBestCU[0],rpcTempcu[0],...),该函数在最后一步会有个函数xCheckBestMode,该函数会将rpcTempCU[0]->gettotalcost()与rpcBestCU[0]->gettotalcost()进行比较,后者代价初始化为一个很大值,若前者的代价更小则进行一次替换。
  2. 四叉树划分,深度为1:注意这里  rpcBestcu[1],rpcTempcu[1]都有一个初始化过程,因此这里的 rpcBestcu[1]一定为当前块的代价。​​​​​​​​​​​​​​​​​​​​​                              第一块:checkRDcostIntra(rpcBestcu[1],rpcTempcu[1],...),这里面的对象rpcBestcu[1]保存当前块的最优的最优情况,为继续划分做服务,本篇假设不再划分。       第二块,第三块,第四块:处理过程和第一块一致。
  3.  将四个小块的代价进行叠加,在rpcTempCU[0->]copyPartFrom中执行。因此rpcTempCU[0]->gettotalcost指的是四个小块的总代价。
  4. 比较rpcTempCU[0]->gettotalcost和rpcBestCU[0]->gettotalcost,若前者小则进行替换。
  5. 问题:hm中怎么保存划分信息的。参考pCtu->getDepth(i),其中i代表当前CTU划分为最小CU的编号。如64*64划分为256个4*4。成员变量m_puhDepth[uiIdx]是用来记录当前CU的深度信息。因此可以判断出m_puhDepth[uiIdx]是在rpcTempCU中进行处理的。

猜你喜欢

转载自blog.csdn.net/qq_27942333/article/details/87918047