第三章 (4)【HEVC简介】CTU、CU、PU、TU结构

参考文献:见《High Efficiency Video Coding (HEVC)》Block Structures and Parallelism Features in HEVC章节

 CTU

 CTU:coding tree unit,编码树单元,LCU
        对于YUV=420格式的彩色视频:一个CTU由一个CTB of the luma samples 、2个CTBs of the chroma samples和相关的语法元素组成。Luma CTB是一个2^N  x 2^N的像素区域,而相应的Chroma CTB是2^(N-1) x 2^(N-1)的像素区域,N的值在编码器中确定,并在SPS(sequence parameter set)中传输。N可选4,5,6;表示CTU的大小可取16X16、32X32、64X64。
       CTU相当于H.264中的MarcoBlock划分图片的概念,是在编码过程中的独立编码单位,然后可以递归划分成CU。

CTU是HEVC处理视频帧的基本单位,取代了H.264中的宏块(Macroblock)。

  • 作用:作为一帧图像划分的起点和编码处理的入口。编码器会依次处理图像中的每一个CTU。
  • 大小:在序列参数集(SPS)中指定,可以是16x16、32x32或64x64的亮度像素块。
  • 结构:一个CTU包含一个亮度CTB和对应的两个色度CTB。它是一棵四叉树的根节点。

CTU 尺寸是在 SPS 中定义的全局参数,其作用域是整个视频序列或一个 GOP。

对于使用同一个 SPS 的所有帧,CTU 尺寸是严格固定、不能改变的。一帧内的所有 CTU 尺寸也完全相同。

在整个码流的生命周期中,可以通过发送新的 SPS改变后续帧的 CTU 尺寸以及其他编码参数。这种改变通常发生在关键帧(IDR 帧)上。

CU

CU 是从 CTU 通过四叉树(Quadtree)结构划分而来的。它是进行预测和变换模式决策的核心单元。

  • 作用:决定使用何种预测方式(帧内/帧间)和变换方式。编码器会根据率失真优化(RDO)原则来决定一个 CU 是否需要继续分裂。
  • 划分:一个大的 CU (例如 64x64) 可以被划分为 4 个更小的 CU (4个 32x32)。这个过程可以递归进行,直到达到最小 CU 尺寸(如 8x8)。
    • 如果一个 CU 不再分裂,它就成为一个叶子节点(Leaf CU)
    • 图像内容平坦的区域倾向于使用大的 CU,而细节和纹理丰富的区域则倾向于分裂成小的 CU。
  • 尺寸:从 64x64 到 8x8。
  • 关键点CU 是承载 PU 和 TU 的容器。一旦 CU 的划分确定,就在这个叶子 CU 的基础上进行 PU 和 TU 的划分。
CU:coding unit,编码单元
        每一个CTU,可以进一步均匀划分成4个square CUs,一个CU又可以递归按四叉树结构划分成4个小的CUs。对于YUV=420的彩色视频:一个CU由一个CB of the luma samples、2个CBs of the choma samples和相关的语法元素。一个Luma CB是2^N x 2^N(此处的N与CTU中的N大小不同)的像素区域,而相应的choma CB是2^(N-1) x 2^(N-1)的像素区域,N的值同样在编码器中确定,并在SPS中传输。
        编码时,在CTU level,通过传输split_cu_flags标志指明CTU是否进一步划分成四个CU。类似地,对于一个CU,也通过一个split_cu_flags标志指明是否进一步划分成子CU。CU通过split_cu_flags标志指示进行递归的划分,直到split_cu_flags==0或者达到最小的CU尺寸(mininum CU size),对于达到最小尺寸的CU,不需要传输split_cu_flags标志,CU的最小尺寸参数(通过CTU深度确定)在编码器中确定,并在SPS中进行传输。
        所以CU的大小范围是:minunum size CU ~CTU,一般情况设置CTU为64,最小CU为8(通过CTU深度确定),所以此时CU大小可取8、16、32、64。一个CTU进行编码时,是按照深度优先的顺序进行CU编码,类似于z-scan,如下图:右边表示CTU的递归四叉树划分,左边表示CTU中CU的编码顺序。
图3.4将64×64编码树单元(CTU)划分为8×8至32×32亮度样本的编码单元(CU)的示例。分割可以用四叉树来描述,也称为编码树,如右图所示。数字表示CU单元的编码顺序
       

