H.264 SPS/PPS成员值含义

一、sequence_parameter_set_rbsp_t结构体内成员及用途

1. unsigned
profile_idc: 它指的是码流对应的profile.
    1.1 基线profile(Baseline profile)
      
 遵循基线profile的码流应该遵循以下的约束:
     
  a) 只有I和P切片存在
     
  b) NAL单元流不应该有范围在2到4的nal_unit_type值,包括2和4.
     
  c) 序列参数集(sps)的frame_mbs_only_fag(之后介绍)应该等于1
     
  d) 图象参数值(psp)的weighted_pred_flag和weighted_bipred_idc都应该为0
     
  e) 图象参数值(psp)的entropy_coding_mode_flag应该等于0
       
 f) 图象参数值(psp)的num_slice_groups_minus1应该在0到7之间,包括0和7
         g)
对于基线profile对应的level度应该满足.
       
符合基线profile的码流的profile_idc被赋66.符合一定level的基线Baseline的解码器应该可以解码所有的profile_idc等于66的码流或constrained_set0_flag(等会介绍)为1而且level_idc(在level部
分介绍)少于或等于一个指定的level的码流。
    1.2 主profile(Main profile)
      
 符合主profile的码流应该遵循以下的约束:
       
 a) 只有I,P,B切片存在.
     
  b) NAL单元流不包括nal_unit_type值范围在2-4之内的值。包括2和4.
     
  c) 不能允许有随意顺序的切片
     
  d) 图像参数集(psp)的num_slice_groups_minus1应该只为0
     
  e) 图像参数集(psp)的redundant_pic_cnt_present_flag应该只为0
     
  f) 对于主profile所要求的level级需要达到。
     
  符合主profile的码流的profile_idc应为77。符合指定level的主profile的解码器应该可以解码所有的profile_idc为77的或constrained_set1_flag值为1且level_idc值小于或等于指定level的码流。

  1.3 扩展profile(Extended profile)
      
 符合扩展profile的码流应该遵循以下的约束:
     
  a) 序列参数集的direct_8x8_inference_flag值应该为1
     
  b) 图像参数集的entropy_coding_mode_flag值应该为0
     
  c) 图像参数集的num_slice_groups_minus1的值范围为0到7,包括0和7
     
  d) 对于扩展profile指定的level级应该被达到
     
 符合指定level级的扩展profile的解码器可以解码所有的profile_idc值为88的或
constrained_set2_flag值为1的,而且level_idc小于等于指定level级的码流。
    
  符合指定level级的扩展profile的解码器可以解码所有的profile_idc值为66的或 constrained_set0_flag值为1的,而且level_idc小于等于指定level级的码流。
  2. constrained_set0_flag
  
 当constrained_set0_flag值为1的时候,就说明码流应该遵循基线profile(Baseline
profile)的所有约  
束.constrained_set0_flag值为0时,说明码流不一定要遵循基线profile的所有约束。
  3. constrained_set1_flag
  
 当constrained_set1_flag值为1的时候,就说明码流应该遵循主profile(Main
profile)的所有约束.

constrained_set1_flag值为0时,说明码流不一定要遵循主profile的所有约束。
  4. constrained_set2_flag
  
 当constrained_set2_flag值为1的时候,就说明码流应该遵循扩展profile(Extended
profile)的所有约 束.constrained_set2_flag值为0时,说明码流不一定要遵循扩展profile的所有约束。
 
  注意:当constraint_set0_flag,constraint_set1_flag或constraint_set2_flag中不只一个值为1的话,

那么码流必须满足所有相应指明的profile约束。
  5. level_idc
    它指的是码流对应的level级.
    5.1 独立于profile的level约束
       
让fR是这样一个变量:
     
  a) 如果图像n是一帧,fR设为1/172
     
  b) 如果图像n是一个场,fR设为1/(172*2)
     
  任何profile下的指定的level都应该满足如下约束:
     
  a) 理论上可访问单元n从CPB中的移除时间满足这样的约束:t(n)-t(n-1)要比Max 
(PicSizeInMbs,MaxMBPS,fR)值大或相等,MaxMBPS是说在level表中指出的对于图像n的值,   
PicSizeInMbs是指在图像n中的宏块数。
     
  b) 如果图像n是一个输出图像而且它不是码流的最后一个输出图象,从DPB中取出的连续的输出图象 
差满足:Dt(n) >= Max(PicSizeInMbs, MaxMBPS, fR),
MaxMBPS是指对于图象n来说的相应的值。

PicSizeInMbs指图象n的宏块。
     
  c)
