H.264中定义的sequence parameter sets中包括了一个图像序列的所有信息.它是H.264的基础之一,是编码前进行初始化的关键的一环,本文通过参考H.264的标准文档,对每个函数进行了一些注释性的说明,还有一些图表性的东西,因为blog上帖不是很方便,请参考文档中相应的部分.

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
**psp部分参数含义在关于psp的文章中给出。
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()在码流中不存在。

H.264 sequence parameter sets成员值含义学习笔记相关推荐

  1. H.264 picture parameter sets成员值含义学习笔记

    -picture parameter sets 1. pic_parameter_set_id pic_parameter_set_id指明了在切片头中对应的某个psp.pic_parameter_s ...

  2. RBSP、SODB、EBSP三者的区别和联系 SPS: sequence parameter sets

    SODB:最原始的编码数据,没有任何附加数据 RBSP:在 SODB 的基础上加了rbsp_stop_ont_bit(bit 值为 1)并用 0 按字节补位对齐 EBSP:在 RBSP 的基础上增加了 ...

  3. adb shell读取返回值_shell学习笔记03(函数amp;shell工具amp;面试题)

    自定义函数 1.基本语法 [ function ] funname[()] {Action;[return int;] } funname 2.经验技巧 (1)必须在调用函数地方之前,先声明函数,sh ...

  4. bootstrap媒体查询类型的值_HTMLCSS学习笔记(二十一)-- 媒体查询 + rem用法

    媒体查询 + rem 计算方法 计算rem方法: 结合媒体查询 -> 随着设备的改变 更改html font-size的值. ​ 媒体查询确定范围?? ​ 移动端设计图 : 640px 750p ...

  5. matlab 调用子函数返回值,matlab学习笔记13_1 函数返回值

    一起来学matlab-matlab学习笔记13函数 13_1 函数返回值 觉得有用的话,欢迎一起讨论相互学习~Follow Me 函数返回一个值 返回值不必使用return语句,而是直接将需要返回的变 ...

  6. java 内部类 返回值_Java学习笔记:形参和返回值、内部类、常用API

    形参和返回值 类名作形参 public void useCat(Cat c){ c.eat(); } CatOperator co=new CatOperator(); Cat c=new Cat() ...

  7. 《word2vec Parameter Learning Explained》论文学习笔记

    目录: 文章目录 1 Continuous Bag-of-Word Model 1.1 One-word context Update equation for hidden→output weigh ...

  8. layui一个表格中怎么接两个接口的值_layer学习笔记之table表格引入数据实现分页...

    LayUI是一款免费,开源,轻量级的前端cms框架,适用于企业后端,能快速上手开发,集成了常用的组件,还有完善的文档和社区. 最近一直在学习使用layer的layui框架技术,这个主要表现在于弹出层的 ...

  9. select函数返回值_Vue学习笔记之函数、高阶函数、v-model的应用

    一.哪些函数是响应式的: 1.push 在后面追加数据 5.sort() 排序 6.reverse() 顺序翻转 abcd ----> dcba 红框中的方式修改数组中的数据时,界面没有响应式的 ...

  10. 引用类型和值类型学习笔记

    一.基本概念 CLR支持两种类型,值类型和引用类型.它们从类型的定义.实例的创建.参数传递.到内存的分配都有所不同:.NET中的类型分类如下: 值类型和引用类型最本质的区别在于内存的分布上,大致可以这 ...

最新文章

  1. 独家 | kaggle季军新手笔记:利用fast.ai对油棕人工林图像进行快速分类(附代码)...
  2. P3391 【模板】文艺平衡树(Splay)
  3. 【树莓派】首发树莓派4原型机接口参数曝光
  4. 美团配送A/B评估体系建设与实践
  5. linux 交叉编译 静态库,从Linux为Windows开发交叉编译静态库
  6. html还原ui,前端高度还原设计稿(字体篇)
  7. 【BZOJ4205】卡牌配对
  8. 【Arduino实验14 红外遥控】
  9. Unity3d打包程序报错NotSupportedException: Encoding 437 data could not be found.
  10. 光标的认识(知识整理)
  11. 武职计算机网络技术专业,武汉职业技术学院计算机系
  12. 三菱FX5U连接MQTT
  13. 亚马逊AVS开发--树莓派3麦克风配置
  14. HTML和CSS基础
  15. 解决电脑无法运行 Mscomctl.ocx控件 常见的4个问题
  16. PDF文件电子签章支持库比较
  17. 网络空间安全中国学科排名——2021软科
  18. css-隐藏滚动条并可以滚动内容
  19. 暴力枚举题:平面上的点与外心
  20. 红芯商业计划书曝光:明年要实现3000万利润 2021年冲刺IPO

热门文章

  1. ++i i++
  2. ant 改变表格数据_查找相同数据还在一次一次使用vlookup函数?只需加上它1次搞定...
  3. 建筑电气工程设计常用图形和文字符号_建筑电气施工图设计正误案例对比
  4. ganglia集群监控搭建步骤
  5. 面向对象程序设计——总结作业
  6. iOS - NSURLSession 网络请求
  7. 纯js实现DIV拖拽
  8. PL/SQL 连接Oracle 11g
  9. java8 stream ,filter 等功能代替for循环
  10. Dubbo性能调优参数及原理