編碼樹單元

編碼樹單元（Coding Tree Unit，縮寫：CTU）是H.265/高效率視訊編碼（High Efficiency Video Coding, HEVC）的處理單元。此處理單元類似H.264/高階視訊編碼（Advanced Video Coding, AVC）中的宏區塊（Macroblock）。編碼樹單元的大小可以從16x16到64x64，使用比H.264更大的處理單元得到更好的壓縮效果。

## 介紹

<image>

輸入影像進行編碼前會先切割成相等大小的編碼樹單元再輸入編碼器進行編碼，接著詳細介紹編碼樹單元的相關概念。首先解釋單元（Unit）與區塊（Block），區塊是真正儲存資料的地方，許多區塊加上語法元素組成一個單元。輸入影像採用YUV的格式，所以一個編碼樹單元是由一個亮度（Luma）編碼樹區塊（Coding Tree Block，CTB）、兩個色度（Chroma）編碼樹區塊及語法元素（Syntax Element）。由於輸入影像採用4:2:0的取樣方式，因此亮度編碼樹區塊的大小為色度編碼樹區塊的四倍，如圖一所示。編碼樹單元與AVC的宏區塊最大的不同之為編碼樹單元可以變得更大且大小可以調整，而宏區塊的大小固定為16。HEVC的編碼樹單元支援更大的大小可以讓編碼器對高解析度的影像編碼時更有效率。編碼樹單元的大小定義在序列參數集（Sequence Parameter Set, SPS）內，高效率視訊編碼內支援的大小為LxL，其中L=16、32或64。除了編碼樹單元，高效率視訊編碼（HEVC）中還有另外三種單元分別為編碼單元（Coding Unit, CU）、預測單元（Prediction Unit, PU）及轉換單元（Transform Unit, TU）。下面小節將詳細介紹另外三種單元以及所有單元間的關係。

## 編碼單元

### 基本介紹

編碼樹單元（CTU）可以包含有一個編碼單元（Coding Unit, CU）或是切割成多個較小的編碼單元，如圖二（左）所示。高效率視訊編碼利用編碼單元指出這個單元是利用畫面內預測（Intra Prediction）或是畫面間預測（Inter Prediction）。這些編碼單元可以很方便地利用四分樹（Quadtree）的方式呈現，如圖二（右）所示。四分樹是一種遞迴結構，四分數上的數字表示這個節點是否繼續做分割，若此節點會繼續分割則為1，若不繼續分割則為0。由圖二可看出節點上的數字為0時，此節點為編碼單元。換句話說，在編碼樹內葉子節點（Leaf Node）為編碼單元。編碼樹的順序如圖三左的虛線所示，在編碼單元上採用Z-scan的方式，對編碼樹來說即為。編碼單元的大小支援2Nx2N，其中N=4、8、16或32，因此高效率視訊編碼（HEVC）的四分樹最高深度（Depth）為4。

<image>

下面為編碼單元的簡單語法:

```cpp
coding-tree(x0, y0, log2CbSize, cbDepth){
    split-coding-unit-flag[x0][y0]
    if(split-coding-unit-flag[x0][y0]){
        coding-tree(x0, y0, log2CbSize -1, cbDepth + 1);
        coding-tree(x1, y0, log2CbSize -1, cbDepth + 1);
        coding-tree(x0, y1, log2CbSize -1, cbDepth + 1);
        coding-tree(x1, y1, log2CbSize -1, cbDepth + 1);
    }
    else {
        coding-unit(x0,y0, log2CbSize);
    }
}
```

## 預測單元

### 基本介紹

一個編碼單元（CU）可以根據預測模式的切割類型（Splitting Type）分割成一個、兩個或是四個預測單元（Prediction Units, PUs）。編碼單元與預測單元的不同之處在於預測單元只能被切割一次，而且是基於編碼單元做切割。預測單元是一個預測資訊的呈現區塊，在一個預測單元內使用同預測方式（Prediction Process）。高效率視訊編碼依照不同的預測模式將編碼單元分成三類，分別為以下三種，其分割方法如圖三所示：