对于可访问单元0的NumBytesInNALunit变量的总和少于或等于256*ChromaFormatFactor*
(PicSizeInMbs+MaxMBPS*tr(0)-trn(0)/MinCR,MaxMBPS和MinCR是图象0在level表中相应的  
值,PicSizeInMbs是图象0的宏块数量。
       
 d)
对于可访问单元n的NumBytesInNALunit值的总和是小于或等于256*ChromaFormatFactor*MaxMBPS* 
(tr(n)-trn(n-1))/MinCR,MaxMBPS和MinCR的值是图像n在level级表中对应的值。
       
 e) PicWidthInMbs * FrameHeightInMbs <= MaxFS,
MaxFS是在level表中指定的值。
     
  f) PicWidthInMbs <= Sqrt(MaxFS * 8)
     
  g) FrameHeightInMbs <= Sqrt(MaxFS * 8)
     
  h) max_dec_frame_buffering <=MaxDpbSize,
MaxDpbSize等于Min(1024 * MaxDPB / (PicWidthInMbs * FrameHeightInMbs * 256 *
ChromaFormatFactor,16),MaxDPB是对于1024字节 单元的MaxDPB值,max_dec_frame_buffering也叫做DPB大小值。
     
  i) 对于VCL HRD参数值,至少对于一个SchedSelIdx值来说,码率BitRate[SchedSelIdx]
<= 1000 *   
MaxBR且CpbSize[SchedSelIdx] <= 1000 *
MaxCPB。MaxBR和MaxCPB是对于1000bits/s和1000位单元对应于level级表的值。码流应该为0到cpb_cnt_minus1中的一个值,包括0和

cpb_cnt_minus1.CpbSize[SchedSelIdx]也叫做CPB大小值。
     
  j) 对于NAL HRD参数来说,BitRate[SchSelIdx] <= 1200 *
MaxBR且CpbSize[SchedSelIdx] <= 1200 
* MaxCPB,MaxBR和MaxCPB是在1200bits/s和1200位的单元值在极限level下的值。码流应该满足至
少SchedSelIdx值从0到cpb_cnt_minus1中的一个值。
      
  k) 在亮度帧采样中,垂直运动向量元素范围不能超过MaxVmvR,MaxVmvR值在level极限表中提供

 l) 在亮度帧采样单元中,水平运动向量范围不能超过-2048到2047.75,包括-2048和2047.75。
     
  m) 按解码顺序的两个连续的宏愉的运动向量的数量不超过MaxMvsPer2Mb(对于当前宏块的最后一个切

片和下一个宏块的第一个切片也适用),MaxMvsPer2Mb值在level极限表中提供.
     
  n) 对于任何宏块的macroblock_layer()的位数值都不能大于128 + 2048 *
ChromaFormatFactor.依
赖于entropy_coding_mode_flag值,macroblock_layer()的值由如下方式计算  如果entropy_coding_mode_flag值为0的话,macroblock_layer()的值由macroblock_layer()的对

于一个macroblock的语法结构给出 其他情况下,对于一个宏块的macroblock_layer()值是由read_bits(1)给出的.
  5.2 与profile相关的level级
  对于基线profile,主profile和扩展profile的相应的level级约束在H.264的文档中有表可查。
  6. seq_parameter_set_id
  seq_parameter_set_id指定了由图像参数集指明的序列参数集。seq_parameter_set_id值应该是从0到31,包括0和31

  注意:
当可用的情况下,编码器应该在sps值不同的情况下使用不同的seq_parameter_set_id值,而不是变化某一特定值的seq_parameter_set_id的参数集的语法结构中的值。

  7. log2_max_frame_num_minus4
  log2_max_frame_num_minus4指定了变量MaxFrameNum的值,MaxFrameNum =
2(log2_max_frame_num_minus4+4)
  log2_max_frame_num_minus的值应该在0到12之间,包括0和12.
  8. pic_order_cnt_type
  pic_order_cnt_type指定了解码图像顺序的方法。pic_order_cnt_type的值是0,1,2。
  pic_order_cnt_type在当一个编码视频序列有如下限定时不为2
  a) 包含非参考帧的可访问单元,并紧接着一个包含非参考可访问单元
  b)
两个可访问单元,它们分别包含两个场中的一个,它们一块儿组成了一个互补的非参考场对,被紧接着一个包括非参考图像的可访问单元。
  c) 一个包含非参考场的可访问单元,并紧接着一个包含另一个非参考图像的可访问单元,它们不组成互补的非参考场对。
  9. log2_max_pic_order_cnt_lsb_minus4
  log2_max_pic_order_cnt_lsb_minus4指出变量MaxPicOrderCntLsb的值,它是在解码过程中使用到的图像顺序计算值:

  MaxPicOrderCntLsb = 2(log2_max_pic_order_cnt_lsb_minus4+4)
  log2_max_pic_order_cnt_lsb_minus4的值为包括0和12以及它们之间的值。
  10. delta_pic_order_always_zero_flag
  delta_pic_order_always_zero_flag等于1的时候表示当delta_pic_order_cnt[0]和
