【H2645】H.264的宏块和H.265的编码树单元总结

一、H.264宏块

1、什么是宏块?

先看下面两张图,就能大体知道宏块指的是哪了。
【H2645】H.264的宏块和H.265的编码树单元总结_第1张图片
【H2645】H.264的宏块和H.265的编码树单元总结_第2张图片
将连续几帧图像分为一组(GOP)在H264中称为一个序列(sequence);
将每帧图像(Frame)划拉几道分成片(slice);
将每片(slice)按照16x16的大小横着竖着划拉成宏块(Maroblock);
将宏块(Maroblock)再划拉成4块,每块大小8x8,称为子块。
还有一个的概念,注意和子块做区分:图像首先划分成4x4大小的块,也就是说宏块包含整数个4x4的块。H.264编码时主要以4×4为单位转换,偶尔以8×8转换。

2、详解宏块

宏块是编码处理的基本单元,由多个块组成,通常宏块大小为16X16像素,宏块根据所在片(slice)的类型粗分为I、B、P宏块,宏块类型用mb_type表示,相同数值的mb_type在不同类型的slice中表示的类型会不一样。

mb_type

根据mb_type的值是否等于I_PCM,整个解析方法分为两大类:PCM类型和非PCM类型。
详细类型说明参见:h.264宏块与子宏块类型
当这个宏块为I_PCM模式时,宏块中以差分编码的形式保存宏块原始的像素值。此时存在如下几个语法元素:
pcm_alignment_zero_bit:填充位,用比特0来填充直到按字节对齐;
pcm_sample_luma:256个亮度分量的差分像素值;
pcm_sample_chroma:若干个色度分量的差分像素值,实际数量由码流的颜色格式指定。例如对于最常用的4:2:0格式的视频,共有128个色度像素值。

mb_pred

宏块预测的语法结构,宏块预测与子宏块预测的语法结构是相斥的,一个宏块的组成结构要么采用的是宏块预测的结构,要么4个子宏块都是子宏块的预测结构。

sub_mb_pred

子宏块预测的语法结构,子宏块为8x8大小的宏块,也就是说一个宏块有4个子宏块,在这个语法结构的内部会进行4次子宏块预测。

coded_block_pattern

语法元素常简称做cbp,用于表示当前宏块内的4个8×8子块编码对其中的哪个的残差系数进行编码。值得注意的是该语法元素仅仅在宏块为非I_16x16模式时才存在,因为在I_16x16模式时cbp的有关信息已经在mb_type中体现。

mb_qp_delta

表示宏块层的量化参数偏移值,取值范围为[-26, 25]。我们在前面已经在PPS中获取了整个序列的量化参数初始值(由pic_init_qp_minus26计算),在slice header中获取slice层的量化参数偏移slice_qp_delta,因此每一个slice第一个宏块的量化参数可通过下面的公式计算:
QP=pic_init_qp_minus26 + 26 + slice_qp_delta + mb_qp_delta

residual

像素残差编码的语法结构

二、H.265编码树单元

1、什么是编码树单元?

先看下图:H.264宏块和H.265编码单元的对比
【H2645】H.264的宏块和H.265的编码树单元总结_第3张图片
H.264的宏块大小固定,一般为16x16;
H.265的编码单元尺寸可以被设置为64×64、32×32或16×16。

2、编码树单元详解
CTU

CTU(Coding Tree Unit,编码树单元),每个编码树单元可以被递归分割,利用四叉树结构,分割为32×32、16×16、8×8的子区域,下图就是一个64×64编码树单元的分区示例。
【H2645】H.264的宏块和H.265的编码树单元总结_第4张图片

CTB

CTB(Coding Tree Block,编码树块),一个编码树单元(CTU)包含了同一位置处的一个亮度编码树块(CTB)和两个色度编码树块(CTB),以及一些相应的语法元素。如图所示,根据CTU大小可以为16X16,32X32,64X64,则亮度CTB的大小也可以是16X16,32X32,64X64,并且始终与CTU的大小相对应,此处亮度CTB大小为64X64,色度为32X32。
【H2645】H.264的宏块和H.265的编码树单元总结_第5张图片

