本文主要是介绍H.264 NAL语法语意以及字节流的语法语意,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
(参考 ITU-T H.264 建议书 2005年3月 第四版 )
一、H.264的产生背景和目的:
随着处理能力和存储容量价格的下降,网络所能支持的编码视频数据的多样化,以及视频编码技术的进步,对具有较高压缩效率,并且有更好的网络健壮性的视频压缩和表示的工业标准的需求非常迫切。
为此,ITU-T 视频编码专家组(VCEG)和 ISO/IEC 运动图像专家组(MPEG)于 2001 年成立了联合视频小组(JVT),致力于开发一个新的标准。
标准的目的是为了满足视频会议、数字存储媒体、电视广播、网络流媒体和通信等各种应用对高压缩比运动图像压缩日益迫切的需求而制定的。同时也是为不同的网络环境中的应用设计一种灵活的编码数据表示方式。
标准使运动视频能够作为一种计算机数据被处理,因而可以存储在各种不同的存储媒体上,能够在当前和未来网络上传送和接收,并且在现有和将来的广播信道上分配。
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比特的有符号整数。在语法表中,如果n是‘v’,其比特数由其它语法元素值确定。解析过程由函数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 | 未指定 |
这篇关于H.264 NAL语法语意以及字节流的语法语意的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!