delta_pic_order_cnt[1]在序列的切片头中不存在,并被认为是0。
delta_pic_order_always_zero_flag值等于0时表示delta_pic_order_cnt[0]在序列的切片头中存在而
delta_pic_order_cnt[1]可能在序列的切片头中存在。

  11. offset_for_non_ref_pic
  offset_for_non_ref_pic被用来计算一个非参考图像的图像顺序值。offset_for_non_ref_pic值取值范围为(-2)^(31)到2^(31)-1,包括边界值。

  12. offset_for_top_to_bottom_field
  offset_for_top_to_bottom_field被用来计算一帧中的下场的图像顺序值。offset_for_top_to_bottom_field值的取值范围为(-2)^(31)到(2)^(31)-1,包括边界值。

  13. num_ref_frames_in_pic_order_cnt_cycle
  num_ref_frames_in_pic_order_cnt_cycle在解码过程中被用来计算图像顺序值。num_ref_frames_in_pic_order_cnt_cycle在0到255之间取值,包括边界值。

  14. offset_for_ref_frame[i]
  offset_for_ref_frame[i]是一列num_ref_frames_in_pic_order_cnt_cycle中的一个元素,
它被在解码过程的解码顺序值中使用。offset_for_ref_frame[i]的值为(-2)^31到(2)^(31)-1,包括边界值。

  15. num_ref_frames
  num_ref_frames指定了长期的和短期的参考帧的最大总数目,互补的参考场对和在解码过程中对于任何序列使用的帧间预测的非配对的参考场。
num_ref_frames也决定了滑动窗口的操作大小过程。num_ref_frames值在0-16之间,包括边界值。

  16. gaps_in_frame_num_value_allowed_flag
  gaps_in_frame_num_value_allowed_flag值指明了frame_num允许的值和解码过程中的frame_num的差距值。

  17. pic_width_in_mbs_minus1
  pic_width_in_mbs_minus1加1指明了对于每个解码图像中的宽度值。在宏块单元中的图像宽度的变量值为:
  PicWidthInMbs = pic_width_in_mbs_minus1+1;
  对于亮度元素来说图像宽度变量的值:PicWidthInSamplesL = PicWidthInMbs * 16;
  对于色度元素来说图像宽度变量的值:PicWidthInSamplesC = PicWidthInMbs * 8
  18. pic_height_in_map_units_minus1
  pic_height_in_map_units_minus1指明了解码帧或场中的一个切片组的高度。变量PicHeightInMapUnits的值和PicSizeInMapUnits:

  PicHeightInMapUnits = pic_height_in_map_units_minus1 + 1;
  PicSizeInMapUnits = PicWidthInMbs * PicHeightInMapUnits
  19.frame_mbs_only_flag
  frame_mbs_only_flag等于0指明了视频序列的编码图象可能是编码场或编码帧。frame_mbs_only_flag等于1指明了每个编码视频序列的编码图像都是只含帧宏块的编码帧。

  依赖于frame_mbs_only_flag的值,pic_height_in_map_units_minus1如下定义:

  如frame_mbs_only_flag等于0,pic_height_in_map_units_minus1就是宏块单元的场高

  如frame_mbs_only_flag等于1,pic_height_in_map_units_minus1就是宏块单元的场宽

  FrameHeightInMbs的值:
  FrameheightInMbs = ( 2 - frame_mbs_only_flag ) *
PicHeightInMapUnits
  20. mb_adaptive_frame_field_flag
  mb_adaptive_frame_field_flag等于0表明在一个图像内不能切换使用帧和场宏块。
mb_adaptive_frame_field_flag等于1表示在一帧中有可能使用场和帧的切换,当
mb_adaptive_frame_field_flag没有设定的时候,应该赋给0.

  21. direct_8x8_inference_flag
  direct_8x8_inference_flag指明了在亮度运动向量生成B_Skip,B_Direct_16x16和
B_Direct_8x8的方法。当frame_mbs_only_flag为0时,direct_8x8_inference_flag应为1

  22. frame_cropping_flag
  frame_cropping_flag等于1表明在sps中下一个使用的帧剪切偏移量参数。frame_cropping_flag等于0表明帧剪切偏移量不存在。

  23.
