xCompressCU()递归调用过程

来源:互联网 发布:换手率软件怎么用 编辑:程序博客网 时间:2024/05/17 05:13

在xCompressCU()这个函数里面,一直会见到两个缓存区:rpcBestCU和rpcTempCU。转到xCheckRDCostIntra()里面,实际做预测工作的是estIntraPredQT(),用的都是rpcTempCU。做完预测返回后在最后面有一个xCheckBestMode(),转到里面。


关键的语句就是if( rpcTempCU->getTotalCost() < rpcBestCU->getTotalCost() )。一旦这条语句成立,rpcTemp和rpcBestCU两个缓存区就会交换。

再回到xCompressCU()。体现四叉树子CU划分结构的是for ( UInt uiPartUnitIdx = 0; uiPartUnitIdx < 4; uiPartUnitIdx++ )这个循环区。在这个循环区里面的xCompressCU(),用的是pcSubBestPartCU和pcSubTempPartCU。每预测完一个子CU后,都要执行一次rpcTempCU->copyPartFrom(),即把子CU的最佳预测数据复制到当前CU的Temp里面。

在这个循环区完后,继续往下找,还会发现一个xCheckBestMode()。这个就是决定划分深度的关键。这个函数里面的rpcBestCU代表的就是当前深度的预测数据,rpcTempCU代表的就是4个子CU,也就是下一深度的总预测数据。通过这个函数,就能实现两层深度的预测数据比较,并确定采用哪层深度。

由此总结,每个深度的预测用的都是temp,预测完后跟best比较并交换。best保留作为当前深度的预测数据,而temp再次初始化。在下一深度的4个子CU预测中用的是subtemp,每预测完一个子CU,就跟subbest比较交换,再把subbest的数据复制到已经初始化的temp的相应位置。当temp获取完4个子CU的subbest的数据后,就代表了整个下一深度的数据,这时再与代表当前深度数据的best比较交换。


(转自他人,只为学习)

0 0
原创粉丝点击