H264___sps_pps___分析

1:  seq_parameter_set_rbsp( ) {  

    // profile_idc  level_idc  指明所用  profile、level 
    profile_idc 
    constraint_set_flag  ///0:baseline,1:main 2,extend main 3 high profile  
    reserved_zero_5bits  在目前的标准中本句法元素必须等于 0,其他的值保留做将来用,解码器应该忽略本句法元素的值。 
    level_idc      /* 指明所用的Level */
    seq_parameter_set_id    /*这个 id 号将被 picture 参数集引用,本句法元素的值应该在[0,31],,编码需要产生新的序列集时,使用新的id,而不是改变原来参数集的内容 */  
    // log2_max_frame_num_minus4  这个句法元素主要是为读取另一个句法元素 frame_num  服务的,frame_num  是最重要的句法元素之一,它标识所属图像的解码顺序 。这个句法元素同时也指明了 frame_num 的所能达到的最大值: MaxFrameNum = 2*exp( log2_max_frame_num_minus4 + 4 ) 
    // pic_order_cnt_type  指明了 poc  (picture  order  count)  的编码方法,poc 标识图像的播放顺序。由poc 可以由 frame-num 通过映射关系计算得来,也可以索性由编码器显式地传送。 
    
    
    pic_order_cnt_type         
    if( pic_order_cnt_type    ==    0 )   
       // log2_max_pic_order_cnt_lsb_minus4  指明了变量  MaxPicOrderCntLsb 的值: MaxPicOrderCntLsb = pow(2, (log2_max_pic_order_cnt_lsb_minus4 + 4) ) 
        log2_max_pic_order_cnt_lsb_minus4    
    else if( pic_order_cnt_type    ==    1 ) {    
        // delta_pic_order_always_zero_flag  等于 1 时,句法元素 delta_pic_order_cnt[0]和 delta_pic_order_cnt[1] 
不在片头出现,并且它们的值默认为 0;  本句法元素等于 0 时,上述的两个句法元素将在片头出现。  
 delta_pic_order_always_zero_flag    
 // offset_for_non_ref_pic   被用来计算非参考帧或场的 POC,本句法元素的值应该在[pow(-2, 31)  , pow(2, 31)  – 1]。  
offset_for_non_ref_pic    
 // offset_for_top_to_bottom_field  被用来计算帧的底场的 POC,  本句法元素的值应该在[pow(-2, 31)  , pow(2, 31)  – 1]。  
 offset_for_top_to_bottom_field    
// num_ref_frames_in_pic_order_cnt_cycle  被用来解码POC, 本句法元素的值应该在[0,255]。 
 num_ref_frames_in_pic_order_cnt_cycle    
 // offset_for_ref__frame[i]  用于解码 POC,本句法元素对循环num_ref_frames_in_pic_order_cycle 中的每一个元素指定一个偏移。 
        for( i = 0; i < num_ref_frames_in_pic_order_cnt_cycle; i++ )  
            offset_for_ref_frame[ i ]    
    }    
    // num_ref_frames   指定参考帧队列可能达到的最大长度,解码器依照这个句法元素的值开辟存储区,这个存储区用于存放已解码的参考帧,H.264 规定最多可用 16 个参考帧,本句法元素的值最大为 16。值得注意的是这个长度以帧为单位,如果在场模式下,应该相应地扩展一倍。 
    num_ref_frames   
   // gaps_in_frame_num_value_allowed_flag  这个句法元素等于 1 时,表示允许句法元素 frame_num 可以不连续。当传输信道堵塞严重时,编码器来不及将编码后的图像全部发出,这时允许丢弃若干帧图像。 
   gaps_in_frame_num_value_allowed_flag   
    // pic_width_in_mbs_minus1  本句法元素加 1 后指明图像宽度,以宏块为单位: PicWidthInMbs = pic_width_in_mbs_minus1 + 1 通过这个句法元素解码器可以计算得到亮度分量以像素为单位的图像宽度: PicWidthInSamplesL = PicWidthInMbs * 16  
    pic_width_in_mbs_minus1    
    // pic_height_in_map_units_minus1   本句法元素加 1 后指明图像高度: PicHeightInMapUnits = pic_height_in_map_units_minus1 + 1  
    pic_height_in_map_units_minus1    
    // frame_mbs_only_flag   本句法元素等于 0 时表示本序列中所有图像的编码模式都是帧,没有其他编码模式存在;本句法元素等于 1 时  ,表示本序列中图像的编码模式可能是帧,也可能是场或帧场自适应,某个图像具体是哪一种要由其他句法元素决定。 
    frame_mbs_only_flag    
    // mb_adaptive_frame_field_flag   指明本序列是否属于帧场自适应模式。mb_adaptive_frame_field_flag等于1时表明在本序列中的图像如果不是场模式就是帧场自适应模式,等于0时表示本序列中的图像如果不是场模式就是帧模式。。表  列举了一个序列中可能出现的编码模式: 
    if( !frame_mbs_only_flag )   
        mb_adaptive_frame_field_flag    
    // direct_8x8_inference_flag    用于指明 B 片的直接和 skip 模式下运动矢量的预测方法。 
    direct_8x8_inference_flag    
    // frame_cropping_flag   用于指明解码器是否要将图像裁剪后输出,如果是的话,后面紧跟着的四个句法元素分别指出左右、上下裁剪的宽度。 
    frame_cropping_flag   
    if( frame_cropping_flag ) {   
        frame_crop_left_offset    
        frame_crop_right_offset   
        frame_crop_top_offset   
       frame_crop_bottom_offset    
    }   
    // vui_parameters_present_flag      指明 vui 子结构是否出现在码流中,vui 用以表征视频格式等额外信息。 
    vui_parameters_present_flag   
     if( vui_parameters_present_flag )   
        vui_parameters( )         
     rbsp_trailing_bits( )        
}  




