HEVC 片与片段(Slice 和Slice Segment)说明

一幅图像可以被分割为一个或多个片(Slice),每个片的压缩数据都是独立的,Slice头信息无法通过前一个Slice的头信息推断得到。这就要求Slice不能跨过它的边界来进行帧内或帧间预测,且在进行熵编码前需要进行初始化。但在进行环路滤波时,允许滤波器跨越Slice的边界进行滤波。除了Slice的边界可能受环路滤波影响外,Slice的解码过程可以不使用任何来自其他Slice的影响,且有利于实现并行运算。使用Slice的主要目的是当数据丢失后能再次保证解码同步。根据编码类型不同,Slice可分为以下几部分。
1 I Slice:该Slice中所有CU的编码过程都使用帧内预测。
2 P Slice:在I Slice的基础上,该Slice中的CU还可以使用帧间预测,每个预测块(PB)使用至多一个运动补偿预测信息。PSlice只使用图像参考列表list0。
3 B Slice:在P Slice的基础上,B Slice中的CU也可以使用帧间预测,但是每个PB可以使用至多两个运动补偿预测信息。B Slice可以使用图像参考列表list0和list1。一个独立的Slice可以被进一步划分为若干SS,包括一个独立SS和若干个依赖SS,并且以独立SS作为该Slice的开始。一个SS包含整数个CTU(至少一个),并且这些CTU分布在同一个NAL单元中。SS可以作为一个分组来传送视频编码数据。其中,独立是指它所涉及的句法元素可以由自身确定,依赖是指它所涉及的某些句法元素由已解码的独立SS推导得到。依赖SS可以共享独立SS携带的一些信息,例如RPS信息、SAO的可用性和加权预测的可用性等。预测过程不能跨越独立Slice的边界,但是可以跨越依赖SS的边界,一个Slice内的SS之间可以相互参考。下面的例子将分别对同一幅图像中的Slice及其所包含的SS做详细说明。例:如下图所示,一幅图像划分为两个Slice。第一个Slice由一个包含4个CTU的独立Slice segment、一个包含32个CTU的依赖SS和另外一个包含24个CTU的依赖SS组成;而第二个Slice由唯一一个包含39个CTU的独立SS组成。下表显示了Slice、独立SS、依赖SS3者之间的关系。

slice层data starts ends axes steps 分别代表什么 slice segment_Slice

H.265/HEVC编码的最高层为SS层,SS层所需要的图像层信息可以通过引用相应的PPS来获得。SS头包含其引用的PPS的标识号,同一幅图像中的所有SS引用同一个PPS。此外,SS头中会存在一些与PPS中相同的参数,SS头中的这些参数值会对PPS中的该参数值进行覆盖。以下部分对H.265/HEVC中SS相关语法语义做详细介绍。

SS的语法元素

slice层data starts ends axes steps 分别代表什么 slice segment_时域_02


end_of_slice_segment_flag:用于判断当前SS是否结束。

end_of_sub_stream_one_bit:取值应改为1。SS头的句法元素

slice层data starts ends axes steps 分别代表什么 slice segment_Slice_03


slice层data starts ends axes steps 分别代表什么 slice segment_帧间预测_04

slice层data starts ends axes steps 分别代表什么 slice segment_帧间预测_05


slice层data starts ends axes steps 分别代表什么 slice segment_时域_06


slice层data starts ends axes steps 分别代表什么 slice segment_算法_07


slice层data starts ends axes steps 分别代表什么 slice segment_算法_08


slice层data starts ends axes steps 分别代表什么 slice segment_算法_09


first_slice_segment_in_pic_flag:表示按照解码顺序,当前SS是否为第一个SS。no_output_of_prior_pics_flag:在IDR和BLA图像解码之后该语法元素会影响解码图像缓冲器中已解码图像的输出。

slice_pic_parameter_set_id:表示当前Slice所引用的PPS的ID号。dependent_slice_segment_flag:表示当前SS是否依赖SS。slice_segment_address:对一幅图像的CTU进行光栅扫描后,当前SS中第一个CTU的地址。

slice_reserved_flag[i]:其值和语义保留,供ITU-T及ISO/IEC将来使用。解码器应该忽略该句法元素的值。

slice_type:指明Slice的编码类型。其值为0,表示该Slice是B Slice;其值为1,表示该Slice是P Slice;其值为2,表示该Slice是I Slice。

pic_outputf_lag:该句法元素影响解码图像的输出和移除过程。

colour_plane_id:当separate_colour_plane_flag为1时,该语法元素规定了彩色平面。其值为0,1,2时,分别对应着Y,Cb,Cr。

