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

2024-03-20 23:48
文章标签 语法 字节 h.264 nal 语意

本文主要是介绍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

未指定

 

这篇关于H.264 NAL语法语意以及字节流的语法语意的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/831133

相关文章

mysql递归查询语法WITH RECURSIVE的使用

《mysql递归查询语法WITHRECURSIVE的使用》本文主要介绍了mysql递归查询语法WITHRECURSIVE的使用,WITHRECURSIVE用于执行递归查询,特别适合处理层级结构或递归... 目录基本语法结构:关键部分解析:递归查询的工作流程:示例:员工与经理的层级关系解释:示例:树形结构的数

Java使用Stream流的Lambda语法进行List转Map的操作方式

《Java使用Stream流的Lambda语法进行List转Map的操作方式》:本文主要介绍Java使用Stream流的Lambda语法进行List转Map的操作方式,具有很好的参考价值,希望对大... 目录背景Stream流的Lambda语法应用实例1、定义要操作的UserDto2、ListChina编程转成M

Java实现按字节长度截取字符串

《Java实现按字节长度截取字符串》在Java中,由于字符串可能包含多字节字符,直接按字节长度截取可能会导致乱码或截取不准确的问题,下面我们就来看看几种按字节长度截取字符串的方法吧... 目录方法一:使用String的getBytes方法方法二:指定字符编码处理方法三:更精确的字符编码处理使用示例注意事项方

Python正则表达式语法及re模块中的常用函数详解

《Python正则表达式语法及re模块中的常用函数详解》这篇文章主要给大家介绍了关于Python正则表达式语法及re模块中常用函数的相关资料,正则表达式是一种强大的字符串处理工具,可以用于匹配、切分、... 目录概念、作用和步骤语法re模块中的常用函数总结 概念、作用和步骤概念: 本身也是一个字符串,其中

Mysql用户授权(GRANT)语法及示例解读

《Mysql用户授权(GRANT)语法及示例解读》:本文主要介绍Mysql用户授权(GRANT)语法及示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql用户授权(GRANT)语法授予用户权限语法GRANT语句中的<权限类型>的使用WITH GRANT

HTML5表格语法格式详解

《HTML5表格语法格式详解》在HTML语法中,表格主要通过table、tr和td3个标签构成,本文通过实例代码讲解HTML5表格语法格式,感兴趣的朋友一起看看吧... 目录一、表格1.表格语法格式2.表格属性 3.例子二、不规则表格1.跨行2.跨列3.例子一、表格在html语法中,表格主要通过< tab

Java使用ANTLR4对Lua脚本语法校验详解

《Java使用ANTLR4对Lua脚本语法校验详解》ANTLR是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件,下面就跟随小编一起看看Java如何使用ANTLR4对Lua脚本... 目录什么是ANTLR?第一个例子ANTLR4 的工作流程Lua脚本语法校验准备一个Lua Gramm

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字

Python基础语法中defaultdict的使用小结

《Python基础语法中defaultdict的使用小结》Python的defaultdict是collections模块中提供的一种特殊的字典类型,它与普通的字典(dict)有着相似的功能,本文主要... 目录示例1示例2python的defaultdict是collections模块中提供的一种特殊的字

C++ 中的 if-constexpr语法和作用

《C++中的if-constexpr语法和作用》if-constexpr语法是C++17引入的新语法特性,也被称为常量if表达式或静态if(staticif),:本文主要介绍C++中的if-c... 目录1 if-constexpr 语法1.1 基本语法1.2 扩展说明1.2.1 条件表达式1.2.2 fa