1. H.264简介
MPEG 和 VCEG 联合开发了一个比早期研发的MPEG 和H.263性能更好的视频压缩编码标准,这就是被命名为AVC,也被称为ITU-T H.264 建议和 MPEG-4的第10 部分的标准,简称为H.264/AVC或H.264。2003年3月正式被ITU-T所通过并在国际上正式颁布。为适应高清视频压缩的需求,2004年又增加了FRExt部分;为适应不同码率及质量的需求,2006年又增加了可伸缩编码 SVC。
2. H.264编码格式
H.264支持4:2:0的连续或隔行视频的编码和解码。H.264压缩与H.263、MPEG-4相比,视频压缩比提高了一倍。
H.264的功能分为两层:视频编码层(VCL, Video Coding Layer)和网络提取层(NAL, Network Abstraction Layer)
H.264的功能分为两层:视频编码层(VCL, Video Coding Layer)和网络提取层(NAL, Network Abstraction Layer)
3. H.264传输
H.264的编码视频序列包括一系列的NAL单元,每个NAL单元包含一个RBSP。编码片(包括数据分割片IDR片)和序列RBSP结束符被定义为VCL NAL单元,其余为NAL单元。典型的RBSP单元序列如图1所示。每个单元都按独立的NAL单元传送。单元的信息头(一个字节)定义了RBSP单元的类型,NAL单元的其余部分为RBSP数据。
SPS SEI PPS I片 图像定界符 P片 P片
图1 RBSP序列举例
H.264的编码视频序列包括一系列的NAL单元,每个NAL单元包含一个RBSP。编码片(包括数据分割片IDR片)和序列RBSP结束符被定义为VCL NAL单元,其余为NAL单元。典型的RBSP单元序列如图1所示。每个单元都按独立的NAL单元传送。单元的信息头(一个字节)定义了RBSP单元的类型,NAL单元的其余部分为RBSP数据。
SPS SEI PPS I片 图像定界符 P片 P片
图1 RBSP序列举例
4. H.264 SPS解析
seq_parameter_set_rbsp( ) {
|
C
|
Descriptor
|
profile_idc /*指明所用 profile */
|
0
|
u(8)
|
constraint_set0_flag
|
0
|
u(1)
|
constraint_set1_flag
|
0
|
u(1)
|
constraint_set2_flag
|
0
|
u(1)
|
constraint_set3_flag
|
0
|
u(1)
|
reserved_zero_4bits
/* equal to 0 */
|
0
|
u(4)
|
level_idc /*指明所用 level */
|
0
|
u(8)
|
seq_parameter_set_id /*指明本序列参数集的 id 号,这个id 号将被picture 参数集引用,本句法元素的值应该在[0,31] */
|
0
|
ue(v)
|
if( profile_idc = = 100 | | profile_idc = = 110 | | profile_idc = = 122 | | profile_idc = = 144 ) { |
|
|
chroma_format_idc
|
0
|
ue(v)
|
if( chroma_format_idc = = 3 )
|
|
|
residual_colour_transform_flag
|
0
|
u(1)
|
bit_depth_luma_minus8
|
0
|
ue(v)
|
bit_depth_chroma_minus8
|
0
|
ue(v)
|
qpprime_y_zero_transform_bypass_flag
|
0
|
u(1)
|
seq_scaling_matrix_present_flag
|
0
|
u(1)
|
if( seq_scaling_matrix_present_flag )
|
|
|
for( i = 0; i < 8; i++ ) {
|
|
|
seq_scaling_list_present_flag[
i ]
|
0
|
u(1)
|
if( seq_scaling_list_present_flag[ i ] )
|
|
|
if( i < 6 )
|
|
|
scaling_list( ScalingList4x4[ i ], 16, UseDefaultScalingMatrix4x4Flag[ i ]) |
0
|
|
else
|
|
|
scaling_list( ScalingList8x8[ i – 6 ], 64, UseDefaultScalingMatrix8x8Flag[ i – 6 ] ) |
0
|
|
}
|
|
|
}
|
|
|
log2_max_frame_num_minus4 /*这个句法元素主要是为读取另一个句法元素frame_num 服务*/
|
0
|
ue(v)
|
pic_order_cnt_type
|
0
|
ue(v)
|
if( pic_order_cnt_type = = 0 )
|
|
|
log2_max_pic_order_cnt_lsb_minus4
|
0
|
ue(v)
|
else
if( pic_order_cnt_type = = 1 ) {
|
|
|
0
|
u(1)
| |
offset_for_non_ref_pic
|
0
|
se(v)
|
offset_for_top_to_bottom_field
|
0
|
se(v)
|
num_ref_frames_in_pic_order_cnt_cycle
|
0
|
ue(v)
|
for( i = 0; i < num_ref_frames_in_pic_order_cnt_cycle; i++ )
|
|
|
offset_for_ref_frame[
i ]
|
0
|
se(v)
|
}
|
|
|
num_ref_frames
|
0
|
ue(v)
|
gaps_in_frame_num_value_allowed_flag
|
0
|
u(1)
|
pic_width_in_mbs_minus1
|
0
|
ue(v)
|
pic_height_in_map_units_minus1
|
0
|
ue(v)
|
frame_mbs_only_flag
|
0
|
u(1)
|
if( !frame_mbs_only_flag )
|
|
|
mb_adaptive_frame_field_flag
|
0
|
u(1)
|
direct_8x8_inference_flag
|
0
|
u(1)
|
frame_cropping_flag
|
0
|
u(1)
|
if( frame_cropping_flag ) { /*解码器是否要将图像裁剪后输出,如果是,后面为裁剪的左右上下的宽度 */
|
|
|
frame_crop_left_offset
|
0
|
ue(v)
|
frame_crop_right_offset
|
0
|
ue(v)
|
frame_crop_top_offset
|
0
|
ue(v)
|
frame_crop_bottom_offset
|
0
|
ue(v)
|
}
|
|
|
vui_parameters_present_flag
|
0
|
u(1)
|
if( vui_parameters_present_flag )
|
|
|
vui_parameters( )
|
0
|
|
rbsp_trailing_bits( )
|
0
|
|
}
|
|
|