zoukankan      html  css  js  c++  java
  • H.264 sequence_parameter_sets成员值含义学习笔记

     
    H.264 sequence_parameter_sets成员值含义学习笔记
     
     

    SPS: sequence parameter sets
    01.  Profile_idc
    它指的是码流对应的profile.
     
    1.1 基线profile(Baseline profile)
    遵循基线profile的码流应该遵循以下的约束:
     
    a) 只有IP切片存在
    b) NAL单元流不应该有范围在24nal_unit_type,包括24.
    c) 序列参数集(sps)frame_mbs_only_fag(之后介绍)应该等于1
    d) 图象参数值(psp)weighted_pred_flagweighted_bipred_idc都应该为0
    e) 图象参数值(psp)entropy_coding_mode_flag应该等于0
    f) 图象参数值(psp)num_slice_groups_minus1应该在07之间,包括07**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之内的值。包括24.
    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_idc77的或constrained_set1_flag值为1level_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的值范围为07,包括07
    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级的码流。
    02. Constraint_set0_flag
    constrained_set0_flag值为1的时候,就说明码流应该遵循基线profile(Baseline profile)的所有约束.constrained_set0_flag值为0时,说明码流不一定要遵循基线profile的所有约束。
    03. Constraint_set1_flag
    constrained_set1_flag值为1的时候,就说明码流应该遵循主profile(Main profile)的所有约束.constrained_set1_flag值为0时,说明码流不一定要遵循主profile的所有约束。
    04. Constraint_set2_flag
    constrained_set2_flag值为1的时候,就说明码流应该遵循扩展profile(Extended profile)的所有约束.constrained_set2_flag值为0时,说明码流不一定要遵循扩展profile的所有约束。
    注意:当constraint_set0_flag,constraint_set1_flagconstraint_set2_flag中不只一个值为1的话,那么码流必须满足所有相应指明的profile约束。
    05. Constraint_set3_flag
    Reserved. Set to 0.
    06. Reserved_zero_4bits
    Reserved. Set to 0.
    07. Level_id: 12[Level 1.2]
    它指的是码流对应的level.
     
    5.1 独立于profilelevel约束
    fR是这样一个变量:
    a) 如果图像n是一帧,fR设为1/172
    b) 如果图像n是一个场,fR设为1/(172*2)
     
    任何profile下的指定的level都应该满足如下约束:
    a) 理论上可访问单元nCPB中的移除时间满足这样的约束: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) 对于可访问单元0NumBytesInNALunit变量的总和少于或等于256*ChromaFormatFactor*(PicSizeInMbs+MaxMBPS*tr(0)-trn(0)/MinCRMaxMBPSMinCR是图象0level表中相应的值,PicSizeInMbs是图象0的宏块数量。
    d) 对于可访问单元nNumBytesInNALunit值的总和是小于或等于256*ChromaFormatFactor*MaxMBPS*(tr(n)-trn(n-1))/MinCR,MaxMBPSMinCR的值是图像nlevel级表中对应的值。
    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 * MaxBRCpbSize[SchedSelIdx] <= 1000 * MaxCPBMaxBRMaxCPB是对于1000bits/s1000位单元对应于level级表的值。码流应该为0cpb_cnt_minus1中的一个值,包括0cpb_cnt_minus1.CpbSize[SchedSelIdx]也叫做CPB大小值。
    j) 对于NAL HRD参数来说,BitRate[SchSelIdx] <= 1200 * MaxBRCpbSize[SchedSelIdx] <= 1200 * MaxCPBMaxBRMaxCPB是在1200bits/s1200位的单元值在极限level下的值。码流应该满足至少SchedSelIdx值从0cpb_cnt_minus1中的一个值。
    k) 在亮度帧采样中,垂直运动向量元素范围不能超过MaxVmvRMaxVmvR值在level极限表中提供
    l) 在亮度帧采样单元中,水平运动向量范围不能超过-20482047.75,包括-20482047.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的文档中有表可查。
    08. seq_parameter_set_id
    seq_parameter_set_id指定了由图像参数集指明的序列参数集。seq_parameter_set_id值应该是从031,包括031
    注意:当可用的情况下,编码器应该在sps值不同的情况下使用不同的seq_parameter_set_id值,而不是变化某一特定值的seq_parameter_set_id的参数集的语法结构中的值。
    09. log2_max_frame_num_minus4
    log2_max_frame_num_minus4指定了变量MaxFrameNum的值, MaxFrameNum = 2(log2_max_frame_num_minus4+4)
    log2_max_frame_num_minus的值应该在012之间,包括012.
    10. pic_order_cnt_type
    pic_order_cnt_type指定了解码图像顺序的方法。pic_order_cnt_type的值是0,1,2
    pic_order_cnt_type在当一个编码视频序列有如下限定时不为2
    a) 包含非参考帧的可访问单元,并紧接着一个包含非参考可访问单元
    b) 两个可访问单元,它们分别包含两个场中的一个,它们一块儿组成了一个互补的非参考场对,被紧接着一个包括非参考图像的可访问单元。
    c) 一个包含非参考场的可访问单元,并紧接着一个包含另一个非参考图像的可访问单元,它们不组成互补的非参考场对。
    11. 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的值为包括012以及它们之间的值。
    12. 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]可能在序列的切片头中存在。
    13. offset_for_non_ref_pic
    offset_for_non_ref_pic被用来计算一个非参考图像的图像顺序值。offset_for_non_ref_pic值取值范围为(-2)^(31)2^(31)-1,包括边界值。
    14. offset_for_top_to_bottom_field
    offset_for_top_to_bottom_field被用来计算一帧中的下场的图像顺序值。
    offset_for_top_to_bottom_field值的取值范围为(-2)^(31)(2)^(31)-1,包括边界值。
    15. num_ref_frames_in_pic_order_cnt_cycle
    num_ref_frames_in_pic_order_cnt_cycle在解码过程中被用来计算图像顺序值。
    num_ref_frames_in_pic_order_cnt_cycle0255之间取值,包括边界值。
    16. 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,包括边界值。
    17. num_ref_frames
    num_ref_frames指定了长期的和短期的参考帧的最大总数目,互补的参考场对和在解码过程。
    18. gaps_in_frame_num_value_allowed_flag
    gaps_in_frame_num_value_allowed_flag值指明了frame_num允许的值和解码过程中的frame_num的差距值。
    19. pic_width_in_mbs_minus1
    pic_width_in_mbs_minus11指明了对于每个解码图像中的宽度值。在宏块单元中的图像宽度的变量值为:
    PicWidthInMbs = pic_width_in_mbs_minus1+1;
    对于亮度元素来说图像宽度变量的值:
    PicWidthInSamplesL = PicWidthInMbs * 16;
    对于色度元素来说图像宽度变量的值:
    PicWidthInSamplesC = PicWidthInMbs * 8;
    20. 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
    21. 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等于0pic_height_in_map_units_minus1就是宏块单元的场高
    frame_mbs_only_flag等于1pic_height_in_map_units_minus1就是宏块单元的场宽
    FrameHeightInMbs的值:
    FrameheightInMbs = ( 2 - frame_mbs_only_flag ) * PicHeightInMapUnits
    22. mb_adaptive_frame_field_flag
    mb_adaptive_frame_field_flag等于0表明在一个图像内不能切换使用帧和场宏块。
    mb_adaptive_frame_field_flag等于1表示在一帧中有可能使用场和帧的切换,当mb_adaptive_frame_field_flag没有设定的时候,应该赋给0.
    23. direct_8x8_inference_flag
    direct_8x8_inference_flag指明了在亮度运动向量生成B_SkipB_Direct_16x16B_Direct_8x8的方法。
    frame_mbs_only_flag0时,direct_8x8_inference_flag应为1
    24. frame_cropping_flag
    frame_cropping_flag等于1表明在sps中下一个使用的帧剪切偏移量参数。frame_cropping_flag等于0表明帧剪切偏移量不存在。
    25. frame_crop_left_offset
    26. frame_crop_left_offset
    27. frame_crop_top_offset
    28. frame_crop_bottom_offset
    指明了在一个窗中一帧的采样值。
    29. vui_parameters_present_flag
    vui_parameters_present_flag等于1表示vui_parameters()在码流中是存在的,vui_parameters_present_flag等于0表明vui_parameters()在码流中不存在。
    30. rbsp_trailing_bits( )
    rbsp_stop_one_bit        恒等于1
    rbsp_alignment_zero_bit      恒等于0.
     
    Note:
           More detail need refer to
           1). Advanced video coding for generic audiovisual services.pdf P63.
           2). Refer to ISOIEC 14496-10-2005-PDAM 3.doc P40
     
     
    rbsp_trailing_bits( ) {
    C
    Descriptor
        rbsp_stop_one_bit /* equal to 1 */
    All
    f(1)
        while( !byte_aligned( ) )
     
     
           rbsp_alignment_zero_bit /* equal to 0 */
    All
    f(1)
    }
     
     
     
    Sequence parameter set RBSP syntax
    seq_parameter_set_rbsp( ) {
    C
    Descriptor
        profile_idc
    0
    u(8)
        constraint_set0_flag
    0
    u(1)
        constraint_set1_flag
    0
    u(1)
        constraint_set2_flag
    0
    u(1)
        constraint_set3_flag
    0
    u(1)
        reserved_zero_4bits /* equal to 0 */
    0
    u(4)
        level_idc
    0
    u(8)
        seq_parameter_set_id
    0
    ue(v)
        if( profile_idc = = 83 ) {
     
     
           seq_parameter_set_svc_extension( ) /* specified in Annex F */
     
     
        }
     
     
        if( profile_idc = = 100 | | profile_idc = = 110 | |
            profile_idc = = 122 | | profile_idc = = 144  | |
            profile_idc = = 83 ) {
     
     
           chroma_format_idc
    0
    ue(v)
           if( chroma_format_idc = = 3 )
     
     
               residual_colour_transform_flag
    0
    u(1)
           bit_depth_luma_minus8
    0
    ue(v)
           bit_depth_chroma_minus8
    0
    ue(v)
           qpprime_y_zero_transform_bypass_flag
    0
    u(1)
           seq_scaling_matrix_present_flag
    0
    u(1)
           if( seq_scaling_matrix_present_flag )
     
     
               for( i = 0; i < 8; i++ ) {
     
     
                   seq_scaling_list_present_flag[ i ]
    0
    u(1)
                   if( seq_scaling_list_present_flag[ i ] )
     
     
                      if( i < 6 )
     
     
                          scaling_list( ScalingList4x4[ i ], 16, 
                                           UseDefaultScalingMatrix4x4Flag[ i ])
    0
     
                      else
     
     
                          scaling_list( ScalingList8x8[ i – 6 ], 64,
                                           UseDefaultScalingMatrix8x8Flag[ i – 6 ] )
    0
     
               }
     
     
        }
     
     
        log2_max_frame_num_minus4
    0
    ue(v)
        pic_order_cnt_type
    0
    ue(v)
        if( pic_order_cnt_type = = 0 )
     
     
           log2_max_pic_order_cnt_lsb_minus4
    0
    ue(v)
        else if( pic_order_cnt_type = = 1 ) {
     
     
           delta_pic_order_always_zero_flag
    0
    u(1)
           offset_for_non_ref_pic
    0
    se(v)
           offset_for_top_to_bottom_field
    0
    se(v)
           num_ref_frames_in_pic_order_cnt_cycle
    0
    ue(v)
           for( i = 0; i < num_ref_frames_in_pic_order_cnt_cycle; i++ )
     
     
               offset_for_ref_frame[ i ]
    0
    se(v)
        }
     
     
        num_ref_frames
    0
    ue(v)
        gaps_in_frame_num_value_allowed_flag
    0
    u(1)
        pic_width_in_mbs_minus1
    0
    ue(v)
        pic_height_in_map_units_minus1
    0
    ue(v)
        frame_mbs_only_flag
    0
    u(1)
        if( !frame_mbs_only_flag )
     
     
           mb_adaptive_frame_field_flag
    0
    u(1)
        direct_8x8_inference_flag
    0
    u(1)
        frame_cropping_flag
    0
    u(1)
        if( frame_cropping_flag ) {
     
     
           frame_crop_left_offset
    0
    ue(v)
           frame_crop_right_offset
    0
    ue(v)
           frame_crop_top_offset
    0
    ue(v)
           frame_crop_bottom_offset
    0
    ue(v)
        }
     
     
        vui_parameters_present_flag
    0
    u(1)
        if( vui_parameters_present_flag )
     
     
           vui_parameters( )
    0
     
        rbsp_trailing_bits( )
    0
     
    }
     
     
  • 相关阅读:
    php RSA公钥私钥加解密和验证用法
    php格式化RSA公钥私钥字符串
    你的周末时光是什么样的?
    php-redis 消息订阅笔记
    php redis 常用操作
    MySql索引笔记
    yii1框架,事务使用方法
    python 项目打包成exe可执行程序
    Linux修改默认端口
    C++字符串作为参数的传递
  • 原文地址:https://www.cnblogs.com/garywlx/p/2728125.html
Copyright © 2011-2022 走看看