pic_parameter_set_rbsp( ) {
// pic_parameter_set_id 用以指定本参数集的序号,该序号在各片的片头被引用。
pic_parameter_set_id
// seq_parameter_set_id 指明本图像参数集所引用的序列参数集的序号。
seq_parameter_set_id
// entropy_coding_mode_flag 指明熵编码的选择,本句法元素为0时,表示熵编码使用 CAVLC,本句法元素为1时表示熵编码使用 CABAC
entropy_coding_mode_flag
// pic_order_present_flag POC 的三种计算方法在片层还各需要用一些句法元素作为参数,本句法元素等于1时表示在片头会有句法元素指明这些参数;本句法元素等于0时,表示片头不会给出这些参数,这些参数使用默认值
pic_order_present_flag
// num_slice_groups_minus1 本句法元素加1后指明图像中片组的个数。H.264 中没有专门的句法元素用于指明是否使用片组模式,当本句法元素等于0(即只有一个片组),表示不使用片组模式,后面也不会跟有用于计算片组映射的句法元素。
num_slice_groups_minus1
if( num_slice_groups_minus1 > 0 ) {
/* slice_group_map_type 用以指明片组分割类型。
map_units 的定义:
- 当 frame_mbs_only_flag 等于1时,map_units 指的就是宏块
- 当 frame_mbs_only_flag 等于0时
- 帧场自适应模式时,map_units 指的是宏块对
- 场模式时,map_units 指的是宏块
- 帧模式时,map_units 指的是与宏块对相类似的,上下两个连续宏块的组合体。 */
slice_group_map_type
if( slice_group_map_type = = 0 )
for( iGroup = 0; iGroup <= num_slice_groups_minus1; iGroup++ )
// run_length_minus1[i] 用以指明当片组类型等于0时,每个片组连续的 map_units 个数
run_length_minus1[ iGroup ]
else if( slice_group_map_type = = 2 )
for( iGroup = 0; iGroup < num_slice_groups_minus1; iGroup++ ) {
// top_left[i],bottom_right[i] 用以指明当片组类型等于2时,矩形区域的左上及右下位置。
top_left[ iGroup ]
bottom_right[ iGroup ]
}
else if( slice_group_map_type = = 3 | |
slice_group_map_type = = 4 | |
slice_group_map_type = = 5 ) {
// slice_group_change_direction_flag 与下一个句法元素一起指明确切的片组分割方法。
slice_group_change_direction_flag
// slice_group_change_rate_minus1 用以指明变量 SliceGroupChangeRAte
slice_group_change_rate_minus1
} else if( slice_group_map_type = = 6 ) {
// pic_size_in_map_units_minus1 在片组类型等于6时,用以指明图像以 map_units 为单位的大小。
pic_size_in_map_units_minus1
for( i = 0; i <= pic_size_in_map_units_minus1; i++ )
// slice_group_id[i] 在片组类型等于6时,用以指明某个 map_units 属于哪个片组。
slice_group_id[ i ]
}
}
// num_ref_idx_l0_active_minus1 加1后指明目前参考帧队列的长度,即有多少个参考帧(包括短期和长期)。值得注意的是,当目前解码图像是场模式下,参考帧队列的长度应该是本句法元素再乘以2,因为场模式下各帧必须被分解以场对形式存在。(这里所说的场模式包括图像的场及帧场自适应下的处于场模式的宏块对) 本句法元素的值有可能在片头被重载。
在序列参数集中有句法元素 num_ref_frames 也是跟参考帧队列有关,它们的区别是num_ref_frames指明参考帧队列的最大值,解码 器用它的值来分配内存空 间;num_ref_idx_l0_active_minus1 指明在这个队列中当前实际的、已存在的参考帧数目,这从它的名字“active”中也可以看出来。图像时,并不是直接传送该图像的编号,而是传送该图像在参考帧队列中的序号。这个序号并不是在码流中传送的,这个句法元素是 H.264 中最重要的句法元素之一,编码器要通知解码器某个运动矢量所指向的是哪个参考而是编码器和解码器同步地、用相同的方法将参考图像放入队列,从而获得一个序号。这个队列在每解一个图像,甚至是每个片后都会动态地更新。维护参考帧队列是编解码器十分重要的工作,而本句法元素是维护参考帧队列的重要依据。参考帧队列的复杂的维护机制是 H.264 重要也是很有特色的组成部分
num_ref_idx_l0_active_minus1
num_ref_idx_l1_active_minus1
// weighted_pred_flag 用以指明是否允许P和SP片的加权预测,如果允许,在片头会出现用以计算加权预测的句法元素。
weighted_pred_flag
// weighted_bipred_flag 用以指明是否允许 B 片的加权预测,本句法元素等于 0 时表示使用默认加权预测模式,等于 1 时表示使用显式加权预测模式,等于 2 时表示使用隐式加权预测模式。
weighted_bipred_idc
// pic_init_qp_minus26 加 26 后用以指明亮度分量的量化参数的初始值。在 H.264 中,量化参数分三个级别给出:图像参数集、片头、宏块。在图像参数集给出的是一个初始值。
pic_init_qp_minus26 /* relative to 26 */
pic_init_qs_minus26 /* relative to 26 */
// chroma_qp_index_offset 色度分量的量化参数是根据亮度分量的量化参数计算出来的,本句法元素用以指明计算时用到的参数。
chroma_qp_index_offset
// deblocking_filter_control_present_flag 编码器可以通过句法元素显式地控制去块滤波的强度,本句法元素指明是在片头是否会有句法元素传递这个控制信息。如果本句法元素等于 0,那些用于传递滤波强度的句法元素不会出现,解码器将独立地计算出滤波强度。
deblocking_filter_control_present_flag
// constrained_intra_pred_flag 在 P 和 B 片中,帧内编码的宏块的邻近宏块可能是采用的帧间编码。当本句法元素等于 1 时,表示帧内编码的宏块不能用帧间编码的宏块的像素作为自己的预测,即帧内编码的宏块只能用邻近帧内编码的宏块的像素作为自己的预测;而本句法元素等于 0 时,表示不存在这种限制。
constrained_intra_pred_flag
// redundant_pic_cnt_present_flag 指明是否会出现 redundant_pic_cnt 句法元素。
redundant_pic_cnt_present_flag
rbsp_trailing_bits( )
}
// pic_parameter_set_id 用以指定本参数集的序号,该序号在各片的片头被引用。
pic_parameter_set_id
// seq_parameter_set_id 指明本图像参数集所引用的序列参数集的序号。
seq_parameter_set_id
// entropy_coding_mode_flag 指明熵编码的选择,本句法元素为0时,表示熵编码使用 CAVLC,本句法元素为1时表示熵编码使用 CABAC
entropy_coding_mode_flag
// pic_order_present_flag POC 的三种计算方法在片层还各需要用一些句法元素作为参数,本句法元素等于1时表示在片头会有句法元素指明这些参数;本句法元素等于0时,表示片头不会给出这些参数,这些参数使用默认值
pic_order_present_flag
// num_slice_groups_minus1 本句法元素加1后指明图像中片组的个数。H.264 中没有专门的句法元素用于指明是否使用片组模式,当本句法元素等于0(即只有一个片组),表示不使用片组模式,后面也不会跟有用于计算片组映射的句法元素。
num_slice_groups_minus1
if( num_slice_groups_minus1 > 0 ) {
/* slice_group_map_type 用以指明片组分割类型。
map_units 的定义:
- 当 frame_mbs_only_flag 等于1时,map_units 指的就是宏块
- 当 frame_mbs_only_flag 等于0时
- 帧场自适应模式时,map_units 指的是宏块对
- 场模式时,map_units 指的是宏块
- 帧模式时,map_units 指的是与宏块对相类似的,上下两个连续宏块的组合体。 */
slice_group_map_type
if( slice_group_map_type = = 0 )
for( iGroup = 0; iGroup <= num_slice_groups_minus1; iGroup++ )
// run_length_minus1[i] 用以指明当片组类型等于0时,每个片组连续的 map_units 个数
run_length_minus1[ iGroup ]
else if( slice_group_map_type = = 2 )
for( iGroup = 0; iGroup < num_slice_groups_minus1; iGroup++ ) {
// top_left[i],bottom_right[i] 用以指明当片组类型等于2时,矩形区域的左上及右下位置。
top_left[ iGroup ]
bottom_right[ iGroup ]
}
else if( slice_group_map_type = = 3 | |
slice_group_map_type = = 4 | |
slice_group_map_type = = 5 ) {
// slice_group_change_direction_flag 与下一个句法元素一起指明确切的片组分割方法。
slice_group_change_direction_flag
// slice_group_change_rate_minus1 用以指明变量 SliceGroupChangeRAte
slice_group_change_rate_minus1
} else if( slice_group_map_type = = 6 ) {
// pic_size_in_map_units_minus1 在片组类型等于6时,用以指明图像以 map_units 为单位的大小。
pic_size_in_map_units_minus1
for( i = 0; i <= pic_size_in_map_units_minus1; i++ )
// slice_group_id[i] 在片组类型等于6时,用以指明某个 map_units 属于哪个片组。
slice_group_id[ i ]
}
}
// num_ref_idx_l0_active_minus1 加1后指明目前参考帧队列的长度,即有多少个参考帧(包括短期和长期)。值得注意的是,当目前解码图像是场模式下,参考帧队列的长度应该是本句法元素再乘以2,因为场模式下各帧必须被分解以场对形式存在。(这里所说的场模式包括图像的场及帧场自适应下的处于场模式的宏块对) 本句法元素的值有可能在片头被重载。
在序列参数集中有句法元素 num_ref_frames 也是跟参考帧队列有关,它们的区别是num_ref_frames指明参考帧队列的最大值,解码 器用它的值来分配内存空 间;num_ref_idx_l0_active_minus1 指明在这个队列中当前实际的、已存在的参考帧数目,这从它的名字“active”中也可以看出来。图像时,并不是直接传送该图像的编号,而是传送该图像在参考帧队列中的序号。这个序号并不是在码流中传送的,这个句法元素是 H.264 中最重要的句法元素之一,编码器要通知解码器某个运动矢量所指向的是哪个参考而是编码器和解码器同步地、用相同的方法将参考图像放入队列,从而获得一个序号。这个队列在每解一个图像,甚至是每个片后都会动态地更新。维护参考帧队列是编解码器十分重要的工作,而本句法元素是维护参考帧队列的重要依据。参考帧队列的复杂的维护机制是 H.264 重要也是很有特色的组成部分
num_ref_idx_l0_active_minus1
num_ref_idx_l1_active_minus1
// weighted_pred_flag 用以指明是否允许P和SP片的加权预测,如果允许,在片头会出现用以计算加权预测的句法元素。
weighted_pred_flag
// weighted_bipred_flag 用以指明是否允许 B 片的加权预测,本句法元素等于 0 时表示使用默认加权预测模式,等于 1 时表示使用显式加权预测模式,等于 2 时表示使用隐式加权预测模式。
weighted_bipred_idc
// pic_init_qp_minus26 加 26 后用以指明亮度分量的量化参数的初始值。在 H.264 中,量化参数分三个级别给出:图像参数集、片头、宏块。在图像参数集给出的是一个初始值。
pic_init_qp_minus26 /* relative to 26 */
pic_init_qs_minus26 /* relative to 26 */
// chroma_qp_index_offset 色度分量的量化参数是根据亮度分量的量化参数计算出来的,本句法元素用以指明计算时用到的参数。
chroma_qp_index_offset
// deblocking_filter_control_present_flag 编码器可以通过句法元素显式地控制去块滤波的强度,本句法元素指明是在片头是否会有句法元素传递这个控制信息。如果本句法元素等于 0,那些用于传递滤波强度的句法元素不会出现,解码器将独立地计算出滤波强度。
deblocking_filter_control_present_flag
// constrained_intra_pred_flag 在 P 和 B 片中,帧内编码的宏块的邻近宏块可能是采用的帧间编码。当本句法元素等于 1 时,表示帧内编码的宏块不能用帧间编码的宏块的像素作为自己的预测,即帧内编码的宏块只能用邻近帧内编码的宏块的像素作为自己的预测;而本句法元素等于 0 时,表示不存在这种限制。
constrained_intra_pred_flag
// redundant_pic_cnt_present_flag 指明是否会出现 redundant_pic_cnt 句法元素。
redundant_pic_cnt_present_flag
rbsp_trailing_bits( )
}