加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

[转载][原]SVC标准解读系列--G.7语法和语义

(2013-05-09 16:39:17)
标签:

转载

先把NALUtype附在最前面,这是JSVM9.19中的定义

enum NalUnitType

{

  NAL_UNIT_UNSPECIFIED_0            =  0,

  NAL_UNIT_CODED_SLICE              =  1,

  NAL_UNIT_CODED_SLICE_DATAPART_A   =  2,

  NAL_UNIT_CODED_SLICE_DATAPART_B   =  3,

  NAL_UNIT_CODED_SLICE_DATAPART_C   =  4,

  NAL_UNIT_CODED_SLICE_IDR          =  5,

  NAL_UNIT_SEI                      =  6,

  NAL_UNIT_SPS                      =  7,

  NAL_UNIT_PPS                      =  8,

  NAL_UNIT_ACCESS_UNIT_DELIMITER    =  9,

  NAL_UNIT_END_OF_SEQUENCE          = 10,

  NAL_UNIT_END_OF_STREAM            = 11,

  NAL_UNIT_FILLER_DATA              = 12,

  NAL_UNIT_SPS_EXTENSION            = 13,

  NAL_UNIT_PREFIX            = 14,

  NAL_UNIT_SUBSET_SPS               = 15,

  NAL_UNIT_RESERVED_16              = 16,

  NAL_UNIT_RESERVED_17              = 17,

  NAL_UNIT_RESERVED_18              = 18,

  NAL_UNIT_AUX_CODED_SLICE          = 19,

  NAL_UNIT_CODED_SLICE_SCALABLE     = 20,

  NAL_UNIT_RESERVED_21              = 21,

  NAL_UNIT_RESERVED_22              = 22,

  NAL_UNIT_RESERVED_23              = 23

};

 

G.7 Syntax and semantics 语法和语义:

G.7.3列出语法,G.7.4讲解这些语法的含义,这里合并起来总结。其实比较浮浅,因为几乎没有看H.264标准的第7章。直接就看了附录G的第7章。建议还是要先看264的标准正文,再看SVC的标准。不然会很吃力。

 

先补充一下G.7.4的提纲中的注意点:

1.nal_ref_idc代表了NALU的重要性。03,取值越大,表示当前NAL越重要,需要优先受到保护。如果当前NAL是属于参考帧的片,或是序列参数集,或是图像参数集这些重要的单位时,本句法元素必需大于0

2.对于nal_unit_type=14NALU,它的nal_ref_idc与它身后紧跟着的NALUnal_ref_idc一样。

3.对于同一个dependency representation,所有VCL NALUnal_ref_idc是一样的。

一、G.7.3.1.1 NAL unit SVC extension syntax

1.idr_flag:代表本帧是否是IDR帧,本dependency representation内的所有NALUidr_flag都是一致的。如果一个prefix NULUidr_flag1,那么它随后的associated NAL unitnal_unit_type就是5;如果prefix NALUidr_flag0,那么它随后的associated NAL unitnal_unit_type就是1.(如果nal_ref_idc=0,那么idr_flag应该设为0

附:nal_unit_type常用取值翻译:1(非IDR图像的编码条带)、2(编码条带数据分割块A)、3(编码条带数据分割块B)、4(编码条带数据分割块C)、5IDR图像的编码条带)、14prefix)、20(带有层间预测宏块的编码条带) ;如果不采用 DP(数据分割)机制,则一个条带就是一个 NALU。否则,一个条带由三个 NALU 组成(nal_unit_type 值为 234 的三个 NALU 属于一个条带);

2.priority_id:代表了NALU的优先级

3.no_inter_layer_pred_flag:为0则说明本NALU需要用到层间预测来解码,为1代表不用层间预测。对于prefix NAL units,此flag应该为1;对于nal_unit_type is equal to 20 and quality_id is greater than 0(也就是用到了层间预测编码的帧中的非基本层的NALU),此flag应该为0

4.dependency_id:标识本NALU属于哪一个D层,可以理解为空间可分级的层标识, 07,最多有8D层。基本层的值为0

5.quality_id:标识本NALU属于哪一个Q层,可以理解为某一个空间层中的多个MGS层中的层标识,015

6.temporal_id:标识本NALU属于哪一个T层,可以理解为某一个空间曾中的多个时间层中的层标识;对于IDR帧,temporal_id应该为0;对于一个access unit中的NALUtemporal_id应该都一致。(dependency_idquality_id可以不一样), 07,最多有8个时域分级

7.use_ref_base_pic_flag:标明当前的nalu使用什么帧作为参考。需要注意的是对于Dependency ID相同的naluuse_ref_base_pic_flag都得是相同的。如果use_ref_base_pic_flag1,那么reference  base picturesdecoded  pictures都拿来帮助解码,如果是为0,则只用decoded  pictures。(reference  base pictures的概念参考G.3.46)。此flagMGS使用的语法。通常,都是使用当前层的重建图像作为参考图像,对于关键帧,则使用参考层的重建图像作为参考图像。注意区别,不是使用当前图像的参考层重建作为参考。

