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

相关文章

字节面试 | 如何测试RocketMQ、RocketMQ?

字节面试:RocketMQ是怎么测试的呢? 答: 首先保证消息的消费正确、设计逆向用例,在验证消息内容为空等情况时的消费正确性; 推送大批量MQ,通过Admin控制台查看MQ消费的情况,是否出现消费假死、TPS是否正常等等问题。(上述都是临场发挥,但是RocketMQ真正的测试点,还真的需要探讨) 01 先了解RocketMQ 作为测试也是要简单了解RocketMQ。简单来说,就是一个分

C++语法知识点合集:11.模板

文章目录 一、非类型模板参数1.非类型模板参数的基本形式2.指针作为非类型模板参数3.引用作为非类型模板参数4.非类型模板参数的限制和陷阱:5.几个问题 二、模板的特化1.概念2.函数模板特化3.类模板特化(1)全特化(2)偏特化(3)类模板特化应用示例 三、模板分离编译1.概念2.模板的分离编译 模版总结 一、非类型模板参数 模板参数分类类型形参与非类型形参 非类型模板

Java基础回顾系列-第一天-基本语法

基本语法 Java基础回顾系列-第一天-基本语法基础常识人机交互方式常用的DOS命令什么是计算机语言(编程语言) Java语言简介Java程序运行机制Java虚拟机(Java Virtual Machine)垃圾收集机制(Garbage Collection) Java语言的特点面向对象健壮性跨平台性 编写第一个Java程序什么是JDK, JRE下载及安装 JDK配置环境变量 pathHe

Hibernate框架中,使用JDBC语法

/*** 调用存储过程* * @param PRONAME* @return*/public CallableStatement citePro(final String PRONAME){Session session = getCurrentSession();CallableStatement pro = session.doReturningWork(new ReturningWork<C

ORACLE语法-包(package)、存储过程(procedure)、游标(cursor)以及java对Result结果集的处理

陈科肇 示例: 包规范 CREATE OR REPLACE PACKAGE PACK_WMS_YX IS-- Author : CKZ-- Created : 2015/8/28 9:52:29-- Purpose : 同步数据-- Public type declarations,游标 退休订单TYPE retCursor IS REF CURSOR;-- RETURN vi_co_co

ElasticSearch的DSL查询⑤(ES数据聚合、DSL语法数据聚合、RestClient数据聚合)

目录 一、数据聚合 1.1 DSL实现聚合 1.1.1 Bucket聚合  1.1.2 带条件聚合 1.1.3 Metric聚合 1.1.4 总结 2.1 RestClient实现聚合 2.1.1 Bucket聚合 2.1.2 带条件聚合 2.2.3 Metric聚合 一、数据聚合 聚合(aggregations)可以让我们极其方便的实现对数据的统计、分析、运算。例如:

react笔记 8-16 JSX语法 定义数据 数据绑定

1、jsx语法 和vue一样  只能有一个根标签 一行代码写法 return <div>hello world</div> 多行代码返回必须加括号 return (<div><div>hello world</div><div>aaaaaaa</div></div>) 2、定义数据 数据绑定 constructor(){super()this.state={na

python基础语法十一-赋值、浅拷贝、深拷贝

书接上回: python基础语法一-基本数据类型 python基础语法二-多维数据类型 python基础语法三-类 python基础语法四-数据可视化 python基础语法五-函数 python基础语法六-正则匹配 python基础语法七-openpyxl操作Excel python基础语法八-异常 python基础语法九-多进程和多线程 python基础语法十-文件和目录操作

JVM - 字节码文件详解

文章目录 目录 文章目录 1. 无关性基石 2. Class类文件结构 magic- 魔数 主副版本号 常量池 访问标志 类索引,父类索引与接口索引集合 字段 方法 属性 3. 类加载机制 类的生命周期 类加载过程 加载 连接 验证 准备 解析 初始化 4. 类加载器 类与类加载器 类加载器的分类 启动类加载器  扩展类加载器 应用程序类加

python进阶篇-day07-高级语法与正则

day07-python其他高级语法 一. with(上下文管理) 介绍 概述 一个类只要实现了__ enter __ () 和 __ exit __ ()方法, 这个类就是一个上下文管理器类, 该类的对象 = 上下文管理器对象 目的 节约资源, 提高效率, 避免手动释放资源, 且出bug的时候, 也会自动尝试释放资源 特点 上下文管理器对象, 可以结合with语句使用