视频序列的分辨率(长和宽参数)也会在SPS中传输,要求长宽必须是mininum CU size的整数倍,但是可以不是 CTU size的整数倍。对于长宽不是CTU size整数倍的情况,图像边界处的CTU被认为已经分割成和图像边界重合(the  CTUs at the borders are inferred to be split until the boundaries of the resulting blocks coincide with the picture boundary),对于这种边界处默认的分割,不需要传输split_cu_flags标志。  

        CU块是进行决策帧间、帧内、Skip/Merge模式的基本单元。

 PU

PU:prediction unit,预测单元

PU 定义了在一个 CU 内部,如何进行预测操作。每个叶子 CU 都会根据其预测模式被划分为一个或多个 PU。

  • 作用:PU 是预测信息(如帧内预测模式、帧间预测的运动矢量MV和参考帧索引)的基本单位。同一个 CU 内的所有 PU 共享相同的预测类型(Intra 或 Inter)。
  • 划分:PU 的划分方式非常灵活,这对于精确描述运动特别重要。
    • 帧内预测 (Intra Prediction):PU 划分通常比较简单,主要是 2Nx2NNxN(仅当CU为最小尺寸时)。
    • 帧间预测 (Inter Prediction):PU 划分方式非常丰富,包括对称和非对称的划分:
      • 2Nx2N:整个 CU 作为一个 PU。
      • 2NxN, Nx2N:对称划分。
      • NxN:对称划分(仅当CU为2Nx2N时)。
      • 2NxnU, 2NxnD:非对称划分(上下)。
      • nLx2N, nRx2N:非对称划分(左右)。

PU 的划分不影响 TU 的划分。它们是基于同一个 CU 的两种不同维度的划分

        在CU level决定prediction mode,并将一个CU的prediction mode传输在bitstream中。而PU是是进行预测的基本单元,有一个PB of the luma、2个PB of the choma和相应的语法元素组成。
 
如果一个CU的prediction mode是intra prediction(帧内预测):
        对于luma CU:有35个可选的帧内预测方向(Plannar(0)、DC(1)和方向预测(2~34)),对于mininum size的luma CB,可以平均划分成4个方形的subblocks,对于每个subblock进行独立的帧内预测,有独立的intra prediction mode。也就是说对于帧内预测的CU,可以进行2Nx2N和NxN两种PU划分模式,且NxN模式只有对mininum size CB可以使用。
        一个帧内luma PU块,预测模式确定之后,需要对预测模式进行编码。HEVC中在进行帧内预测模式编码时,先为每个intra PU确定3个最可能模式(确定策略后面介绍),假设为S={M1,M2,M3}。然后通过判断luma PU的帧内预测模式是否在S中,如果在S中,则需要2bit编码预测模式在S中的索引,否则需要5bit编码预测模式在另外32种模式中的索引。
        对于luma PU,确定最可能3个预测模式是根据当前PU左边和上边的预测模式,假设左边和上边的预测模式分别是A和B,如果左边或上边PU不是帧内预测模式或是PCM模式,则A或B为DC;另外,如果上边PU块不在当前CTU内,那么B也为DC。确定好A和B之后:
        当A=B时,如果A,B都大于2,即A和B都不是Planar或DC,那么:
            M1=A;
            M2=2+((A-2-1+32)%32)
            M3=2+((A-2+1)%32)
       当A=B时,如果A,B至少有一个小于2,即A或B是Planar或DC,那么:
            M1=Planar,M2=DC,M3=26(竖直方向预测)
       当A!=B时,M1=A,M2=B,对于M3按照下面规则决定:
            如果A和B都不是Planar,那么M3=Planar;
            如果A和B都不是DC,那么M3=DC;
            否则,说明{A,B}={Planar,DC},那么M3=26。
       对于choma luma:有5个可选的帧内预测方向(Planar/0、DC/1、Vertical/26、Horizontal/10和luma PU的预测方向)。对于预测模式的编码,通过0表示luma PU的预测方向,100、111、101和110分别表示Planar/0、DC/1、Vertical/26和Horizontal/10。
       另外,在进行帧内预测时,如果CU是mininum size CU,且将CU划分成4个PU时,那么要保证TU小于等于PU,如下图:表示一个8x8的CU块分成4个PU,那么必须分成四个4x4的TU块,至于每个TU是否进一步划分成更小的TU不作限定,只根据正常TU划分的条件判断。这是为了提高intra预测的精确度。图a表示如果CU不化成4个TU,那么intra预测的距离就会较远。图b则表示了将CU划分成4个TU,这时候预测右边的小PU时,左边的PU已经预测完成,并进行了变换和重建,可以保证预测距离更近。