- 畫面內編碼單元（Intra Coded CU）：採用的預測方式為使用周圍影像做重建的取樣樣本，即畫面內預測（Intra Prediction）。畫面內編碼單元內僅允許方形（Square）的切割方法，分別為2Nx2N或NxN兩種。
- 畫面間編碼單元（Inter Coded CU）：使用運動補償的方式做預測，即 （Inter Prediction）。畫面間編碼單元允許八種分割方法。

以上八種方法又可分為兩大類。

（a）一為方形與矩形（Square and Rectangular）切割，這種類型的切割方法所產生的區塊皆為對稱的方式，總共含括了其中四種分割，分別為2Nx2N、NxN、2NxN及Nx2N。而另一類（b）分割方式是相對於前一類的對稱方式來說，所有的分割會產生出兩個不對稱的區塊，因此稱為非對稱式（Asymmetric）切割，分別為2NxnU、NxnD、nLx2N及nRx2N（nX：表示較短的邊的位置）。這種非對稱式的切割對於輪廓或是物件邊緣的分割可以達到較好的分割效果，如圖四的Racinghorse範例所示。

- 略過的編碼單元（Skipped CU）：此為畫面間編碼單元的特例，意指移動向量差值（Motion Vector Difference）與殘餘能量（residual energy）皆為零。略過的編碼單元內只允許2Nx2N的方式。

### 限制

預測單元的切割在不同的預測模式有不同的限制，討論如下：

- 畫面內編碼單元（Intra Coded CU）：由於輸入影像是採用YUV4:2:0的影像格式，因此對於亮度（Luma）與色度（Chroma）的切割及大小需要討論。當亮度的畫面內預測的大小為4x4的區塊，由於區塊大小最小為4x4，因此色度區塊不會繼續切割，而繼續使用4x4方式。換句話說，每一個4x4的色度區塊，會對應到4個4x4的亮度區塊。
- 畫面間編碼單元（Inter Coded CU）：為了節省記憶體頻寬，當編碼單元的大小為8x8時，畫面間的編碼單元就不採用NxN的方式做切割，在此即為4x4的區塊大小不會出現。而且不對稱分割的方式，在編碼單元的大小不等於最小時，此種切割方式才是允許的。

## 轉換單元

### 基本介紹

轉換單元是呈現殘量（Residual）或是轉換係數（Transform Coefficients）的區塊，這個區塊主要是做整數轉換（Integer Transform）或是量化（Quantization）。轉換單元（Transform Unit, TU）與預測單元（PU）相似，因為編碼單元可以只有一個轉換單元或是由許多個較小的轉換單元所組成。不同之處為轉換單元可以遞迴地往下繼續分割，也是用四分樹（Quadtree）的方式儲存，而預測單元只能在編碼單元做分割一次。圖五顯示出編碼單元與轉換單元的關係，實線為編碼單元，虛線為轉換單元，虛線的四分樹會長在實線四分樹的葉子節點，這是因為只有實線四分樹的葉子節點是編碼單元。轉換單元內只有支援方形的分割方割（Square Partition），其大小為64、32、16、8、4。

<image>

### 殘量四分樹

轉換單元的編碼樹可以稱為轉換樹（Transform Tree）或是殘量四分樹（Residual Quadtree, RQT）。殘量四分樹可以分成兩類，分別為方形殘量四分樹（Square Residual Quadtree, SRQT）或是非方形殘量四分樹（Nonsquare Residual Quadtree, NSRQT），但是在最後的草案中非方形殘量四分樹（NSRQT）被移除掉。圖六為非方形殘量四分樹的切割方式。

<image>

### 限制

在相同編碼單元（CU）內的預測單元（PU）與轉換單元（TU），轉換單元的大小可以比預測單元的大小還要來的大，在同一個編碼單元內不同預測單元的殘量（Residuals）可以一起被轉換。換句話說，當編碼單元的大小等於轉換單元的大小時，轉換是對整個編碼單元去做轉換而不是對單一的預測單元一個一個做轉換。而這種情況只會出現在畫面間編碼單元（Inter Coded CU）中，因為畫面內編碼單元（Intra Coded CU）總是會造成轉換單元（TU）分割。