pic_parameter_set_rbsp( ) {   
    // pic_parameter_set_id 用以指定本参数集的序号,该序号在各片的片头被引用。 
   pic_parameter_set_id   
    // seq_parameter_set_id  指明本图像参数集所引用的序列参数集的序号。 
    seq_parameter_set_id   
   // entropy_coding_mode_flag  指明熵编码的选择,本句法元素为0时,表示熵编码使用 CAVLC,本句法元素为1时表示熵编码使用 CABAC  
    entropy_coding_mode_flag   
    // pic_order_present_flag        POC 的三种计算方法在片层还各需要用一些句法元素作为参数,本句法元素等于1时表示在片头会有句法元素指明这些参数;本句法元素等于0时,表示片头不会给出这些参数,这些参数使用默认值 
    pic_order_present_flag   
    // num_slice_groups_minus1  本句法元素加1后指明图像中片组的个数。H.264  中没有专门的句法元素用于指明是否使用片组模式,当本句法元素等于0(即只有一个片组),表示不使用片组模式,后面也不会跟有用于计算片组映射的句法元素。  
    num_slice_groups_minus1   
    if( num_slice_groups_minus1 > 0 ) {    
        /* slice_group_map_type  用以指明片组分割类型。  
           map_units 的定义: 
          -  当 frame_mbs_only_flag 等于1时,map_units 指的就是宏块 
          -  当 frame_mbs_only_flag 等于0时  
              -  帧场自适应模式时,map_units 指的是宏块对 
              -  场模式时,map_units 指的是宏块 
              -  帧模式时,map_units 指的是与宏块对相类似的,上下两个连续宏块的组合体。      */ 
        slice_group_map_type        
        if( slice_group_map_type    = =    0 )         
            for( iGroup = 0; iGroup <= num_slice_groups_minus1; iGroup++ )         
                // run_length_minus1[i]     用以指明当片组类型等于0时,每个片组连续的 map_units 个数 
                run_length_minus1[ iGroup ]    
        else if( slice_group_map_type    = =    2 )         
            for( iGroup = 0; iGroup < num_slice_groups_minus1; iGroup++ ) {         
                // top_left[i],bottom_right[i]   用以指明当片组类型等于2时,矩形区域的左上及右下位置。 
                top_left[ iGroup ]   
                bottom_right[ iGroup ]   
            }         
        else if(    slice_group_map_type    = =    3    | |     
                    slice_group_map_type    = =    4    | |     
                    slice_group_map_type    = =    5 ) { 
            // slice_group_change_direction_flag 与下一个句法元素一起指明确切的片组分割方法。  
           slice_group_change_direction_flag    
           // slice_group_change_rate_minus1       用以指明变量 SliceGroupChangeRAte 
            slice_group_change_rate_minus1    
        } else if( slice_group_map_type    = =    6 ) {    
           // pic_size_in_map_units_minus1   在片组类型等于6时,用以指明图像以 map_units 为单位的大小。      
            pic_size_in_map_units_minus1    
            for( i = 0; i <= pic_size_in_map_units_minus1; i++ )         
                // slice_group_id[i]           在片组类型等于6时,用以指明某个 map_units 属于哪个片组。 
                slice_group_id[ i ]    
        }         
    }         
   // num_ref_idx_l0_active_minus1  加1后指明目前参考帧队列的长度,即有多少个参考帧(包括短期和长期)。值得注意的是,当目前解码图像是场模式下,参考帧队列的长度应该是本句法元素再乘以2,因为场模式下各帧必须被分解以场对形式存在。(这里所说的场模式包括图像的场及帧场自适应下的处于场模式的宏块对)  本句法元素的值有可能在片头被重载。  
      在序列参数集中有句法元素 num_ref_frames 也是跟参考帧队列有关,它们的区别是num_ref_frames指明参考帧队列的最大值,解码 器用它的值来分配内存空 间;num_ref_idx_l0_active_minus1 指明在这个队列中当前实际的、已存在的参考帧数目,这从它的名字“active”中也可以看出来。图像时,并不是直接传送该图像的编号,而是传送该图像在参考帧队列中的序号。这个序号并不是在码流中传送的,这个句法元素是 H.264 中最重要的句法元素之一,编码器要通知解码器某个运动矢量所指向的是哪个参考而是编码器和解码器同步地、用相同的方法将参考图像放入队列,从而获得一个序号。这个队列在每解一个图像,甚至是每个片后都会动态地更新。维护参考帧队列是编解码器十分重要的工作,而本句法元素是维护参考帧队列的重要依据。参考帧队列的复杂的维护机制是 H.264 重要也是很有特色的组成部分  
    num_ref_idx_l0_active_minus1   
    num_ref_idx_l1_active_minus1  
    // weighted_pred_flag  用以指明是否允许P和SP片的加权预测,如果允许,在片头会出现用以计算加权预测的句法元素。 
   weighted_pred_flag    
    // weighted_bipred_flag   用以指明是否允许 B 片的加权预测,本句法元素等于 0 时表示使用默认加权预测模式,等于 1 时表示使用显式加权预测模式,等于 2 时表示使用隐式加权预测模式。  
    weighted_bipred_idc    
    // pic_init_qp_minus26  加 26 后用以指明亮度分量的量化参数的初始值。在 H.264 中,量化参数分三个级别给出:图像参数集、片头、宏块。在图像参数集给出的是一个初始值。 
    pic_init_qp_minus26    /* relative to 26 */    
    pic_init_qs_minus26    /* relative to 26 */   
    // chroma_qp_index_offset   色度分量的量化参数是根据亮度分量的量化参数计算出来的,本句法元素用以指明计算时用到的参数。 
    chroma_qp_index_offset    
   // deblocking_filter_control_present_flag  编码器可以通过句法元素显式地控制去块滤波的强度,本句法元素指明是在片头是否会有句法元素传递这个控制信息。如果本句法元素等于 0,那些用于传递滤波强度的句法元素不会出现,解码器将独立地计算出滤波强度。 
    deblocking_filter_control_present_flag   
    // constrained_intra_pred_flag  在 P 和 B 片中,帧内编码的宏块的邻近宏块可能是采用的帧间编码。当本句法元素等于 1 时,表示帧内编码的宏块不能用帧间编码的宏块的像素作为自己的预测,即帧内编码的宏块只能用邻近帧内编码的宏块的像素作为自己的预测;而本句法元素等于 0 时,
    //表示不存在这种限制。 
    constrained_intra_pred_flag   
    // redundant_pic_cnt_present_flag 指明是否会出现 redundant_pic_cnt  句法元素。 
    redundant_pic_cnt_present_flag   
    rbsp_trailing_bits( )        
}
  
  -----------------------------------------------------------------------------
  H.264  SPS/PPS成员值含义(转) (2011-04-01 15:14:38)转载▼
