H.264句法和语法总结(二)NAL层句法

来源:互联网 发布:注册域名送空间 编辑:程序博客网 时间:2024/05/17 06:46

  NAL&VCL: H.264 的功能分为两层,即视频编码层(VCL)和网络提取层(NAL,Network Abstraction Layer)。VCL 数据即编码处理的输出,它表示被压缩编码后的视频数据序列。在 VCL 数据传输或存储之前,这些编码的 VCL 数据,先被映射或封装进 NAL 单元中。  
      每个 NAL 单元包括一个原始字节序列负荷(RBSP)、一组对应于视频编码数据的 NAL 头信息。NAL 单元序列的结构如下:

264句法元素的分层结构

     RBSP的类型:

RBSP 类型描            述参数集 PS序列的全局参数,如图像尺寸、视频格式等等增强信息 SEI视频序列解码的增强信息图像定界符 PD视频图像的边界编码片片的头信息和数据数据分割DP 片层的数据,用于错误恢复解码序列结束符表明下一图像为 IDR 图像流结束符表明该流中已没有图像填充数据哑元数据,用于填充字节

      PS: 包括序列参数集 SPS 和图像参数集 PPS 
            SPS 包含的是针对一连续编码视频序列的参数,如标识符 seq_parameter_set_id、帧数及 POC 的约束、参考帧数目、解码图像尺寸和帧场编码模式选择标识等等。 
            PPS对应的是一个序列中某一幅图像或者某几幅图像,其参数如标识符 pic_parameter_set_id、可选的 seq_parameter_set_id、熵编码模式选择标识、片组数目、初始量化参数和去方块滤波系数调整标识等等。 
      数据分割:组成片的编码数据存放在 3 个独立的 DP(数据分割,A、B、C)中,各自包含一个编码片的子集。分割A包含片头和片中每个宏块头数据。分割B包含帧内和 SI 片宏块的编码残差数据。分割 C包含帧间宏块的编码残差数据。每个分割可放在独立的 NAL 单元并独立传输。

NAL 层句法 : 
nal_unit( NumBytesInNALunit ) {  
    // forbidden_zero_bit  等于 0 
    forbidden_zero_bit   
    // nal_ref_idc   指示当前 NAL 的优先级。取值范围为 0-3,  值越高,表示当前 NAL 越重要,需要优先受到保护。H.264 规定如果当前 NAL 是属于参考帧的片,或是序列参数集,或是图像参数集这些重要的数据单位时,本句法元素必须大于 0。    
    nal_ref_idc   
    
// nal_unit_type 指明当前 NAL unit 的类型 
    nal_unit_type  
    NumBytesInRBSP = 0  
    /* rbsp_byte[i]    RBSP 的第 i 个字节。RBSP 指原始字节载荷,它是 NAL 单元的数据部分的封装格式,封装的数据来自 SODB(原始数据比特流)。SODB 是编码后的原始数据,SODB 经封装为 RBSP 后放入 NAL 的数据部分。下面介绍一个 RBSP 的生成顺序。 
        从 SODB 到 RBSP 的生成过程: 
        -      如果 SODB 内容是空的,生成的 RBSP 也是空的 
        -      否则,RBSP 由如下的方式生成: 
       1) RBSP 的第一个字节直接取自 SODB 的第 1 到 8 个比特,(RBSP 字节内的比特按照从左到右对应为从高到低的顺序排列,most  significant),以此类推,RBSP 其余的每个字节都直接取自 SODB的相应比特。RBSP  的最后一个字节包含 SODB  的最后几个比特,及如下的 rbsp_trailing_bits() 
       2) rbsp_trailing_bits()的第一个比特是 1,接下来填充 0,直到字节对齐。(填充 0 的目的也是为了字节对齐) 
       3) 最后添加若干个 cabac_zero_word(其值等于 0x0000)            
    */ 
    for( i = 1; i < NumBytesInNALunit; i++ ) {           
        if( i + 2 < NumBytesInNALunit && next_bits( 24 )    = =    0x000003 ) {          
            rbsp_byte[ NumBytesInRBSP++ ]   
            rbsp_byte[ NumBytesInRBSP++ ]   
            i += 2           
            //emulation_prevention_three_byte      NAL 内部为防止与起始码竞争而引入的填充字节  ,值为 0x03。 
            emulation_prevention_three_byte    
        } else           
            rbsp_byte[ NumBytesInRBSP++ ]    
    }          
}

0 0
原创粉丝点击