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