标签: 转载
原文地址: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()在码流中不存在。




帧格式

H264帧由NALU头和NALU主体组成。
NALU头由一个字节组成,它的语法如下:

      +---------------+
      |0|1|2|3|4|5|6|7|
      +-+-+-+-+-+-+-+-+
      |F|NRI|  Type   |
      +---------------+

F: 1个比特.
  forbidden_zero_bit. 在 H.264 规范中规定了这一位必须为 0.

NRI: 2个比特.
  nal_ref_idc. 取00~11,似乎指示这个NALU的重要性,如00的NALU解码器可以丢弃它而不影响图像的回放,0~3,取值越大,表示当前NAL越重要,需要优先受到保护。如果当前NAL是属于参考帧的片,或是序列参数集,或是图像参数集这些重要的单位时,本句法元素必需大于0。

Type: 5个比特.
  nal_unit_type. 这个NALU单元的类型,1~12由H.264使用,24~31由H.264以外的应用使用,简述如下:

  0     没有定义
  1-23  NAL单元  单个 NAL 单元包
  1     不分区,非IDR图像的片
  2     片分区A
  3     片分区B
  4     片分区C
  5     IDR图像中的片
  6     补充增强信息单元(SEI)
  7     SPS
  8     PPS
  9     序列结束
  10    序列结束
  11    码流借宿
  12    填充
  13-23 保留

  24    STAP-A   单一时间的组合包
  25    STAP-B   单一时间的组合包
  26    MTAP16   多个时间的组合包
  27    MTAP24   多个时间的组合包
  28    FU-A     分片的单元
  29    FU-B     分片的单元
  30-31 没有定义

