图像、帧、片、NALU 学习 H.264

http://www.cppblog.com/elva/archive/2011/02/24/140579.html
图像、帧、片、NALU 是学习 H.264 的人常常感到困惑的一些概念,我在这里对自己的理解做一些阐述,欢迎大家讨论:


H.264 是一次概念的革新,它打破常规, 完全没有 I 帧、P帧、B 帧的概念,也没有 IDR 帧的概念。对于 H.264 中出现的一些概念从大到小排序依次是: 序列、图像、片组、片、NALU、宏块、亚宏块、块、像素。这里有几点值得说明:
(1)、在 H.264 协议中 图像是个集合概念,顶 场、底场、帧都可以称为图像(本文图像概念时都是集合概念)。因此我们可以知道,对于 H.264 协议来说,我们平常所熟悉的那些称呼,例如: I 帧、P 帧、B 帧等等,实际上都是我们把图像这个概念具体化和细小化了。我们 在 H.264 里提到的“帧”通常就是指不分场的图像;
(2)、如果 不采用 FMO(灵活宏块排序) 机制,则 一幅图像只有一个片组
(3)、如果 不使用多个片,则一个片组只有一个片
(4)、如果 不采用 DP( 数据分割)机制,则 一个片就是一个 NALU一个 NALU 也就是一个片
否则, 一个片由 三个 NALU 组成(即标准“表7-1”中 nal_unit_type 值为 2、3、4 的 三个 NALU 属于 一个片);
2 编码条带数据分割块A slice_data_partition_a_layer_rbsp( )

3 编码条带数据分割块B slice_data_partition_b_layer_rbsp( )

4 编码条带数据分割块C slice_data_partition_c_layer_rbsp( )
(5)、以上所述的 片和 NALU 的大小关系并不是抽象概念上的从属关系。从概念的 从属关系上来看, NALU其实 又是片的一个集合概念,例如:标准“表7-1”中 nal_unit_type 值为 5 的 NALU 包括 I 片或者 SI 片。

一幅图像根据组成它的片类型来分
,可以分为标准 “表7-5”中的 8 种类型。我们平常应用中所最常见到的 其实是这些类型的特例。例如: 我们平常所谓的“I 帧”和“IDR 帧”,其实是 primary_pic_type 值为 0 的图像,我们平常所谓的“ P帧”其实是 primary_pic_type 值为 1 的图像的特例我们平常所谓的“B帧”其实是 primary_pic_type 值为 2 的图像的特例。

一幅图像根据概念来分可以分为两种
IDR 图像和非 IDR 图像。一幅图像是否是 IDR 图像是由组成该 图像的 NALU 决定的,如果组 成该图像的 NALU 为标准“表7-1”中 nal_unit_type 值为 5 的 NALU,则该 图像为 IDR 图像,否则为 非 IDR 图像。这里也有几点值得说明:
(1)、nal_unit_type 值为 5 的 NALU 只会出现在 IDR 图像中,而 IDR 图像中的所有 NALU 都是nal_unit_type 值为 5 的 NALU;
(2)、我们以组成一 幅图像的片的类型来区分该 图像是否是 IDR 图像是错误的。
例如: 一幅图像中的所有片都是 I 片并不代表这幅图像就是 IDR 图像。因为 I 片也可以从属于 nal_unit_type 值为 1 的 NALU 也即非IDR图像有可能全部包含I片。只不过我们平常最常见到的形式是:所有片都是 I 片的图像就是 IDR 图像。其实这个时候 IDR 图像的概念也被我们具体化和细小化了。 但IDR图像必定全部包含I片或SI片,不过只有用NALU的类型才能判断是不是IDR图像

一幅图像由 1~N 个片组组成,而 每一个片组又由一个或 若干个片组成 一个片由一个NALU或三个NALU(假如有数据分割)组成图像解码过程中总是按照片进行解码,然后按照片组将解码宏块重组成图像。从这种意义上讲, 片实际是最大的解码单元
一个片又包含哪些类型的宏块呢?
标准“表7-10”做了最好的说明。
一个 I 宏块又分为哪些类型呢?
标准“表7-11”做了最好的说明。
一个 P 宏块又分为哪些类型呢?
标准“表7-13”做了最好的说明。
一个 B 宏块又分为哪些类型呢?
标准“表7-14”做了最好的说明。
一个 P 宏块的亚宏块又分为哪些类型呢?
标准“表7-17”做了最好的说明。
一个 B 宏块的亚宏块又分为哪些类型呢?
标准“表7-18”做了最好的说明。

你可能感兴趣的:(图像、帧、片、NALU 学习 H.264)