本文共 2047 字,大约阅读时间需要 6 分钟。
H.264编码器输出的Bit流中,每个Bit都隶属于某个句法元素。句法元素被组织成有层次的结构,分别描述各个层次的信息。
H.264分层结构由五层组成,分别是序列参数集、图像参数集、片(Slice)、和宏块和子块。参数集是一个独立的数据单位,不依赖于参数集外的其它句法元素。图2描述了参数集与参数集外的句法元素之间的关系。
图2描述了参数集与参数集外的句法元素之间的关系。
一个参数集不对应某一个特定的图像或序列,同一序列参数集可以被多个图像参数集引用,同理,同一个图像参数集也可以被多个图像引用。只在编码器认为需要更新参数集的内容时,才会发出新的参数集。
在H.264中,图像以序列为单位进行组织。一个序列的第一个图像叫做IDR图像,IDR图像都是I帧。H.264引入IDR图像为了解码的同步。当解码器解码到IDR图像时,立即将参考帧队列清空,将已解码的数据全部输出或抛弃,重新查找参数集,开始一个新的序列。这样,如果前一个序列出现重大错误,在这里可以获得重新同步的机会。IDR图像之后的图像永远不会使用IDR之前的图像的数据来解码。
IDR是I帧,但I帧不一定是IDR。I帧之后的图像有可能会使用I帧之前的图像做运动参考。
描述子描述从Bit流中取出句法元素的方法。
编号 | 语法 | 说明 |
---|---|---|
1 | ae (e) | CABAC |
2 | b (8) | 读进连续的8个Bit |
3 | ce (v) | CAVLC |
4 | f (n) | 读进连续的n个Bit |
5 | i (n)/i (v) | 读进连续的若干Bit,并把它们解释为有符号整数 |
6 | me (v) | 映射指数Golomb熵编码 |
7 | se (v) | 有符号指数Golomb熵编码 |
8 | te (v) | 截断指数Golomb熵编码 |
9 | u (n)/u (v) | 读进连续的若干Bit,并把它们解释为无符号整数 |
10 | ue (v) | 无符号指数Golomb熵编码 |
句法元素的名称由小写字母和一系列下划线组成,变量名称是大小写字母组成,中间没有下划线。
编码器将每个NAL各自独立、完整地放入一个分组,因为分组都有头部,解码器可以方便地检测出NAL的分界,并依次取出NAL进行解码。
每个NAL前有一个起始码 0x000001,解码器检测每个起始码,作为一个NAL的起始标识,当检测到下一个起始码时,当前NAL结束。同时H.264规定,当检测到0x000000时,也可以表征当前NAL的结束。对于NAL中数据出现0x000001或0x000000时,H.264引入了防止竞争机制。如果编码器检测到NAL数据存在0x000001或0x000000时,编码器会在最后个字节前插入一个新的字节0x03,这样:
0x000000->0x00000300
0x000001->0x00000301
0x000002->0x00000302
0x000003->0x00000303
解码器检测到0x000003时,把03抛弃,恢复原始数据。
解码器在解码时,首先逐个字节读取NAL的数据,统计NAL的长度,然后再开始解码。
序列参数集(SPS)用于描述编码器的序列参数。以下是序列参数集的主要内容:
句法 | C | 说明 |
---|---|---|
seq_parameter_set_rbsp() | 0 | |
profile_idc | 0 | |
constraint_set0_flag | 0 | |
constraint_set1_flag | 0 | |
reserved_zero_5bits | 0 | |
level_idc | 0 | |
seq_parameter_set_id | 0 | |
log2_max_frame_num_minus4 | 0 | |
pic_order_cnt_type | 0 | |
delta_pic_order_always_zero_flag | 0 | |
offset_for_ref_frame[i] | 0 | |
num_ref_frames | 0 | |
gaps_in_frame_num_value_allowed_flag | 0 | |
pic_width_inmbs_minus1 | 0 | |
pic_height_in_map_units_minus1 | 0 | |
frame_mbs_only_flag | 0 | |
mb_adaptiv_frame_field_flag | 0 | |
direct_8x8_inference_flag | 0 | |
frame_cropping_flag | 0 | |
frame_crop_left_offset | 0 | |
frame_crop_right_offset | 0 | |
frame_crop_top_offset | 0 | |
frame_crop_bottom_offset | 0 | |
vui_parameters_present_flag | 0 | |
rbsp_trailing_bits() | 0 |
这些参数共同描述了序列的编码参数,确保解码器能够正确解码视频数据。
转载地址:http://yvrfk.baihongyu.com/