H265/HEVC:VPS参数集
转载自:https://blog.csdn.net/Dillon2015/article/details/104142144/
HEVC在H.264/AVC的基础上引入了视频参数集(Video Parameter Set,VPS)。这样HEVC共定义了3类参数集:视频参数集(Video Parameter Set,VPS)、序列参数集(SequenceParameter Set,SPS)、图像参数集(Picture Parameter Set,SPS)。
在一个HEVC码流中,前三个NALU分别是VPS NALU、SPS NALU、PPS NALU。这三类参数集的NALU可以独立解码而不需要参考码流中其他NALU。每一类参数集都包含扩展机制,允许在将来的HEVC版本中扩展这个参数集而不会破坏向后兼容性。
VPS用于传送应用于多层和子层视频编码所需的信息,提供了整个视频序列的全局性信息。一个给定的视频序列的每一层都参考同一个VPS,无论它们SPS是否相同。
VPS语法元素
HEVC中定义了VPS的各个语法元素及描述子,如下表所示。描述子即语法元素的熵解码算法,描述子定义如下:
ae(v):CABAC编码。
b(8):读进连续的8比特。
f(n):读进连续的n比特。
se(v):有符号指数哥伦布编码。
u(n):读进连续的n比特,且它们解码后为无符号整数。
ue(n):无符号指数哥伦布编码。
上面描述子括号中参数为n时,表示该语法元素是定长编码,参数为v时表示该语法元素是变长编码。
上表定义了VPS的语法元素,前7条语法元素采用定长编码,共4个字节,方便解码器读取,这7条语法元素包括VPS识别符,相关可用层及可用时域子层的信息。
跟随前4个字节后的语法元素包括:比特流中解码器工作的可用操作点信息。一个操作点的特性由使用的Profile、tier和level刻画。它定义了解码比特流所需的编码工具,以及对比特流尺寸或缓存容量的限制。跟在整个比特流操作点指标后的是比特流时域子层的操作点指标。
vps_video_parameter_set_id:当前VPS标识符,供PPS引用。
vps_base_layer_internal_flag 和 vps_base_layer_available_flag:
-
如果vps_base_layer_internal_flag=1且vps_base_layer_available_flag=1,码流中存在base layer。
-
否则,如果vps_base_layer_internal_flag=0且vps_base_layer_available_flag=1,base layer由本规范未规定的外部手段提供。
-
否则,如果vps_base_layer_internal_flag=1且vps_base_layer_available_flag=0,不存在base layer,但是VPS中包含base layer的信息就像其存在于码流中一样。
-
否则,如果vps_base_layer_internal_flag=0且vps_base_layer_available_flag=0,不存在base layer,但是VPS中包含base layer的信息就像其由本规范未规定的外部手段提供一样。
vps_max_layers_minus1:该值加1表示参考这个VPS的CVS(Coded Video Sequence)的最多允许的层数。为了保持码流的一致性,当vps_base_layer_internal_flag=0时vps_max_layers_minus1应该大于0。在本规范中vps_max_layers_minus1应该小于63。vps_max_layers_minus1=63留给将来扩展使用。
vps_max_sub_layers_minus1:该值加1表示参考这个VPS的CVS的最多允许的时域子层数。vps_max_sub_layers_minus1 值应该在0~6间,即最多支持7个时域子层。
vps_temporal_id_nesting_flag:当vps_max_sub_layers_minus1=0时,该参数为1;当vps_max_sub_layers_minus1大于0时,这个参数用于指定是否对帧间预测进行额外限定。该参数用于指定时域子层升档,即从低子层切换到高子层。
vps_reserved_0xffff_16bits:两字节保留位,其值等于0xFFFF。
vps_sub_layer_ordering_info_present_flag:vps_sub_layer_ordering_info_present_flag=1表示vps_max_dec_pic_buffering_minus1[ i ],vps_max_num_reorder_pics[ i ] 和vps_max_latency _increase_plus1[ i ]作用于vps_max_sub_layers_minus1 + 1 子层。
vps_sub_layer_ordering_info _present_flag=0表示vps_max_dec_pic_buffering_minus1[ vps_max_sub_layers_minus1 ],vps_max_num_reorder_pics[ vps_max_sub_layers_minus1 ]和vps_max_latency_increase_plus1[ vps_max_sub_layers_minus1 ] 作用于所有子层。
当vps_base_layer_internal_flag=0时,vps_sub_layer_ordering_info _present_flag=0且解码器应该忽略该字段。
vps_max_dec_pic_buffering_minus1[ i ]:规定了HighestTid=i时,CVS的图像存储单元中解码图像所需的最大缓存。
vps_max_num_reorder_pics[ i ] :规定了HighestTid=i时,在CVS中解码顺序在某一幅图像之后,而显示顺序在该图像前的图像最大数量。
vps_max_latency_increase_plus1[ i ] :当HighestTid=i时,该语法元素用于计算VpsMaxLatency Pictures[i]的值。
当vps_max_latency_increase_plus1[ i ]不等于0时,VpsMaxLatencyPictures[ i ] =vps_max_num_reorder_pics[i]+vps_max_latency_increase_plus1[ i ]-1。
vps_max_layer_id:指定参考该VPS的所有CVS中的NALU的nuh_layer_id的最大值。
vps_num_layer_sets_minus1:指定VPS中层集(layer set)的数量,该值在0~1023间。
layer_id_included_flag[ i [ j] :该语法元素为1时,表示图层标识列表 LayerSetLayerIdList[ i ]中包含nuh_layer_id=j的情况;该语法元素为0时,表示图层标识列表 LayerSetLayerIdList[ i ]中不包含nuh_layer_id=j的情况;
NumLayersInIdList[ 0 ]=1且LayerSetLayerIdList[0][0]=0
,NumLayersInIdList[i]和 LayerSetLayerIdList[ i ]由下面方式生成。
-
n=0
-
for(m=0;m<=vps_max_layer_id;m++)
-
if(layer_id_included_flag[i][m])
-
LayerSetLayerIdList[i][n++]=m
-
NumLayersInIdList[i]=n
vps_timing_info_present_flag :该语法元素为1时,表示在VPS中语法元素vps_num_units_in_tick、vps_time_scale、vps_poc_proportional_to_timing_flag和vps_num_hrd_parameters存在;该语法元素为0时VPS中不存在这4个语法元素。
vps_num_units_in_tick:该语法元素规定当时钟频率为vps_time_scale Hz时所花的时间单位个数。以秒为单位时,一个时钟周期等于vps_num_units_in_tick除以vps_time_scale 。例如,当一个视频的帧率为25Hz时,vps_time_scale 等于27000000Hz,vps_num_units_in_tick就等于1080000,因此一个时钟周期就是0.04秒。
vps_time_scale:一秒内时间单位的个数。
vps_poc_proportional_to_timing_flag:该语法元素为1时,表示CVS在每幅图像(不包括第一幅图像)的POC与它的显示时间和第一幅图像的显示时间的比值成正比;否则,不成比例。
vps_num_ticks_poc_diff_one_minus1:表示POC之间差值为1时,时钟周期的数目。
vps_num_hrd_parameters:指定VPS RBSP中语法结构体hrd_parameters()的数目。
hrd_layer_set_idx[ i ]:指定第i个语法结构体hrd_parameters()使用的图层集的索引。
cprms_present_flag[ i ] :表示第i个hrd_parameters()中是否存在所有子层公用的HRD参数。
vps_extension_flag:该语法元素取0时,表示在VPS RBSP中没有语法元素vps_extension_data_flag。
vps_extension_data_flag:可以为任意值。在该版本中,解码器忽略该语法元素。
感兴趣的请关注微信公众号Video Coding
上一篇: ovs-dpdk实践(1)--链路测试
推荐阅读