H.264句法和语法总结(三)序列参数集层(SPS)句法

seq_parameter_set_rbsp( ) { 
    // profile_idc  level_idc  指明所用  profile、level
    profile_idc  
    // constraint_set0_flag  等于 1 时表示必须遵从附录 A.2.1 所指明的所有制约条件。等于 0 时表示不必遵从所有条件。
    constraint_set0_flag  
    // constraint_set1_flag  等于 1 时表示必须遵从附录 A.2.2 所指明的所有制约条件。等于 0 时表示不必遵从所有条件。
    constraint_set1_flag   
    // constraint_set2_flag  等于 1 时表示必须遵从附录 A.2.3 所指明的所有制约条件。等于 0 时表示不必遵从所有条件。
   constraint_set2_flag  
   
// reserved_zero_5bits  在目前的标准中本句法元素必须等于 0,其他的值保留做将来用,解码器应该忽略本句法元素的值。
    reserved_zero_5bits /* equal to 0 */   
    level_idc     
    // seq_parameter_set_id  指明本序列参数集的  id 号,这个 id 号将被 picture 参数集引用,本句法元素的值应该在[0,31]。 
    seq_parameter_set_id   
    // log2_max_frame_num_minus4  这个句法元素主要是为读取另一个句法元素 frame_num  服务的,frame_num  是最重要的句法元素之一,它标识所属图像的解码顺序 。这个句法元素同时也指明了 frame_num 的所能达到的最大值: MaxFrameNum = 2*exp( log2_max_frame_num_minus4 + 4 )
    log2_max_frame_num_minus4  
    // 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( )       
}  

你可能感兴趣的:(H.264句法和语法总结(三)序列参数集层(SPS)句法)