一个slice语法由slice header和slice data构成,slice header表示该slice的基本语法,slice data则存放了该slice中所有宏块的数据。
slice header语法结构
first_mb_in_slice:
表示该slice的第一个宏块在图像中的位置。一个图像可能分为多个slice单独编码,因此可以通过first_mb_in_slice确定该slice是否为一个完整的图像。
1)如果MbaffFrameFlag 等于 0, 也就是该slice不是mbaff,则first_mb_in_slice 表示该slice的第一个宏块位置。first_mb_in_slice 的数值范围是 0 到 PicSizeInMbs − 1。
2)否则(该slice是mbaff),first_mb_in_slice * 2 是该slice的第一个宏块位置, 也就是第一个宏块对的顶场宏块。此时 first_mb_in_slice 的数值范围是 0 到 PicSizeInMbs / 2 − 1。
slice_type
表示slice的类型
pic_parameter_set_id
表示该slice对应的PPS参数,通过pps_id可以找到对应的PPS。
frame_num
表示当前帧序号,每个IDR的frame_num会清零。
field_pic_flag
表示当前slice是否为场格式。
当前slice是否为mbaff由该语法推导:
MbaffFrameFlag = ( mb_adaptive_frame_field_flag && !field_pic_flag )
bottom_field_flag
表示该slice是否为底场
pic_order_cnt_lsb、delta_pic_order_cnt_bottom、delta_pic_order_cnt
这几个语法元素用于该slice的POC计算,具体计算方式可参考POC计算方式
direct_spatial_mv_pred_flag
表示B slice中B_Direct和B_Skip宏块 mv 预测方式,因此只有B slice才由该语法。
direct_spatial_mv_pred_flag等于1表示使用空域direct预测方式;
等于0表示使用时域direct预测
num_ref_idx_active_override_flag
PPS中编码了当前slice的前向、后向参考帧个数num_ref_idx_l0_active_minus1和num_ref_idx_l1_active_minus1,num_ref_idx_active_override_flag=1,表示该slice的前向后向参考帧个数与PPS中的元素不一样,需要重新编码。
否则,不需要重新编码,直接使用PPS中的值。
cabac_init_idc
用于该slice的 cabac 初始化。
对于I slice,cabac初始化不需要该元素,所以不编码该语法。
slice_qp_delta
表示该slice的qp偏移量
当前slice Y分量qp计算方式如下:SliceQPY = 26 + pic_init_qp_minus26 + slice_qp_delta
disable_deblocking_filter_idc
表示是否使用deblocking。
0:开启去块滤波功能,去块滤波需要对整个图像(包括多个slice)执行。
1:关闭去块滤波功能。
2:开启去块滤波功能,但是滤波只能对同一个slice范围内的宏块执行。比如图像分为slice1和slice2,如果slice2的宏块2与slice1的宏块1相邻,则两个宏块的相邻边不需要滤波。
slice_alpha_c0_offset_div2、slice_beta_offset_div2
滤波要用到的参数
ref_pic_list_reordering( )
表示参考帧队列重排序语法。具体排序过程可参考参考帧队列重排序
dec_ref_pic_marking( )
表示参考帧标记过程,用于确定参考帧队列中的帧是短期参考、长期参考还是不用于参考帧。具体过程参考解码参考标记
pred_weight_table( )
表示帧间预测权重。帧间预测使用的每一个参考帧的YUV分量都可能对应一个权重,获取预测块时需要乘以该权值