如果一个CU的prediction mode是inter prediction(帧间预测):
        对于inter PU,luma PB和choma PBs拥有相同的PU划分模式和motion parameters(包括运动估计方向数目(1/2),参考帧索引,和对每个运动估计方向的运动矢量MV)。HEVC中有8中PU划分模式(2Nx2N、NxN、2个SMP和4个AMP),如下图所示:
        对于NxN模式,只有mininum size CU可以使用,且8x8CU不能使用。
        对于AMP模式,只有32x32和16x16的CU可以使用,8x8和64x64的CU不能使用,所以inter PU的最小尺寸为8x4和4x8,这是因为TU最小尺寸为4x4,进行变换的最小单元也是4x4。另外,HEVC可以在SPS中通过一个syntax禁用AMP。
        从H.262到HEVC过程中,PU的可选大小变化如下图:
如果一个CU的prediction mode是Skip:
        那么PU的划分模式只能是2N x 2N。
        PS:对于4x8和8x4,HEVC规定只能用单向预测,不能用双向预测。
                在HM1中,实际可以通过inter_4x4_enabled_flag(在SPS中)指示是否使用4x4的PU。

 TU

TU:transform unit,变换单元

TU 定义了在 CU 内部,如何对预测后的残差数据进行变换和量化

  • 作用:TU 是进行离散余弦变换(DCT)或离散正弦变换(DST)以及量化的基本单位。
  • 划分:与 CU 类似,TU 也是基于四叉树结构进行划分的。这个 TU 四叉树的根节点就是 CU 本身。编码器可以决定不划分(TU 尺寸等于 CU 尺寸),或者递归地将一个大 TU 划分为 4 个小 TU。
  • 尺寸:从 32x32 到 4x4。
  • 关键点:TU 的四叉树划分嵌套在 CU 内部,且独立于 PU 的划分。大尺寸的 TU 适合平坦区域的低频残差,而小尺寸的 TU 适合复杂区域的高频残差。
    对于是进行变量的单元,一个CU可以递归按照四叉树结构划分成TUs,CU作为四叉树的root,如下图表示一个CU划分成TUs的结构:
        CU划分成TUs中,TU的大小范围取决于max TU size、min TU size和max TU depth三个参数决定,这三个参数在SPS level进行传输。max TU size为5表示最大TU是32x32,min TU size为2表示最小TU是4x4。max depth为3表示CU划分成TU最多划分成3层(如上图10、11、12、13就在第3层)。对于intra predition,要确保PU大于等于TU(即TU不跨多个intra PU),而inter predition没有相应的限制。
        另外,对于一个CU,最多有一个trasform tree syntax,所以一个CU的luma CB 和choma CBs拥有相同的TU划分。但是除了对于8x8的luma CB划分成4x4的TB时,4x4的choma CBs不会划分成2x2的TB。
 

CTU,CTB,CU,CB的关系

Unit (单元) 指的是一个处理和决策的逻辑概念,它包含了语法元素;

Block (块) 指的是与该单元对应的实际像素数据

  • CTU (编码树单元)
    • 这是一个逻辑概念。它是编码和解码过程中的一个基本处理单元。
    • 它是一个容器,包含了与这块图像区域相关的所有语法元素和决策信息,例如 CU 的划分方式(分裂标志)、预测模式、运动矢量、量化后的系数等等。
    • CTU 是 CU 四叉树的根节点
  • **CTB:
    • 这是一个数据概念。它指的是 CTU 所对应的实际像素块
    • 一个 CTB 包含一个亮度(Luma)CTB 和两个色度(Chroma)CTB(在 4:2:0 采样格式下)。例如,一个 64x64 的 CTU 对应一个 64x64 的亮度 CTB 和两个 32x32 的色度 CTB。
    • 你可以把它想象成是上述 class 实例中指向一块内存的指针,这块内存里存着 uint8_t 类型的像素值。
    • 关系:解码器处理一个 CTU,是为了正确地重建它所对应的 CTB 像素数据。

