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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 遍历 NAL 单元的 RBSP 部分,主要的作用是去除防竞争码读取原数据
for (i = nalUnitHeaderBytes; i < NumBytesInNALunit; i++) {
// 若剩余未读取部分 >= 3 字节且该位置起 3 字节的数据为 0x000003
// 则表示该数据是经过防竞争处理的,读取的时候需要去除该防竞争码
if(i + 2 < NumBytesInNALunit && next_bits( 24 ) == 0x000003) {
// 防竞争处理过的数据,读取 2 字节数据(0x0000 部分),并跳过 1 字节数据(0x03)
rbsp_byte[NumBytesInRBSP++]
rbsp_byte[NumBytesInRBSP++]
i += 2
// 满足防竞争处理条件的数据必定是 0x00000* 格式,处理后的数据为 0x0000030*(* 为 0、1、2、3)
// 直接去除 0x03 得到的 0x00000* 还是跟原数据一致,所以这边直接跳过 0x03,相当于还原原数据
emulation_prevention_three_byte /* equal to 0x03 */
} else
// 非防竞争处理过的数据,读取当前字节数据并继续读取后续数据
rbsp_byte[NumBytesInRBSP++]
}

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

评论

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×