AUD

        一般文档没有对AUD进行描叙,其实这是一个帧开始的标志,字节顺序为:00 00 00 01 09 f0
从结构上看,有start code, 所以确实是一个NALU,类型09在H264定义里就是AUD(分割器)。大部分播放器可以在没有AUD的情况下正常播放。

        紧随AUD,一般是SPS/PPS/SEI/IDR的组合或者简单就是一个SLICE,也就是一个帧的开始。像Flash这样的播放器,每次需要一个完整的帧数据,那么把2个AUD之间的数据按照格式打包给播放器就可以了。

H.264编码时,在每个NAL前添加起始码 0x000001,解码器在码流中检测到起始码,当前NAL结束。为了防止NAL内部出现0x000001的数据,h.264又提出'防止竞争 emulation prevention"机制,在编码完一个NAL时,如果检测出有连续两个0x00字节,就在后面插入一个0x03。当解码器在NAL内部检测到0x000003的数据,就把0x03抛弃,恢复原始数据。
   0x000000  >>>>>>  0x00000300
   0x000001  >>>>>>  0x00000301
   0x000002  >>>>>>  0x00000302
   0x000003  >>>>>>  0x00000303

        总的来说H264的码流的打包方式有两种,一种为annex-b byte stream format 的格式,这个是绝大部分编码器的默认输出格式,就是每个帧的开头的3~4个字节是H264的start_code,0x00000001或者0x000001。