frame_crop_left_offset,frame_crop_right_offset,frame_crop_top_offset,frame_crop_bottom_offset指明了在一个窗中一帧的采样值。

  24. vui_parameters_present_flag
  vui_parameters_present_flag等于1表示vui_parameters()在码流中是存在的,vui_parameters_present_flag等于0表明vui_parameters()在码流中不存在。

时间: 2024-08-04 08:37:34

H.264 SPS/PPS成员值含义的相关文章

多媒体开发之---h.264 SPS PPS解析源代码,C实现一以及nal分析器

http://blog.csdn.net/mantis_1984/article/details/9465909 http://blog.csdn.net/arau_sh/article/details/6271298 nal分析器

The h.264 Sequence Parameter Set

This is a follow-up to my World's Smallest h.264 Encoder post. I've received several emails asking about precise details of things in two entities in the h.264 bitstream: the Sequence Parameter Set (SPS) and the Picture Parameter Set (PPS). Both enti

H.264视频的RTP荷载格式

Status of This Memo This document specifies an Internet standards track protocol for the   Internet community, and requests discussion and suggestions for   improvements.  Please refer to the current edition of the "Internet   Official Protocol Stand

H.264从SPS中提取视频宽高

H.264有两种封装模式: (1)annexb模式:传统模式,使用start code来分隔NAL, SPS和PPS是在ES流的头部: (2)mp4模式:没有start code,使用NALU长度(固定字节,通常为4个字节)来分隔NAL.AVCodecContext的extradata内部保存着分隔的字节数,SPS和PPS: 1. 找到SPS 视频的宽高保存在SPS中.那么提取宽高首先要找到SPS.annexb模式直接读取视频数据,根据NAL type找到SPS即可.mp4模式应该从extrad

h.264语法结构分析

NAL Unit Stream Network Abstraction Layer,简称NAL. h.264把原始的yuv文件编码成码流文件,生成的码流文件就是NAL单元流(NAL unit Stream).而NAL单元流,就是NAL单元组成的. 标准的Annex B规定了NAL单元组成NAL单元流的方式,下面描述了如何将一个NAL单元打包起来,而多个NAL单元进行组合则形成了NAL单元流. byte_stream_nal_unit( NumBytesInNALunit ) { C Descri

H.264解码过程剖析-4

x264开源工程实现H.264的视频编码,但没有提供对应的解码器.ffmpeg开源多媒体编解码集合汇集了市面上几乎所有媒体格式的编解码的源代码.其中的H264.c就是一个能正常解码x264编码码流的独立的源文件,其使用步骤也与上述的编码或解码CODEC应用案例基本相同.这一节通过自顶向下的方式,讲述H264.c如何实现H.264视频解码过程. H264.c源文件有几千行,代码量庞大,很不便于浏览.分析和移植.同时该文件还依赖其他源文件,组织结构较复杂,实现平台由于不是基于Windows的VC++

【转】实现RTP协议的H.264视频传输系统

1.  引言       随着信息产业的发展,人们对信息资源的要求已经逐渐由文字和图片过渡到音频和视频,并越来越强调获取资源的实时性和互动性.但人们又面临着另外一种不可避免的尴尬,就是在网络上看到生动清晰的媒体演示的同时,不得不为等待传输文件而花费大量时间.为了解决这个矛盾,一种新的媒体技术应运而生,这就是流媒体技术.流媒体由于具有启动时延小.节省客户端存储空间等优势,逐渐成为人们的首选,流媒体网络应用也在全球范围内得到不断的发展.其中实时流传输协议 RTP 详细说明了在互联网上传递音频和视频的

H.264中NAL、Slice与frame意思及相互关系

NAL nal_unit_type中的1(非IDR图像的编码条带).2(编码条带数据分割块A).3(编码条带数据分割块B).4(编码条带数据分割块C).5(IDR图像的编码条带)种类型 与 Slice种的三种编码模式:I_slice.P_slice.B_slice 还有frame的3种类型:I frame.P frame. B frame之间有什么映射关系么? 最后,NAL nal_unit_type中的6(SEI).7(SPS).8(PPS)属于什么帧呢? 不好意思,文档看得头晕晕的了,问题比

H264码流中SPS PPS详解&lt;转&gt;

转载地址:https://zhuanlan.zhihu.com/p/27896239 1 SPS和PPS从何处而来? 2 SPS和PPS中的每个参数起什么作用? 3 如何解析SDP中包含的H.264的SPS和PPS串? 1 客户端抓包 在做客户端视频解码时,一般都会使用Wireshark抓包工具对接收的H264码流进行分析,如下所示: 在这里我们可以看到对解码视频起关键作用的SPS和PPS. 双击SPS内容如下: 双击PPS内容如下: 那么从上面的sps中我们知道图像的宽,高. 宽=(19+1