8.discardable_flag:当前图像没有被作为层间参考层,则该标记置1。在码流提取的时候,如果该层不是目标层,则会被丢弃。

9.output_flag:标识该NALU是否会输出,比如对于reference  base  pictures,则output_flag0

10.reserved_three_2bits:默认为3,保留。解码器不用管。

 

先补充一下G.7.4.1.2.1G.7.4.2中提到的RBSP

1.RBSPraw byte sequence payload,原始字节序列载荷)是封装于网络抽象单元中的数据。RBSP共分视频编码数据和控制数据两种,其可以应用到不同的对象,主要有序列参数集(Sequence parameter set)的RBSP、序列参数集扩展的RBSP、图像参数集(Picture parameter set)的RBSP、辅助增强信息(Supplemental enhancement information)的RBSP等等。

2.RBSPSODBEBSP的关系

SODB:最原始的编码数据,没有任何附加数据

RBSP:在 SODB 的基础上加了rbsp_stop_ont_bitbit 值为 1)并用 0 按字节补位对齐

EBSP:在 RBSP 的基础上增加了防止伪起始码字节(0X03

3.用到的地方:就相当于NALU包的负载,数据部分。先调用xConvertPayloadToRBSP ( uiPacketLength )"0x03" 抛弃,即将数据负荷转化为RBSP.再调用xConvertRBSPToSODB( uiPacketLength, uiBitsInPacket )把码流末尾的零字节给移去,即将RBSP转化为SODB.

补充一下G.7.4.1.2.x 排序相关的东西,简单摘几条重要的:

1.一个视频序列的第一个access unit一定是IDR的。

2.DQId:某一特定layer  representation的标识,因为包含了DQ的两个id的信息。

3.编好的access unit中,D小的NALU在前,大的在后,Q小的NALU在前,大的在后;本access unit的第一个NALUDQ,要比上一个access的最后一个NALUDQ

4.nal_unit_type=012212223或更大的NALU,假如出现在access unit中,也不能排在第一个VCL NALU前。

二、G.7.3.2.1.4 Sequence parameter set SVC extension syntax

1. inter_layer_deblocking_filter_control_present_flag:为1表示在slice header中有用于控制层间去块滤波的参数,为0的话没有,只能推算。

2. extended_spatial_scalability_idc:代表ESS,为012.0表示不采用ESS,为1表示采用ESS,参数放置在子序列参数集中,为2表示采用ESS,参数放置在slice header中。

3. chroma_phase_x_plus1_flagchroma_phase_y_plus1、等四个关于色度的没有仔细看。

4. seq_scaled_ref_layer_left_offset4个表示经过重采样之后用来层间预测的亮度样值与当前帧的亮度样值的偏移。

5. seq_tcoeff_level_prediction_flag:用来表示是否存在adaptive_tcoeff_level_prediction_flag

6. adaptive_tcoeff_level_prediction_flag:用来表示是否存在tcoeff_level_prediction_flag(此语法元素在G.7.4.3.4中出现,同时可以参考

http://blog.csdn.net/l35633/archive/2010/10/20/5953313.aspx

三、G.7.3.2.12.1 Prefix NALU SVC syntax (SVCprefix nalu新加的语法)

1. store_ref_base_pic_flag:指定当前nalu包含的reference base picture是不是要被存入DPB中用作将来的参考。再观察可以发现,store_ref_base_pic_flag这个语法元素一般情况下只会在Qid=0NALU中。

2. additional_prefix_nal_unit_extension_flag:为0表示additional_prefix_nal_unit_extension_data_flag不出现在prefix_nal_unit_svc( )结构中,是符合标准的。

3.additional_prefix_nal_unit_extension_data_flag可以是任意值。

 

 

补充一下G.7.4.3~G.7.4.3.4之间的重要信息:

1.       A frame,field,top field,bottom field,picture,and decoded picture is interpreted as layer frame,layer field,layer top field,layer bottom field,layer picture,and decoded layer picture,respectively,that represent an intermediate decoding result for the dependency representation with dependency_id equal to 0.

2.       IDR帧被解释为IdrPicFlag1D0层的dependency representationIDR access  unit就是包含了IdrPicFlag1D0层的dependency representationaccess unit

3.       A  reference  frame,  reference  field,  and  reference  picture  is  interpreted  as  layer  frame, layer  field,  and  layer picture with nal_ref_idc greater than 0 for the dependency representation with dependency_id equal to 0.

4.       A non-reference frame, non-reference field, and non-reference picture  is interpreted as layer frame,  layer field, and layer picture with nal_ref_idc equal to 0 for the dependency representation with dependency_id equal to 0.

四、G.7.3.3.4 Slice header in scalable extension syntax

1.first_mb_in_slice:当前slice中第一个MB的地址。要比之前编码过的slice的第一个MB的地址大才行。(除非启用了ASO)

2.slice_type05EPP16EBB27EII

3.pic_parameter_set_id:位于每一个slice header中,标识picture parameter setid。当然picture parameter set本身是建议采用更可靠的信道去传送的。The value of pic_parameter_set_id shall be in the range of 0 to 255, inclusive.

4.colour_plane_idspecifies the colour plane associated with the current slice RBSP when separate_colour_plane_flag is equal to 1. The value of colour_plane_id shall be in the range of 0 to 2, inclusive. colour_plane_id equal to 0, 1, and 2 correspond to the Y, Cb, and Cr planes, respectively.

NOTE 1 – There is no dependency between the decoding processes of pictures having different values of colour_plane_id.

5.frame_numH.264中是代表图像编码顺序(num),SVC中是dependency  representations的编码顺序(num)。如果是IDR帧,那么就为0.

6. field_pic_flag:为1代表本slice是一个场图像的slice,为0代表本slice是一个帧图像的slice。为1的情况下bottom_field_flag才会被启用。

7.bottom_field_flag:在被启用后,为1代表本slice是底场图像的slice,为0代表本slice是顶场图像的slice

8. idr_pic_id:表明本slice属于的IDR帧的id。此时要求dependency_id是当前图片中VCL NALU中最大的。(????)

9. pic_order_cnt_lsb:表示一个编码帧的顶场或一个编码场的图像顺序数对 MaxPicOrderCntLsb  取模

10. delta_pic_order_cnt_bottom:表示一个编码帧的底场和顶场的图像顺序数之间的差

11. redundant_pic_cnt 对于属于基本编码图像的条带和条带数据隔离带应等于 0。对于一个冗余编码图像的编码条带或编码条带数据隔离带的 redundant_pic_cnt 的值应大于 0。当 redundant_pic_cnt 在比特流中不存在时,应推定其值为 0redundant_pic_cnt 的值应该在 0 127范围内(包括 0 127)。

12. direct_spatial_mv_pred_flag:表示为得到帧间预测的动作矢量和参考序号而使用的方法。

13. num_ref_idx_active_override_flag  等于 0 表示在 的图像 中规定的 语法元素num_ref_idx_l0_active_minus1 num_ref_idx_l1_active_minus1 的值将生效

14. num_ref_idx_l0_active_minus1 表示将用于解码该条带的参考图像列表 0的最大参考序号。同理num_ref_idx_l1_active_minus1表示列表1的。。。

15. base_pred_weight_table_flag1表明加权预测中的变量是需要推测的。

16. store_ref_base_pic_flag指定当前nalu包含的reference base picture是不是要被存入DPB中用作将来的参考

17ref_layer_dq_id:在当前编码图像中被当前layer representation用作层间参考的layer representationID

18. slice_skip_flag:为1表示slice data不会出现在NALU

19. adaptive_base_mode_flag:表示是否自动使用层间模式估计,可以配合default_base_mode_flag。如下:两者都为0,那么一直不用层间模式预测;adaptive_base_mode_flag0default_base_mode_flag1,那么一直用;adaptive_base_mode_flag1,则default_base_mode_flag失效,此时宏块自适应的使用层间模式预测。

20. adaptive_motion_prediction_flag:类似上边,只不过从模式预测变成了运动预测。

21. adaptive_residual_prediction_flag:类似上边,只不过从运动预测变成了残差预测。

22. tcoeff_level_prediction_flag:为0时表示spatial domain inter-layer prediction;为1时表示frequency domain inter-layer prediction,同时为1的时候,即在变换域系数有预测的时候,应该是发生在没有空间分辨率变化的时候,即MGSCGS层间预测的时候。

五、G. 7.3.6 Macroblock layer in scalable extension syntax(宏块的层间预测模式标记)

1. base_mode_flag:表示宏块是否使用层间类型和运动参数预测,直接使用层间预测的运动参数,码流中不再传。比如层间帧内预测模式Intra_BL就是在intra slice里,base_mode_flag=1对应的宏块类型。

2. coded_block_pattern:表示六个亮度和色度 8x8 块可能含有非零的变换系数幅值。对预测模式不等Intra_16x16的宏块,比特流中存在coded_block_pattern且变量 CodedBlockPatternLumaCodedBlockPatternChroma由如下公式得出:

CodedBlockPatternLuma = coded_block_pattern

CodedBlockPatternChroma = coded_block_pattern/16

其中,CodedBlockPatternLuma1表示8x8亮度块中的一个或多个 4x4亮度块的一个或多个变换系数幅值不为 0;为0表示8x8亮度块中的四个 4x4亮度块的所有变换系数幅值都等于 0

然后,CodedBlockPatternChroma0表示:全为零;1表示:DC参数不为零;2表示:有不为零的参数。

3. residual_prediction_flag:宏块是否启用层间残差预测。

4. motion_prediction_flag_l0[ mbPartIdx ]宏块分割是否启用运动矢量层间预测,这种模式还会传层间预测运动矢量和实际运动矢量的残差。这里是list0.对于motion_prediction_flag_l1[ mbPartIdx ]也一样,只不过是li

0

  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有