第一章 前言
第三章 有关 SPS 和 PPS 的一切
第四章 有关 Slice 的一切
第七章 帧间编码
第八章 残差的熵编码: CAVLC 和 CABAC
我们之前的章节里读取和分离到了 AnnexB 格式码流中的 NALU,我们这节课来看一下 NALU 中到底存放了些什么数据。
我们先查阅一下 H.264 描述 NALU 的语法表,我们先看看前三项。
nal_unit( NumBytesInNALunit ) | C | Descriptor |
---|---|---|
forbidden_zero_bit | All | f(1) |
nal_ref_idc | All | u(2) |
nal_unit_type | All | u(5) |
... | ... | ... |
表格的第一列表示句法元素,第二列表示句法元素的分类,第三列表示句法元素的格式,又叫描述子。
我们可以看到,forbidden_zero_bit 占用 1 位,nal_ref_idc 占用 2 位,nal_unit_type 占用 5 位。三个元素一共占用 8 位,也就是一个字节。
禁止位,正常情况下为 0。在某些情况下,如果 NALU 发生丢失数据的情况,可以将这一位置为 1,以便接收方纠错或丢掉该单元。
该元素表示这个 NALU 的重要性。可能的值有 4 个,详情如下表。
nal_ref_idc | 重要性 |
---|---|
3 | HIGHEST |
2 | HIGH |
1 | LOW |
0 | DISPOSABLE |
越重要的 NALU 越不能丢弃。
NALU 的类型。详情如下表。
nal_unit_type | NALU 类型 | |
---|---|---|
0 | 未定义 | |
1 | 非 IDR SLICE | slice_layer_without_partitioning_rbsp( ) |
2 | 非 IDR SLICE,采用 A 类数据划分片段 | slice_data_partition_a_layer_rbsp( ) |
3 | 非 IDR SLICE,采用 B 类数据划分片段 | slice_data_partition_b_layer_rbsp( ) |
4 | 非 IDR SLICE,采用 C 类数据划分片段 | slice_data_partition_c_layer_rbsp( ) |
5 | IDR SLICE | slice_layer_without_partitioning_rbsp( ) |
6 | 补充增强信息 SEI | sei_rbsp( ) |
7 | 序列参数集 SPS | seq_parameter_set_rbsp( ) |
8 | 图像参数集 PPS | pic_parameter_set_rbsp( ) |
9 | 分隔符 | access_unit_delimiter_rbsp( ) |
10 | 序列结束符 | end_of_seq_rbsp( ) |
11 | 码流结束符 | end_of_stream_rbsp( ) |
12 | 填充数据 | filler_data_rbsp( ) |
13 | 序列参数扩展集 | seq_parameter_set_extension_rbsp( ) |
14~18 | 保留 | |
19 | 未分割的辅助编码图像的编码条带 | slice_layer_without_partitioning_rbsp( ) |
20~23 | 保留 | |
24~31 | 未指定 |