H.264 NAL语法语意以及字节流的语法语意

(参考 ITU-T H.264 建议2005年3月 第四版 )


一、H.264的产生背景和目的:

     随着处理能力和存储容量价格的下降,网络所能支持的编码视频数据的多样化,以及视频编码技术的进步,对具有较高压缩效率,并且有更好的网络健壮性的视频压缩和表示的工业标准的需求非常迫切。

     为此,ITU-T 视频编码专家组(VCEG) ISO/IEC 运动图像专家组(MPEG) 2001 年成立了联合视频小组(JVT),致力于开发一个新的标准。 

        标准的目的是为了满足视频会议、数字存储媒体、电视广播、网络流媒体和通信等各种应用对高压缩比运动图像压缩日益迫切的需求而制定的。同时也是为不同的网络环境中的应用设计一种灵活的编码数据表示方式。

        标准使运动视频能够作为一种计算机数据被处理,因而可以存储在各种不同的存储媒体上,能够在当前和未来网络上传送和接收,并且在现有和将来的广播信道上分配。


二、VCL和NAL的关系

            1、VCL是为了有效的表示视频数据的内容。

         2、NAL则是为了格式化数据,并以适用于存储介质或在多 种通信信道上传输的格式提供头信息。

         3、NAL单元中包含了所有的数据,每个NAL单元都包含整数字节。

         4、NAL单元是一种既适用于面向分组系统又适用于比特流系统的通用格式。用于分组传输和字节流的NAL单元的格式是一 样的,不过字节流格式中的每个NAL单元前可以有一个起始码前缀和额外填充字节。


三、NAL语法、语意中使用的语法函数、描述符的定义

(一)、函数部分

1、byte_aligned( ) 

        如果比特流的当前位置是在字节边界,,比特流中的下一比特是字节第一个比特,byte_aligned( )的返回值为TRUE 否则,返回FALSE。

2、more_data_in_byte_stream( ),

       如果字节流中后续还有更多数据,more_data_in_byte_stream( )的返回值为TRUE 否则,返回FALSE。

3、more_rbsp_data( ) 

       如果在rbsp_trailing_bits( )之前的RBSP中有更多数据,more_rbsp_data( ) 的返回值为TRUE 。否则,返回FALSE。

4、more_rbsp_trailing_data( ) 

        如果RBSP中有更多数据,more_rbsp_trailing_data( ) 的返回值为TRUE 否则,返回FALSE。

5、next_bits(n) 

      提供比特流中接下来的比特用于比较的目的,而不需要移动比特流指针。该函数使比特流中的下 n 个比特可见,n 在这里是函数的参数。当用在附件 B 规定的字节流中时,如果剩余的字节流已不足 n 个比特, next_bits( n )返回值为 0

6、read_bits( n ) 

       从比特流中读取下面的 n 个比特,并且将比特流指针向前移动 n 个比特。当 n 等于 0 , read_bits( n )的返回值为 0 并且不移动比特流指针。 

(二)、描述符部分

描述符规定了语法元素解析处理。对于某些语法元素,需使用通过线分开的两个描述符

这些情况下,左边描述符entropy_coding_mode_flag 等于 0 的时使用,右边描述符entropy_coding_mode_flag 等于 1 的时使用。


1、 ae(v):上下文自适应算术编码语法元素

2、b(8):任意式的8比特字节。该描述符解析过程通过read_bits( 8 )返回来定义。

3、ce(v):左位的上下文自适应可变长编码语法元素

4、f(n):n式比特串(由),左位, 该描述符解析过程通过read_bits( n )返回来定义。

5、i(n):使用n比特的有符号整数。在语法表中,如果nv,比特数由其它语法元素值定。解析过程由read_bits(n)返回规定,返回用最高有效在前的码表示。 

6、me(v):映射的指数哥伦布码编码的语法元素,左位在先。 

7、se(v):有符号整数指数哥伦布码编码的语法元素位在先。 

8、te(v):舍位指数哥伦布码编码语法元素,左位在先。

9、u(n):n位无符号整数。在语法表中,如果n‘v’,其比特数由其它语法元素值确定。解析过程由函 read_bits(n)的返回值规定,该返回值用最高有效位在前的二进制表示。

10、ue(v):无符号整数指数哥伦布码编码的语法元素,左位在先。 


四、NAL Unit 语法 

(表中的类别会在后面类别中单独说明)

