H264语法分析

一H.264句法 1.1元素分层结构
H.264编码器输出的Bit流中,每个Bit都隶属于某个句法元素 。句法元素被组织成有层次的结构,分别描述各个层次的信息 。
图1
H.264分层结构由五层组成,分别是序列参数集、图像参数集、片(Slice)、和宏块和子块 。参数集是一个独立的数据单位,不依赖于参数集外的其它句法元素 。图2描述了参数集与参数集外的句法元素之间的关系 。
图2
一个参数集不对应某一个特定的图像或序列,同一序列参数集可以被多个图像参数集引用,同理,同一个图像参数集也可以被多个图像引用 。只在编码器认为需要更新参数集的内容时,才会发出新的参数集 。
在H.264中,图像以序列为单位进行组织 。一个序列的第一个图像叫做IDR图像,IDR图像都是I帧,H.264引入IDR图像为了解码的同步,当解码器解码到IDR图像时,立即将参考帧队列清空,将已解码的数据全部输出或抛弃,重新查找参数集,开始一个新的序列 。这样,如果前一个序列出现重大错误,在这里可以获得重新同步的机会 。IDR图像之后的图像永远不会使用IDR之前的图像的数据来解码 。
IDR是I帧,但I帧不一定是IDR 。I帧之后的图像有可能会使用I帧之前的图像做运动参考 。
1.2描述子
描述子描述从Bit流中取出句法元素的方法 。
编号
语法
说明
1
ae(e)
CABAC
2
b(8)
读进连续的8个Bit
3
ce(v)
CAVLC
4
f(n)
读进连续的n个Bit
5
i(n)/i(v)
读进连续的若干Bit,并把它们解释为有符号整数
6
me(v)
映射指数熵编码
7
se(v)
有符号指数熵编码
8
te(v)
截断指数熵编码
9
u(n)/u(v)
读进连续的若干Bit,并把它们解释为无符号整数
10
ue(v)
无符号指数熵编码
表1
1.3句法的表示方法
句法元素的名称由小写字母和一系列下划线组成,变量名称是大小写字母组成,中间没有下划线 。
二句法表
定义了H.264的句法,指明在码流中依次出现的句法元素及它们出现的条件、提取描述子等 。句法表是分层嵌套的 。
句法表中的C字段表示该句法元素的分类,这是为片区服务,分类的具体含义如下表描述 。
NAL类型
C
0
未使用
1
不分区、非IDR的片
2,3,4
2
片分区A
2
3
片分区B
3
4
版分区C
4
5
IDR图像中的片
2,3
6
补充增强信息单元(SEI)
5
7
序列参数集
0
8
图像参数集
1
9
分界符
6
10
序列结束
7
11
码流结束
8
12
填充
9
13..23
保留
24..31
不保留
表2
2.1 NAL语法
编码器将每个NAL各自独立、完整地放入一个分组,因为分组都有头部,解码器可以方便地检测出NAL的分界,并依次取出NAL进行解码 。
每个NAL前有一个起始码,解码器检测每个起始码,作为一个NAL的起始标识,当检测到下一个起始码时,当前NAL结束 。同时H.264规定,当检测到时,也可以表征当前NAL的结束 。对于NAL中数据出现或时,H.264引入了防止竞争机制,如果编码器检测到NAL数据存在或时,编码器会在最后个字节前插入一个新的字节0x03,这样:
->
->
->
->
解码器检测到时,把03抛弃,恢复原始数据 。
解码器在解码时,首先逐个字节读取NAL的数据,统计NAL的长度,然后再开始解码 。