slice_pic_order_cnt_Isb:规定了当前图像的POC与MaxPicOrderCntLsb取模后的值,用于计算当前图像的POC值。

short_term_ref_pic_set_sps_flag:其值为1,表示当前图像的短期参考图像集可以通过SPS中的句法结构st_ref_pic_set()得出;其值为0,则表示当前图像的短期参考图像集可通过Slice头中的句法结构st_ref_pic_set()得出。当num_short_term_ref_pic_sets取值为0时,short_term_ref_pic_set_sps_flag应该等于0。

short_term_ref_pic_set_idx:表示当前图像使用哪一个短期参考图像集(由当前激活的SPS中指定)。

num_long_term_sps:表示当前图像的长期参考图像(在当前激活的SPS中指定)的数目。

num_long_term_pics:表示当前图像的长期参考图像(在Slice头中指定)的数目。

It_idx_sps[i]:表示当前图像的第i个长期参考图像在候选长期参考图像列表中的索引号。

poc_Isb_It[i]:表示当前图像的第i个长期参考图像的POC值与MaxPicOrderCntLsb取模之后的值。

used_by_curr_pic_It_flag[i]:表示当前图像长期参考图像集中第i个参考图像是否可以用做当前图像的参考。

delta_poc_msb_present_flag[i]:表示delta_poc_msb_cycleIt[i]是否存在。delta_poc_msb_cycleIt[i]:用于计算当前图像的第i个长期参考图像的POC值(长期参考图像包括两部分一SPS和Slice头中分别指定的长期参考图像,该句法元素中的delta表示任一部分中相邻两个长期参考图像的poc_msb_cycle_It的差值)。slice_temporal_mvp_enabled_flag:表示帧间预测是否使用时域MV预测。slice_sao_luma_flag:表示当前Slice的亮度分量是否使用SAO。slice_sao_chroma_flag:表示当前Slice的色度分量是否使用SAO。num_ref_idx_active_override_flag:表示当前Slice中语法元素的num_ref_idx_l0_active_minus1和num_ref_idx_l1_active_minus1是否存在。num_ref_idx_I0_active_minus1:表示可能用于解码当前Slice的参考图像list0中的最大参考索引值,其取值范围为[0,14]。

num_ref_idx_I1_active_minus1:表示可能用于解码当前Slice的参考图像list1中的最大参考索引值,其取值范围为[0,14]。

mvd_l1_zero_flag:其值为1表示mvd_coding(x0,y0,1)未被解析,且对于compIdx=0.1,MvdL1[x0][y0][compIdx]被设为0;其值为0表示mvd_coding(x0,y0,1)已被解析。

cabac_init_flag:规定在上下文变量的初始化过程中,是否使用初始化表。collocated_from_l0_flag:规定用于时域MV预测的collocated图像来自参考图像列表list0还是listl。

collocated_ref_idx:规定用于时域MV预测的collocated图像的参考索引号。five_minus_max_num_merge_cand:指定MVP候选点可合并的最大数目。slice_qp_delta:规定当前Slice中CB可使用的的量化参数Qpy。slice_cb_qp_offset:该语法元素值加上变量pps_cb_qp_offset的值即为量化参数变量Qp’cb的值。

slice_cr_qp_offset:该语法元素值加上变量pps_cr_qp_offset的值即为量化参数Qp’cr的值。

deblocking_filter_override_flag:表示Slice头是否存在去方块滤波参数。slice_deblocking_filter_disabled_flag:表示当前Slice是否使用去方块滤波。该语法元素不存在时,可推测出其值等于pps_deblocking_filter_disabled_flag。slice_beta_offset_div2和slice_tc_offset_div2:用于获取当前Slice的去方块滤波补偿参数β和tC。该两个语法元素不存在时,可推测出其值分别等于pps_beta_offset_div2和pps_tc_offset_div2。slice_loop_filter_across_slices_enabled_flag:表示环路滤波是否可以跨越当前Slice的上边界和左边界。该语法元素不存在时,可推测出其值等于pps_loop_filter_across_slices_enabled_flag。

num_entry_point_offsets:表示Slice头中句法元素entry_point_offset_minus1[i]的数目。

offset_len_minus1:表示句法元素entry_point_offset_minus1[i]的比特长度。entry_point_offset_minus1[i]:规定第i个entry point的以字节为单位的偏移量。

slice_segment_header_extension_length:表示SS头扩充数据的长度。slice_segment_header_extension_data_byte:可以是任意值,解码器忽略该语法元素。在该版本中,其值不影响解码。

摘自《新一代高效视频编码 H.265/HEVC:原理、标准与实现》 万帅 杨付正 编著