nal_unit ( NumBytesInNALunit ) {

类别

描述符

      forbidden_zero_bit

All      

f(1)

      nal_ref_idc                                                                                                              

All

u(2)

      nal_unit_type

All

u(5)

      NumBytesInRBSP = 0

  

      for( i = 1; i < NumBytesInNALunit; i++ ) {

  

              if( i + 2 < NumBytesInNALunit && next_bits( 24 ) = = 0x000003 ) {

  

                     rbsp_byte[ NumBytesInRBSP++ ]

All

b(8)

                     rbsp_byte[ NumBytesInRBSP++ ]

All

b(8)

                     i += 2

  

                     emulation_prevention_three_byte /* equal to 0x03 */

All

f(8)

            } else

  

                    rbsp_byte[ NumBytesInRBSP++ ]

All

b(8)

        }

  

}

  

五、NAL Unit 语意

       VCL是为了有效的表示视频数据的内容。NAL则是为了格式化数据,并以适用于存储介质或在多种通信信道上传输的格式提供头信息。

        NAL单元中包含了所有的数据,每个NAL单元都包含整数字节。NAL单元是一种既适用于面向分组系统又适用于比特流系统的通用格式。用于分组传输和字节流的NAL单元的格式是一 样的,不过字节流格式中的每个NAL单元前可以有一个起始码前缀和额外填充字节。

1、 语法中的 NumBytesInNALunit 定义 NAL 单元的大小,单位是字节。

        在 NAL 单元解码时需要用到该值。为了能够推 导出 NumBytesInNALunit,需要对 NAL 单元的边界进行划分。

2、forbidden_zero_bit 永远 0,占一个bit。

3、 nal_ref_idc   根据nal_unit_type设定值,占2个bit,取值范围 00,01,10,11即 0~3。

4、nal_unit_type 指定包含在NAL Unit中的RBSP 的数据结构类型。

如下表所示。

5、rbsp_byte[ i ]  是一个 RBSP 的第 i 个字节。一个 RBSP 定义为以字节为单位的、有顺序的序列。

       RBSP 包含一个 SODB,过程如下:

              如果 SODB 为空(例如:长度是 0 比特),那么RBSP也为空。 

              否则 RBSP 包括如下 SODB

                     1)RBSP 的第一个字节包括(最高位的,最左边的)8 比特的 SODB;RBSP 的下一个字节应包括接下来 8 比特的 SODB,等等,直到剩下的 SODB 少于 8 比特。

                     2)rbsp_trailing_bits( )用于 SODB 之后,如下:

                                i)最后 RBSP 字节的第 1 个的(最高位的,最左边的)比特包括 SODB 的剩下的比特(如果有的)

                                ii)下一个比特为单个 rbsp_stop_one_bit,其值为 1,并且

                                iii) rbsp_stop_one_bit 不是一个字节对齐的字节的最后一个比特时,一个或更多的 rbsp_alignment_zero_bit 就会出现以形成一个字节对齐。

                     3)在某些 RBSP 结尾的 rbsp_trailing_bits( )之后,可以出现值为 0x0000 的一个或多个 16 比特的语法元 cabac_zero_word

6、emulation_prevention_three_byte 是一个等于 0x03 的字节。

当一个 emulation_prevention_three_byte 出现在 NAL 单元中时,应该被解码过程丢弃。 

原理分析:

首先、NAL 单元的最后一个字节不能等于 0x00
因此,在 NAL 单元中,下面的三字节序列不应在任何字节对齐的位置出现:

    0x000000

    0x000001

    0x000002

所以在上面的序列中,第三个字节加入 0x03,改造成下面的形式。

在一个 NAL 单元中,除了下列序列,任何以 0x000003 开头的四字节的序列都不能出现在任何字节对齐的位置

    0x00000300

    0x00000301

    0x00000302

    0x00000303



type

NAL Unit  RBSP 语法结构的内容                                                                     

类别

0

未指定

 

1

一个非 IDR 图像的编码条带slice_layer_without_partitioning_rbsp( )

2, 3, 4

2

编码条带数据分割块 Aslice_data_partition_a_layer_rbsp( )

2

3

编码条带数据分割块 Bslice_data_partition_b_layer_rbsp( )

3

4

编码条带数据分割块 Cslice_data_partition_c_layer_rbsp( )

4

5

IDR 图像的编码条带slice_layer_without_partitioning_rbsp( )

2, 3

6

辅助增强信息 (SEI)sei_rbsp( )

5

7

序列参数集

seq_parameter_set_rbsp( )

0

8

图像参数集

pic_parameter_set_rbsp( )

1

9

访问单元分隔符

access_unit_delimiter_rbsp( )

6

10

序列结尾

end_of_seq_rbsp( )

7

11

流结尾

end_of_stream_rbsp( )

8

12

填充数据

filler_data_rbsp( )

9

13

序列参数集扩展

seq_parameter_set_extension_rbsp( )

10

14..18

保留

 

19

未分割的辅助编码图像的编码条带

slice_layer_without_partitioning_rbsp( )

2, 3, 4

20..23

保留

 

24..31

未指定

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值