HM在幀內預測中如何指定一幅圖像作爲一個slice,一個CU作爲一個PU的

轉載:點擊打開鏈接

1,如何指定一幅圖像就是一個slice:首先,HM實現slice內CU循環終止的條件就是,判斷下一個預測CU的地址有沒有超過slice的邊界uiBoudingCUAddr,其中slice的邊界也是以CU爲基礎進行定義的,從另一個角度,也就是決定slice是不是一幅圖像,也是以這個CU邊界進行判決的,這個時候還需要另外一個量來做對比,即定義一個變量表示下一個slice開頭的第一個CU的地址startCUAddrSlice,如果這個變量小於uiBoudingCUAddr說明當前的slice只是一幅圖像的一部分,如果這個變量大於或者等於uiBoudingCUAddr,則這個slice就代表一幅圖像。

這時又出現一個問題,HEVC裏面規定了一個slice可以劃分爲幾個sliceSegment,而HM裏面sliceSegment就是整個slice,即沒有對slice進行向下劃分。那這個機制就是怎麼執行的呢?在TEncCfg對象裏,會有一個變量sliceSegmode,這個變量是在compressGOP函數裏的m_pcSliceEncoder->initEncSlice函數裏複製給當前pcSlice對象裏的sliceSegmentmode的,如果sliceSegmentmode爲0,那麼就代表sliceSegment就等同於slice,即不對當前slice進行劃分;如果sliceSegmentmode FIXED_NUMBER_OF_LCU這個事先定義的常數,那麼就代表要對當前slice進行劃分,劃分還是以CU爲單位,即把slice劃分成固定LCU數量的sliceSegment,uiCUAddrIncrement就指定了,一個sliceSegment應該包含多少個LCU,如果最後一個sliceSegment按既定CU數量來劃分超過了本身圖像中LCU的數量,那麼最後一個sliceSegment的終止地址就是圖像的終止地址。這些操作實在compressSlice函數裏開頭的xDeterimineStartBoudingCUAddr函數裏執行的。如下圖所示


2,如何指定當前CU中PU的數目,我們知道,由於CU本身就是遞歸劃分的,所以在幀內預測中,只可能把當前CU劃分成1個或者4個,在不論是rpcTempCU和rpcBestCU對象初始化的過程中,都會把CU分成4x4的小塊來進行初始化,其中有個m_pePartSize成員數組,就是表示把當前的CU劃分成幾個PU,但是初始化時,都會被劃分成SIZE_NONE這個固定常數。而真正對這個成員進行賦值是在xcompressCU函數裏的xCheckRDCostIntra函數裏的rpcTempCU->setPartSizeSubParts函數裏,用eSize進行賦值的。

這時也出現一個問題,eSize是從哪得來的,這個eSize是從外層函數xCheckRDCostIntra函數裏的參數SIZE_2Nx2N複製過來的。而SIZE_2Nx2N又是一個固定常數,從這我們可以看出,HM本身的程序就是固定把CU當成一個PU來預測的,沒有給選擇的程序,當然,我們肯定也可以直接把這個數改成其他固定常數了。SIZE_2Nx2N是一個枚舉類型的量,如下圖所示TypeDef.h裏面


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