2

H.264 探索 第二部分 H264码流格式

原文地址

前言

先前的话题是关于色彩模型,以及如何存储像素色彩数据的。现在是时候去更深了解H.264码流格式,并找到这些像素的数据。
图片描述

NAL

显然,解码器接收一个特定的格式的比特序列,并进行操作。二进制流是结构化的,由packets组成。在上层,流由NAL-packets组成,并具有以下形式:

NAL-packets流

NAL表示Network Abstraction Layer(网络抽象层)的缩写。

packet结构如下图

NAL-packet 结构

NAL-packet的第一个字节是一个包含关于packet的类型信息的报头。

表1中描述了所有可能的数据包类型。

Type Definition
0 Undefined
1 Slice layer without partitioning non IDR
2 Slice data partition A layer
3 Slice data partition B layer
4 Slice data partition C layer
5 Slice layer without partitioning IDR
6 Additional information (SEI)
7 Sequence parameter set
8 Picture parameter set
9 Access unit delimiter
10 End of sequence
11 End of stream
12 Filler data
13..23 Reserved
24..31 Undefined

NAL类型定义了当前NAL-packet数据结构。它可以是slice,parameter set,filler等等。
如从图中可以看出, NAL-packet的有效载荷被定义为RBSP(Raw Byte Sequence Payload)。
RBSP描述了一行被定义为SODB(String Of Data Bits)的字节集。所以RBSP包含SODB。
根据ITU-T规范,如果SODB为空(0比特长度),RBSP也为空。
RBSP的第一字节(最显著,最左边)包含八位SODB; RBSP的下一个字节应该也包括以下八个SODB等等,直到有少于8位SODB。接着是一个停止位和均衡位(如下图)

Raw Byte Sequence Payload (RBSP)

SLICE

现在,让我们更进一步查看我们的比特流:

Detailed H.264 stream

任何已编码图片都包含slice(切片),slice包含macroblocks(宏块)。大多数情况下,一个已编码图像对应于一个切片。此外,一个图像可以有多个切片。所述切片被分为以下类型:

Type Description
0 P-slice. Consists of P-macroblocks (each macro block is predicted using one reference frame) and / or I-macroblocks.
1 B-slice. Consists of B-macroblocks (each macroblock is predicted using one or two reference frames) and / or I-macroblocks.
2 I-slice. Contains only I-macroblocks. Each macroblock is predicted from previously coded blocks of the same slice.
3 SP-slice. Consists of P and / or I-macroblocks and lets you switch between encoded streams.
4 SI-slice. It consists of a special type of SI-macroblocks and lets you switch between encoded streams.
5 P-slice.
6 B-slice.
7 I-slice.
8 SP-slice.
9 SI-slice.

看起来像上表包含了一些冗余数据,但事实并非如此:
类型5 - 9意味着当前图像的所有其他切片将是同一类型。正如你所看到的每个切片都由header和data组成。切片头包含了关于切片类型,切片宏块的类型,切片帧的数量的信息。当然切片头也包含了参照帧的设置(the reference frame settings)和量化参数(quantification parameters)的信息。最好,我们来查看切片data,这是储存像素数据的地方。宏块是信息的主要载体,因为它们包含将对应于单个像素的亮度和色度分量的集合。无需进入细节可以得出结论,不考虑细节可以得出的结论是,视频解码最终可以简化为从比特流中对宏块的搜索和提取,以及后续借助亮度和色度分量对像素颜色的恢复。宏块组成如下图:

Macroblock

在这里,我们有宏块类型,预测类型(这是下一文章的主题),编码块模式(Coded Block Pattern),量化参数(Quantization Parameter )(如果我们有CPB),最后数据(data):亮度和色度分量的集合。


cppprimer
180 声望5 粉丝

引用和评论

0 条评论