CU

CU(Coding Unit,编码单元), 每一个CTU,可以进一步均匀划分成4个正方形CU,一个CU又可以递归按四叉树结构划分成4个小的CU,最大深度为3,如下图所示:
【H2645】H.264的宏块和H.265的编码树单元总结_第6张图片
CU块是进行决策帧间、帧内、Skip/Merge模式的基本单元。
视频序列的分辨率(长和宽参数)也会在SPS中传输,要求长宽必须是mininum CU size的整数倍,但是可以不是 CTU size的整数倍。对于长宽不是CTU size整数倍的情况,图像边界处的CTU被认为已经分割成和图像边界重合,对于这种边界处默认的分割,不需要传输split_cu_flags标志。

CB

CB(Coding Block,编码块),编码树块CTB可以直接作为一个编码块CB,也可以进一步以四叉树的形式划分为多个小C的编码块CB,因此CB的大小是可以变化的,在设置CTU大小为64X64的情况下,一个亮度CB最大为64X64即一个CTB直接作为一个CB,最小为8X8,则色度CB最大为32X32,最小为4X4。大的CB可以使得平缓区域的编码效率大大提高,在细节部分采用小的CB又可以使复杂的图像预测更加准确。一个亮度CB和两个色度CB,以及一些相关语法元素共同组成一个编码单元(CU).如图:
【H2645】H.264的宏块和H.265的编码树单元总结_第7张图片

PU

PU(Prediction Unit,预测单元),PU规定了编码单元的所有预测模式,包含了一切于预测相关的信息,如帧内预测方向、帧间预测的分割方式、运动矢量预测,以及帧间预测参考图像索引号等。PU是进行预测的基本单元。不同预测方式下,PU的划分见下图:
【H2645】H.264的宏块和H.265的编码树单元总结_第8张图片

PB

PU(Prediction Block,预测块),一个预测单元PU包含一个亮度预测块PB和两个色度预测块PB。
【H2645】H.264的宏块和H.265的编码树单元总结_第9张图片

TU

TU(Transform Unit,变换单元), 一个CU可以递归按照四叉树结构划分成TUs,CU作为四叉树的root,如下图表示一个CU划分成TUs的结构:
【H2645】H.264的宏块和H.265的编码树单元总结_第10张图片
TU由亮度TB和两个色度TB及相应的语法元素组成,TU是进行变换和量化的基本单元。
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。

TB

TU(Transform Block,变换块),一个变换单元TU包含一个亮度变换块TB和两个色度变换块TB。
【H2645】H.264的宏块和H.265的编码树单元总结_第11张图片
HEVC可以支持4X4到32X32的编码变换,基本单元为变换单元(TU).变换单元的大小依赖于CU模式,一个CU内部,可以允许TU跨越多个PU,以四叉树的形式地柜划分。大块的TU可以使能量更好的集中,小块的的TU可以保留更多的细节,灵活的分割方式。

3、CTU、CU、PU、TU的关系
CTU和CU

一幅图像根据编码器设置的CTU大小,可以划分为若干个互不重叠的CTU,在CTU内部,采用基于四叉树的循环分层结构。同一层次上的编码单元具有相同的分割深度。一个CTU可以值包含一个CU即没有进行划分,也可以被划分为多个CU。

CU和PU、TU

每个CU包含着与之相关联的预测单元(PU)和我变换单元(TU).

对于一个2NX2N的CU模式:
帧内预测单元的可选模式有两种2NX2N和NXN;
帧间预测模式则有8种,4种对称模式2NX2N,NXN,NX2N,2NXN,4种非对称模式2NXnU,2NXnD,nLX2N,nRX2N(其中U,D,L表示上下左右四个方向),其中nLX2N,nRX2N为左右1:3,3:1的比率划分,2NXnU,2NXnD为以上下1:3,3:1的比率划分。
还有一种模式为skip模式,是帧间预测的一种,当需要编码的运动信息只有运动参数集索引(采用运动合成技术),编码残差信息不需要编码。

你可能感兴趣的:(视频,H.265,H.264)