HM內CU的數據結構

HM是H.265/HEVC的官方參考軟件,H.265是基於塊的混合編碼標準,以CTU爲單位進行四叉樹劃分,H.265中規定最大的CTU爲64x64。在HM中CTU的信息保存在TComDataCU類中,TComDataCU類的定義(定義太長下面列出部分成員)如下:

class TComDataCU
{
private:
​
  // -------------------------------------------------------------------------------------------------------------------
  // class pointers
  // -------------------------------------------------------------------------------------------------------------------
​
  TComPic*      m_pcPic;                                ///< picture class pointer
  TComSlice*    m_pcSlice;                              ///< slice header pointer
​
  // -------------------------------------------------------------------------------------------------------------------
  // CU description
  // -------------------------------------------------------------------------------------------------------------------
  //hm中怎麼保存劃分信息的。參考pCtu->getDepth(i),其中i代表當前CTU劃分爲最小CU的編號。
  //如64*64劃分爲256個4*4。成員變量m_puhDepth[uiIdx]是用來記錄當前CU的深度信息。
  //因此可以判斷出m_puhDepth[uiIdx]是在rpcTempCU中進行處理的。
​
  UInt          m_ctuRsAddr;                            ///< CTU (also known as LCU) address in a slice (Raster-scan address, as opposed to tile-scan/encoding order).
  UInt          m_absZIdxInCtu;                         ///< absolute address in a CTU. It's Z scan order
  UInt          m_uiCUPelX;                             ///< CU position in a pixel (X)
  UInt          m_uiCUPelY;                             ///< CU position in a pixel (Y)
  UInt          m_uiNumPartition;                       ///< total number of minimum partitions in a CU
  UChar*        m_puhWidth;                             ///< array of widths
  UChar*        m_puhHeight;                            ///< array of heights
  UChar*        m_puhDepth;                             ///< array of depths
  Int           m_unitSize;                             ///< size of a "minimum partition"
      SChar*        m_pePartSize;                           ///< array of partition sizes
  SChar*        m_pePredMode;                           ///< array of prediction modes
    ..........
        //省略
}

CTU可以按四叉樹方式遞歸劃分爲子CU,子CU按zig-zag順序遞歸處理,如下圖所示:

 

圖中數字是CU的處理順序。

實際上整個CTU的信息都在TComDataCU類中,且數據僅在CTU中存儲一份,子CU只需指定其在CTU中的位置即可。類中成員變量m_absZIdxInCtu表示子CU在CTU中的位置(zig-zag順序)。

CTU並不是按照二維數組形式表示的,因爲CTU的劃分方式不同,每個部分的深度也不同,所以CTU的“形狀”不同無法用統一的形式表示出來。

爲了使用統一的數據結構簡潔的表示CTU,TComDataCU類將CTU劃分成4x4的小塊,存儲每個小塊的深度。64x64的CTU可以劃分爲256個4x4塊,32x32的CTU可以劃分爲64個4x4塊。

 

上圖是一個32x32的CTU劃分成64個4x4塊的結果,按zig-zag順序掃描。

TComDataCU類中成員m_puhWidth、m_puhHeight、m_puhDepth三個數組存儲了每個4x4小塊的寬、高和深度。

下面是一個真實的64x64CTU劃分示例:

 

上面64x64的CTU包含256個4x4的塊,每個塊對應的寬、高、深如下:

 

因爲四叉樹劃分都是正方形塊,所以寬高一樣。對比m_puhDepth數組和上面的劃分結構可以看出兩者結果一致。(注意:數組是按zig-zag順序輸出的)

HM中提供了兩個數組g_auiZscanToRaster和g_auiRasterToZscan可以進行zig-zag順序和光柵掃描順序間的轉換。

g_auiZscanToRaster[ z-scan index ] = raster scan index
g_auiRasterToZscan[ raster index ] = z-scan index

感興趣的請關注微信公衆號Video Coding

 

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