编码树单元

编码树单元（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）分割。