H.264 标准语法分析(未完)
本文基于标准文档 T-REC-H.264-202108 进行编写,主要根据标准文档解释说明 NAL 单元的组成结构及各个语法单元的作用
语法函数、描述符规定和表格说明
语法函数和描述符规定查看 H.264 语法函数和描述符规定 文章
表格列说明:
- C 列:表示该语法元素适用的 NAL 单元类型,对应 [NAL unit type 小节中 NAL 单元类型表格的第一列](#NAL unit type), 例如:类别 2 表示编码片数据分区 A,类别 3 表示编码片数据分区 B,类别 4 表示编码片数据分区 C,ALL 表示适用所有类型的 NAL 单元
- Descriptor 列:描述符列,放置该语法元素对应的描述符
NAL unit
NAL 单元由 NAL unit Header 和 RBSP 组成,RBSP(Raw Byte Sequence Payload,原始字节序列载荷),下表中 rbsp_byte
即 RBSP 数据之前的部分都是属于 NAL unit Header
T-REC-H.264-202108 7.3.1 NAL unit syntax
语法元素说明:
forbidden_zero_bit
长度 1 bit,值为 0。若解码器检测 NAL 单元中的 forbidden_zero_bit 为 1 则会丢弃所有字节流数据,直到检测到新的 NAL 单元
nal_ref_idc
长度 2 bit,用来指示当前 NAL 单元的优先级
nal_ref_idc 不等于 0 时,规定 NAL 单元的内容包含一个序列参数集(SPS),或一个序列参数集扩展(SPS extension),或一个子序列参数集(Subset SPS),或一个图像参数集(PPS),或一个参考图片的片,或在参考图片的片之前的带前缀的 NAL 单元(Prefix NAL unit)
一个参考图片的带前缀的 NAL 单元
na l_unit_type 等于 5(IDR) 的 NAL 单元的 nal_ref_idc 不应等于 0;
所有 nal_unit_type 等于 6、9、10、11 或 12 的 NAL 单元其 nal_ref_idc 应等于 0
nal_unit_type
长度 5 bit,表示该 NAL 单元的类型
svc_extension_flag
长度 1 bit,SVC(Scalable Video Coding,可适性视频编码)是传统 H.264/MPEG-4 AVC 编码的延伸,可提升更大的编码弹性,并具有时间可适性(Temporal Scalability)、空间可适性(Spatial Scalability)及信噪比可适性(SNR Scalability)三大特性,使视频传输更能适应在异质的网络带宽
avc_3d_extension_flag
长度 1 bit,与 3D 编码相关
rbsp_byte
rbsp_byte[i] 表示 RBSP 数据的第 i 字节
emulation_prevention_three_byte
防竞争码(0x30),见上文描述
伪代码说明:
NumBytesInNALunit 为该 NAL 单元的大小,单位 byte
1 | // 遍历 NAL 单元的 RBSP 部分,主要的作用是去除防竞争码读取原数据 |
NAL unit type
NAL unit TYPE | 说明及 RBSP 语法结构 | 是否是 VCL(Annex A) |
---|---|---|
0 | 未规定 | non-VCL |
1 | 非 IDR 图像的编码片(Coded slice of a non-IDR picture) slice_layer_without_partitioning_rbsp( ) |
VCL |
2 | 编码片数据分区 A(Coded slice data partition A) slice_data_partition_a_layer_rbsp( ) |
VCL |
3 | 编码片数据分区 B(Coded slice data partition B) slice_data_partition_b_layer_rbsp( ) |
VCL |
4 | 编码片数据分区 C(Coded slice data partition C) slice_data_partition_c_layer_rbsp( ) |
VCL |
5 | IDR 图像的编码片(Coded slice of an IDR picture) slice_layer_without_partitioning_rbsp( ) |
VCL |
6 | 补充增强信息(SEI,Supplemental Enhancement Information),在解码、显示或其它过程中起辅助作用 sei_rbsp( ) |
non-VCL |
7 | 序列参数集(SPS,Sequence Parameter Set),包含解码配置,如:Profile Level、分辨率和帧率等 seq_parameter_set_rbsp( ) |
non-VCL |
8 | 图像参数集(PPS,Picture Parameter Set),包含有关熵编码模式、分片组、运动预测和去块滤波器等 pic_parameter_set_rbsp( ) |
non-VCL |
9 | 访问单元分隔符(AUD,Access Unit Delimiter) access_unit_delimiter_rbsp( ) |
non-VCL |
10 | 序列结束符(End of Sequence) end_of_seq_rbsp( ) |
non-VCL |
11 | 流结束符(End of Stream) end_of_stream_rbsp( ) |
non-VCL |
12 | 填充数据(Filler) filler_data_rbsp( ) |
non-VCL |
13 | 序列参数集扩展(Sequence parameter set extension) seq_parameter_set_extension_rbsp( ) |
non-VCL |
14 | 带前缀的 NAL 单元(Prefix NAL unit) prefix_nal_unit_rbsp( ) |
non-VCL |
15 | 子序列参数集(Subset sequence parameter set) subset_seq_parameter_set_rbsp( ) |
non-VCL |
16 | 深度参数集(Depth parameter set) depth_parameter_set_rbsp( ) |
non-VCL |
17..18 | 保留 | non-VCL |
19 | 未分隔的辅助编码图像的编码片 (Coded slice of an auxiliary coded picture without partitioning) slice_layer_without_partitioning_rbsp( ) |
non-VCL |
20 | 编码片扩展(Coded slice extension) slice_layer_extension_rbsp( ) |
non-VCL |
21 | 深度视图组件或 3D-AVC 纹理视图组件的编码片扩展 (Coded slice extension for a depth view component or a 3D-AVC texture view component) slice_layer_extension_rbsp( ) |
non-VCL |
22..23 | 保留 | non-VCL |
24..31 | 未规定 | non-VCL |
T-REC-H.264-202108 Table 7-1 – NAL unit type codes, syntax element categories, and NAL unit type classes
RBSP
RBSP(Raw Byte Sequence Payload)原始字节序列载荷,是由一串数据比特串(SODB,String Of Data Bits)加上末尾的 trailing bits(使得整个 NAL 单元字节长度是 8 的倍数 )组成,一个 NAL 单元可以包含多个 SODB,如果 SODB 为空(0 bit)则 RBSP 也为空
RBSP trailing bits
大部分的 NAL 单元都只采用下述的 RBSP trailing bits 语法
T-REC-H.264-202108 7.3.2.11 RBSP trailing bits syntax
语法元素说明:
rbsp_stop_one_bit
长度 1bit,总是为 1
rbsp_alignment_zero_bit
长度为 1bit,总是为 0
若 RBSP 的字节的最后 1Byte 的数据为如下所示,前三位(绿色方块 010
)为 SODB 尾部数据,SODB 部分数据只占了该字节的 3 bit,还剩下 5bit 没有使用,此时根据上述语法会在 SODB 数据后的第一位填充 1(stop one bit),在剩余位置填充 0,将该字节填满
NAL unit type 为 1~5、19、20 的 NAL 单元的 trailing bits 语法有些不同,在包含上述的 rbsp_trailing_bits()
语法下,还有额外的逻辑:
T-REC-H.264-202108 7.3.2.10 RBSP slice trailing bits syntax
语法元素说明:
cabac_zero_word
总是为 0x0000
entropy_coding_mode_flag 存储在 PPS 中,可查看 [PPS 语法小节](#PPS RBSP)。当该 NAL 单元所使用的 PPS 中的 entropy_coding_mode_flag 为 1 时,循环判断当前位置是否为 RBSP 的结尾否则插入 cabac_zero_word(0x0000)
SPS RBSP
T-REC-H.264-202108 7.3.2.1 Sequence parameter set RBSP syntax
SPS RBSP 分为两部分 seq_parameter_set_data()
和 rbsp_trailing_bits()
SPS data
T-REC-H.264-202108 7.3.2.1.1 Sequence parameter set data syntax
语法元素说明:
profile_idc
编码时使用的 profile,profile 有 Baseline、Main、Extended 等
constraint_set0_flag
强制使用 Baseline profile 进行编码
constraint_set1_flag
强制使用 Main profile 进行编码
constraint_set2_flag
强制使用 Extended profile 进行编码
constraint_set3_flag
constraint_set4_flag
constraint_set5_flag
reserved_zero_2bits
两个 0bit 的保留位
level_idc
编码时使用的 level,level 主要规定了每秒最多能处理多少个宏块、最大的帧大小、最大的解码缓存、最大比特率等性能相关的特性。如果是硬解。则比较容易出现由于视频 level 太高而不能解码的情况
seq_parameter_set_id
本 SPS 的 ID,这个 ID 主要是给 PPS 使用的
chroma_format_idc
色度取样,取值如下表,表示使用的 YUV 类型,chroma_format_idc 不存在时使用 YUV 4:2:0;monochrome: 单色
separate_colour_plane_flag
bit_depth_luma_minus8
bit_depth_chroma_minus8
qpprime_y_zero_transform_bypass_flag
seq_scaling_matrix_present_flag
seq_scaling_list_present_flag
log2_max_frame_num_minus4
pic_order_cnt_type
log2_max_pic_order_cnt_lsb_minus4
delta_pic_order_always_zero_flag
offset_for_non_ref_pic
offset_for_top_to_bottom_field
num_ref_frames_in_pic_order_cnt_cycle
offset_for_ref_frame
max_num_ref_frames
gaps_in_frame_num_value_allowed_flag
pic_width_in_mbs_minus1
pic_height_in_map_units_minus1
frame_mbs_only_flag
mb_adaptive_frame_field_flag
direct_8x8_inference_flag
frame_cropping_flag
frame_crop_left_offset
frame_crop_right_offset
frame_crop_top_offset
frame_crop_bottom_offset
vui_parameters_present_flag
Scaling list
T-REC-H.264-202108 7.3.2.1.1.1 Scaling list syntax
语法元素说明:
- delta_scale
SPS extension RBSP
T-REC-H.264-202108 7.3.2.1.2 Sequence parameter set extension RBSP syntax
Subset SPS RBSP
T-REC-H.264-202108 7.3.2.1.3 Subset sequence parameter set RBSP syntax
PPS RBSP
T-REC-H.264-202108 7.3.2.2 Picture parameter set RBSP syntax
语法元素说明:
entropy_coding_mode_flag
长度 1 bit,用于表示熵解码的方式。若等于 0 表示使用 Exp-Golomb coded 或 CAVLC,若等于 1 则表示使用 CABAC
SEI RBSP
T-REC-H.264-202108 7.3.2.3 Supplemental enhancement information RBSP syntax
SEI message
T-REC-H.264-202108 7.3.2.3.1 Supplemental enhancement information message syntax
AUD RBSP
T-REC-H.264-202108 7.3.2.4 Access unit delimiter RBSP syntax
End of sequence RBSP
T-REC-H.264-202108 7.3.2.5 End of sequence RBSP syntax
End of stream RBSP
T-REC-H.264-202108 7.3.2.6 End of stream RBSP syntax
Filler data RBSP
T-REC-H.264-202108 7.3.2.7 Filler data RBSP syntax
Slice layer without partitioning RBSP
T-REC-H.264-202108 7.3.2.8 Slice layer without partitioning RBSP syntax
Reference
- 本文标题:H.264 标准语法分析(未完)
- 本文作者:Thomas Woo
- 发布时间:2022-01-02 18:00
- 最后更新:2022-12-12 15:57
- 本文链接:http://smileorigin.site/media/H.264%20%E6%A0%87%E5%87%86%E8%AF%AD%E6%B3%95%E5%88%86%E6%9E%90/
- 版权声明:本博客所有文章除特别声明外,均采用 CC BY 4.0 许可协议。转载请注明出处!