H.264标准

学了两周的H.264,从白皮书到官方标准文档,再到源码都浏览了一下,觉得弃之可惜,所以将所学的东西记录一下,如果以后实验室再有人需要在这方面有所突破的时候作为一个入门的东西也不错。

关于H.264的来历及特点,大家可以参考上一篇帖子,那篇帖子的主要就是对白皮书的初步理解。而这篇帖子我主要说一下这一周对标准文档与代码的初步理解。

我们已经知道H.264没有规定编解码器,只是规定了编码的码流格式及一种解码方式。那么H.264码流是由什么组成的呢?这个答案是NALU(网络抽象层单元)。那么我们这里就得提到H.264编码的两个层面NAL(网络抽象层)VCL(视频编码层),VCL中包括VCL编码器与VCL解码器,主要功能是视频数据压缩编码和解码,它包括运动补偿、变换编码、熵编码等压缩单元。NAL则用于为VCL提供一个与网络无关的统一接口,它负责对视频数据进行封装打包后使其在网络中传送,它采用统一的数据格式,包括单个字节的包头信息、多个字节的视频数据与组帧、逻辑信道信令、定时信息、序列结束信号等。包头中包含存储标志和类型标志。存储标志用于指示当前数据不属于被参考的帧。类型标志用于指示图像数据的类型。我们可以这样理解,NAL的作用封装头部,而VCL是编码视频内容。知道了VCLNAL的含义,我们回到NALUNALU是一个单元,它是由头部及体组成的,那么头部是固定的(NAL提供),forbidden_zero_bit1比特)、nal_ref_idc2比特)、nal_unit_type5比特)。为什么是这样?因为标准就是这样规定的(标准第七章规定了语法,见标准粗体字),所以说在看代码的时候一定要结合标准,这样你不会纠结于变量间的顺序问题,因为编码标准就是那样规定的,所以解码顺序也就相应固定了。在解析完头部以后,接下来就是解析NALU体,NALU体由EBSP组成,那么什么是EBSP呢?EBSP是原始字节序列载荷(RBSP)加一个防止伪启示码的字节(0x03)组成的。这个EBSP是由VCL提供的。EBSP是由一个个的片组成的,片又由片头与片体组成。

在解码器中有一系列的函数来处理这些,其实这些函数的处理过程与标准第七章是对应的,标准第七章就是解码器伪代码。所以代码与标准不能分开来看,否则两者都看不懂。

 

在解码时我们可以有这样一条线在jm8.6中的ldecod.c中找到main函数,其中decode_one_frame()前面的不要管,都是一些初始化及内存开辟,进入decode_one_frame()后,我们会找到这么一个函数read_new_slice(),进入这个函数,我们会看到这么个函数GetAnnexbNALU()这个函数就是解析NALU单元的(这是字节码流)。进入这个函数以后我们会发现其实这个就是对应于标准7.3.1

nalu->forbidden_bit = (nalu->buf[0]>>7) & 1;        //+++++++++++++++++++++++++++

  nalu->nal_reference_idc = (nalu->buf[0]>>5) & 3;  //++ 该三值定义参见标准7.4.1

  nalu->nal_unit_type = (nalu->buf[0]) & 0x1f;         //+++++++++++++++++++++++++++

解析出了NALU头部,然后根据nal_unit_type的值在read_new_slice()中有case语句来进行相应的处理。根据标准第一个NALU必定是SPS(序列参数集),第二个必然是PPS(图片参数集)这是因为解码后面时需要用到这些参数,所以必定先解码。第三个有可能就是传说中的IDR图像。

那么我这里就可以解释上次留下的那个关于I-Frame 还是 I-Slice的问题了。

对于 H.264 中出现的一些概念从大到小排序依次是:序列、图像、(片组)、片、NALU、宏块、亚宏块、块、像素。

一般来说一副图像就一个片,而一个片如果不用数据分割方式(DP,既nal_unit_type2,3,4)的话由一个NALU组成的,那么从代码来看我们可以清晰的发现其实确实现在的处理是I-Slice的而不是I-Frame,那么IDR图像就是NALU全部为nal_unit_type5的图像。而这就是H.264的一种革新吧,在H.264协议中图像是个集合概念,顶场、低场、帧都可以称为图像,而我们则把图像概念具体和细化了,所以才会出现I-FrameP-Frame的称呼,其实这是不标准的。标准中表7-10提供了片的类型。然后宏块及亚宏块的类型也在标准中有相应的表格描述。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值