另一种是原始的NAL打包格式,就是开始的若干字节(1,2,4字节)是NAL的长度,而不是start_code,此时必须借助某个全局的数据来获得编 码器的profile,level,PPS,SPS等信息才可以解码。

SPS,PPS的解析

SPS
profile_idc和level_idc是指比特流所遵守的配置和级别。

constraint_set0_flag 等于1是指比特流遵从某节中的所有规定。constraint_set0_flag 等于0是指该比特流可以遵从也可以不遵从某节中的所有规定。当profile_idc等于100、110、122或144时,constraint_set0_flag、constraint_set1_flag和constraint_set2_flag都应等于0。

log2_max_frame_num_minus4的值应在0-12范围内(包括0和12),这个句法元素主要是为读取另一个句法元素 frame_num  服务的,frame_num  是最重要的句法元素之一,它标识所属图像的解码顺序 。这个句法元素同时也指明了 frame_num 的所能达到的最大值: MaxFrameNum = 2*exp( log2_max_frame_num_minus4 + 4 ) 。

pic_order_cnt_type 是指解码图像顺序的计数方法。pic_order_cnt_type 的取值范围是0到2(包括0和2)。

log2_max_pic_order_cnt_lsb_minus4表示用于某节规定的图像顺序数解码过程中的变量MaxPicOrderCntLsb的值,

num_ref_frames规定了可能在视频序列中任何图像帧间预测的解码过程中用到的短期参考帧和长期参考帧、互补参考场对以及不成对的参考场的最大数量。num_ref_frames 的取值范围应该在0到MaxDpbSize。

gaps_in_frame_num_value_allowed_flag 表示某节给出的frame_num 的允许值以及在某节给出的frame_num 值之间存在推测的差异的情况下进行的解码过程。

pic_width_in_mbs_minus1加1是指以宏块为单元的每个解码图像的宽度。
pic_height_in_map_units_minus1 的语义依赖于变量frame_mbs_only_flag,规定如下:-— 如果 frame_mbs_only_flag 等于0,

pic_height_in_map_units_minus1加1就表示以宏块为单位的一场的高度。-— 否则(frame_mbs_only_flag等于1),pic_height_in_map_units_minus1加1就表示

以宏块为单位的一帧的高度。变量 FrameHeightInMbs 由下列公式得出:FrameHeightInMbs = ( 2 – frame_mbs_only_flag ) * PicHeightInMapUnits。

mb_adaptive_frame_field_flag 等于0表示在一个图像的帧和场宏块之间没有交换。mb_adaptive_frame_field_flag 等于1表示在帧和帧内的场宏块之间可能会有交换。当mb_adaptive_frame_field_flag没有特别规定时,默认其值为0。

direct_8x8_inference_flag 表示在某节中规定的B_Skip、B_Direct_16x16和B_Direct_8x8亮度运动矢量的计算过程使用的方法。当frame_mbs_only_flag 等于0时

direct_8x8_inference_flag 应等于1。

frame_cropping_flag 等于1表示帧剪切偏移参数遵从视频序列参数集中的下一个值。frame_cropping_flag 等于0表示不存在帧剪切偏移参数。

vui_parameters_present_flag 等于1 表示存在如附录E 提到的vui_parameters( ) 语法结构。vui_parameters_present_flag 等于0表示不存在如附录E提到的vui_parameters( ) 语法结构。

PPS 
seq_parameter_set_id是指活动的序列参数集。变量seq_parameter_set_id的值应该在0到31的范围内(包括0和31)。

entropy_coding_mode_flag 用于选取语法元素的熵编码方式,在语法表中由两个标识符代表,具体如下:如果entropy_coding_mode_flag 等于0,那么采用语法表中左边的描述符所指定的方法。
pic_order_present_flag等于1 表示与图像顺序数有关的语法元素将出现于条带头中,pic_order_present_flag 等于0表示条带头中不会出现与图像顺序数有关的语法元素。