简单来说:CTU 是对 CTB 进行处理的指令集和容器。


CB 是一个更通用的概念。

  • CU (编码单元):是一个逻辑单元,是通过 CTU 四叉树划分得到的。
  • CB (编码块):与 CU 对应的实际像素数据块就是CB。

所以,CTU 和 CTB 的关系,与 CU 和 CB 的关系是完全一样的。CTB 其实是 CB 的一个特例,当一个 CU 的尺寸等于 CTU 的尺寸时(也就是在四叉树的根节点上),它对应的 CB 就被称为 CTB。

关系链

  • 一个 CTU 对应一个 CTB。
  • 这个 CTU可以分裂成 4 个子 CU。
  • 这 4 个子CU 每一个都对应一个自己的 CB。
  • 这 4 个 CB 在空间上组合起来,就构成了父节点 CU 对应的那个 CB (也就是 CTB)。

PU、PB与TU、TB也是类似:

  • PU (Prediction Unit):预测单元,是进行预测操作的逻辑单元,包含运动矢量、参考帧索引等语法信息

  • PB (Prediction Block):预测块,是 PU 对应的像素数据块。解码器根据 PU 中的信息,从参考帧中取出预测块 PB,或者通过邻近像素生成预测块 PB。

  • TU (Transform Unit):变换单元,是进行变换和量化的逻辑单元,包含量化后的变换系数等语法信息

  • TB (Transform Block):变换块,是 TU 对应的残差数据块。解码器对 TB 进行反量化和反变换,得到重建的残差。

CTU,CU,PU,TU的关系

核心关系

  1. 一帧图像被划分为多个 CTU
  2. 每个 CTU 作为一个根节点,通过四叉树分裂成一个 CU 的层级结构。
  3. 树的叶子节点,即不再分裂的 CU,是进行具体编码决策的单元。
  4. 在每个叶子 CU 内部,会进行两种独立的划分:
    • 划分为一个或多个 PU,用于进行预测。
    • 划分为一个或多个 TU(通过另一个四叉树),用于对残差进行变换。

一个 64x64 的 CTU 开始的划分过程:

+---------------------------------------------------------------+
| CTU (64x64)                                                   |
|  = Root CU (64x64)                                            |
|                                                               |
|  +---------------------------+---------------------------+    |
|  | CU_0 (32x32)              | CU_1 (32x32)              |    |
|  | (Leaf CU, 不再分裂)        |                           |    |
|  |                           |                           |    |
|  +---------------------------+---------------------------+    |
|  | CU_2 (32x32)              | CU_3 (32x32) -> SPLIT     |    |
|  |                           | +-----------+-----------+ |    |
|  |                           | |CU_3_0(16) |CU_3_1(16) | |    |
|  |                           | +-----------+-----------+ |    |
|  |                           | |CU_3_2(16) |CU_3_3(16) | |    |
|  |                           | +-----------+-----------+ |    |
|  +---------------------------+---------------------------+    |
+---------------------------------------------------------------+
             |
             |
             V (我们放大看左上角的 CU_0 这个叶子节点)

+---------------------------+
| Leaf CU (32x32)           |
+---------------------------+
             |
             +--------------------------------------+
             | (Prediction Partitioning)            | (Transform Partitioning)
             V                                      V
+---------------------------+          +---------------------------+
| PU Partitioning           |          | TU Partitioning (Quadtree)  |
| (例如: Inter, 2NxN模式)     |          | (例如: 分裂一次)            |
|                           |          |                           |
| +-----------------------+ |          | +-----------+-----------+ |
| |      PU_A (32x16)     | |          | | TU (16x16)| TU (16x16)| |
| | (拥有自己的MV和ref_idx) | |          | +-----------+-----------+ |
| +-----------------------+ |          | | TU (16x16)| TU (16x16)| |
| |      PU_B (32x16)     | |          | +-----------+-----------+ |
| | (拥有自己的MV和ref_idx) | |          |                           |
| +-----------------------+ |          |                           |
+---------------------------+          +---------------------------+
 
posted @ 2024-05-06 14:10  luckylan  阅读(857)  评论(0)    收藏  举报