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

相关文章

hevc和H.264格式的区别

HEVC(High Efficiency Video Coding)和H.264(也称为Advanced Video Coding,AVC)都是视频压缩标准,但它们之间存在一些显著的区别,主要集中在压缩效率、资源需求和兼容性方面。 压缩效率 HEVC,也被称为H.265,提供了比H.264更高的压缩效率。这意味着在相同的视频质量下,HEVC能够以大约一半的比特率进行编码,从而减少存储空间需求和

UE3脚本UnrealScript UC语法点滴

持续更新 目录 类定义修饰符  1.dependson(CLASSNAME) 2.config(ININAME) 3.native 4.notplaceable 5.inherits(CLASSNAME1[,CLASSNAME2,...]) 类对象实例创建 类默认属性设置 变量 1.声明 var local 2.修饰符 config  3.array 类型变量 以及

PHP的基本语法有哪些?

PHP的基本语法包括以下几个方面: PHP标记:PHP脚本以<?php开始,以?>结束。这是PHP文件的默认文件扩展名是.php。 变量和常量:变量以$符号开头,其后是变量的名称。常量使用define()函数定义,例如define("常量名", 常量值);。 数据类型:PHP支持多种数据类型,如整型、浮点型、字符串型等。 注释:PHP支持单行注释(用//表示)和多行注释(用/* */表示

Flex 布局教程:语法篇

网页布局(layout)是 CSS 的一个重点应用。 布局的传统解决方案,基于盒状模型,依赖 display 属性 + position属性 + float属性。它对于那些特殊布局非常不方便,比如,垂直居中就不容易实现。 20

Java——IO流(一)-(5/8):IO流概述、字节流-FileInputStream 每次读取一个字节

IO流概述 介绍 输入输出流,用于读写数据。 I指Input,称为输入流:负责把数据读到内存中去。 O指Output,称为输出流:负责写数据出去。 IO流的应用场景 文件内容的读写永久保存应用数据复制粘贴对话通信等等 怎么学IO流 理清楚IO六点分类和体系循序渐进、深入学习每个IO流的作用和用法 IO流的分类 IO流总体来看就有四大类: 字节输入流:以内存

Java代理-动态字节码生成代理的5种方式

上篇讲到了代理模式出现的原因,实现方式以及跟其他相似设计模式的区别。传送门@_@ http://blog.csdn.net/wonking666/article/details/79497547 1.静态代理的不足 设计模式里面的代理模式,代理类是需要手动去写的。但是手写代理的问题颇多 1.如果不同类型的目标对象需要执行同样一套代理的逻辑,比如说在方法调用前后打印参数和结果,那么仍然需要为每

Linux平台与Windows平台字节对齐(一)

记录时间:2014-10-20 20:31 今天白天在整理 winndows平台 + Arm平台的网络数据包。但期间由于经验不足,不了解两平台CPU架构的差距会影响到数据类型的大小,导致在工程非常紧急的时间里还浪费了很多宝贵的时间,鉴于问题的常见性 和 隐秘行,特此列出,以便能帮助需要帮助的人。 解决问题思路:在遇到网络交互数据不对时,可以从如下四方面去排除问题,通常只要使用这三种

Shell语法全解

Shell基础语法全解 一、shell简介二、shell格式2.1 新建一个shell脚本文件2.2 执行脚本方式 三、变量3.1系统变量3.2自定义变量3.3 特殊变量3.3.1 `$n` 传入变量3.3.2 `$#` 输入参数个数3.3.3 `$*`、`$@` 输入参数内容3.3.4 `$?` 上一条命令执行结果 四、运算符 `$[]`、`$(())`五、条件判断5.1判断数值大小5.

全面分析一下前端框架Angular的来龙去脉,分析angular的技术要点和难点,以及详细的语法和使用规则,底层原理-小白进阶之路

Angular 前端框架全面分析 Angular 是一个由 Google 维护的开源前端框架。它最早在 2010 年发布,最初版本称为 AngularJS。2016 年,团队发布了一个完全重写的版本,称为 Angular 2,之后的版本(如 Angular 4、Angular 5 等)都统称为 Angular。 一、历史背景 1. AngularJS(Angular 1.x) 发布年份:2

字符串到字节数组和字节数组到字符串的转换(编码和解码问题)

/*  * String(byte[] bytes, String charsetName):通过指定的字符集解码字节数组  * byte[] getBytes(String charsetName):使用指定的字符集合把字符串编码为字节数组  *  * 编码:把看得懂的变成看不懂的  * String -- byte[]  *  * 解码:把看不懂的变成看得懂的