xCompressCU()遞歸調用過程

在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比較交換。


(轉自他人,只爲學習)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章