num_slice_groups_minus1加1表示一个图像中的条带组数。当num_slice_groups_minus1 等于0时,图像中所有的条带属于同一个条带组。

num_ref_idx_l0_active_minus1表示参考图像列表0 的最大参考索引号,该索引号将用来在一幅图像中num_ref_idx_active_override_flag 等于0 的条带使用列表0 预测时,解码该图像的这些条带。当MbaffFrameFlag等于1时,num_ref_idx_l0_active_minus1 是帧宏块解码的最大索引号值,而2 *num_ref_idx_l0_active_minus1 + 1是场宏块解码的最大索引号值。num_ref_idx_l0_active_minus1 的值应该在0到31的范围内(包括0和31)。

weighted_pred_flag等于0表示加权的预测不应用于P和SP条带。weighted_pred_flag等于1表示在P和SP条带中应使用加权的预测。

weighted_bipred_idc等于0表示B条带应该采用默认的加权预测。weighted_bipred_idc等于1表示B条带应该采用具体指明的加权预测。weighted_bipred_idc 等于2表示B 条带应该采用隐含的加权预测。
weighted_bipred_idc 的值应该在0到2之间(包括0和2)。

pic_init_qp_minus26表示每个条带的SliceQPY 初始值减26。当解码非0值的slice_qp_delta 时,该初始值在条带层被修正,并且在宏块层解码非0 值的mb_qp_delta 时进一步被修正。pic_init_qp_minus26 的值应该在-(26 + QpBdOffsetY ) 到 +25之间(包括边界值)。

pic_init_qs_minus26表示在SP 或SI 条带中的所有宏块的SliceQSY 初始值减26。当解码非0 值的slice_qs_delta 时,该初始值在条带层被修正。pic_init_qs_minus26 的值应该在-26 到 +25之间(包括边界值)。

chroma_qp_index_offset表示为在QPC 值的表格中寻找Cb色度分量而应加到参数QPY 和 QSY 上的偏移。chroma_qp_index_offset的值应在-12 到 +12范围内(包括边界值)。

deblocking_filter_control_present_flag等于1 表示控制去块效应滤波器的特征的一组语法元素将出现在条带头中。deblocking_filter_control_present_flag 等于0 表示控制去块效应滤波器的特征的一组语法元素不会出现在条带头中,并且它们的推定值将会生效。

constrained_intra_pred_flag等于0 表示帧内预测允许使用残余数据,且使用帧内宏块预测模式编码的宏块的预测可以使用帧间宏块预测模式编码的相邻宏块的解码样值。constrained_intra_pred_flag 等于1 表示受限制的帧内预测,在这种情况下,使用帧内宏块预测模式编码的宏块的预测仅使用残余数据和来自I或SI宏块类型的解码样值。

redundant_pic_cnt_present_flag等于0 表示redundant_pic_cnt 语法元素不会在条带头、图像参数集中指明(直接或与相应的数据分割块A关联)的数据分割块B和数据分割块C中出现。redundant_pic_cnt_present_flag等于1表示redundant_pic_cnt 语法元素将出现在条带头、图像参数集中指明(直接或与相应的数据分割块A关联)的数据分割块B和数据分割块C中。

分包

h264包在传输的时候,如果包太大,会被分成多个片。NALU头会被如下的2个自己代替。

The FU indicator octet has the following format:

      +---------------+
      |0|1|2|3|4|5|6|7|
      +-+-+-+-+-+-+-+-+
      |F|NRI|  Type   |
      +---------------+

   别被名字吓到这个格式就是上面提到的RTP h264负载类型,Type为FU-A

The FU header has the following format:

      +---------------+
      |0|1|2|3|4|5|6|7|
      +-+-+-+-+-+-+-+-+
      |S|E|R|  Type   |
      +---------------+

   S bit为1表示分片的NAL开始,当它为1时,E不能为1
   E bit为1表示结束,当它为1,S不能为1

   R bit保留位

   Type就是NALU头中的Type,取1-23的那个值









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值