H264系列十三 句法元素的分层结构

参考《新一代视频压缩编码标准 毕厚杰 第7章 H.264的句法和语义》

在编码器输出的码流中,数据的基本单位是句法元素,每个句法元素由若干比特组成,它表示某个特定的物理意义,例如:宏块类型、量化参数等。句法表征句法元素的组织结构,语义阐述句法元素的具体含义。所有的视频编码标准都是通过定义句法和语义来规范编解码器的工作流程。

编码器输出的比特码流中,每个比特都隶属某个句法元素,也就是说,码流是由一个个句法元素依次衔接组成的,码流中除了句法元素并不存在专门用于控制或同步的内容。在 H.264 定义的码流中,句法元素被组织成有层次的结构,分别描述各个层次的信息。图 7.1 表现了这种结构。


H264系列十三 句法元素的分层结构_第1张图片
图 7.1 句法元素的分层结构

句法元素的分层结构有助于更有效地节省码流。例如,在一个图像中,经常会在各个片之间有相同的数据,如果每个片都同时携带这些数据,势必会造成码流的浪费。更为有效的做法是将该图像的公共信息抽取出来,形成图像一级的句法元素,而在片级只携带该片自身独有的句法元素。在H.264 中,句法元素共被组织成 序列、图像、片、宏块、子宏块五个层次。

H.264 的分层结构是经过精心设计的,与以往的视频编码标准相比有很大的改进,这些改进主要针对传输中的错误掩藏,在有误码发生时可以提高图像重建的性能。在以往的标准中,分层的组织结构如图 7.2,它们如同 TCP/IP 协议的结构,每一层都有头部,然后在每层的数据部分包含该层的数据。


H264系列十三 句法元素的分层结构_第2张图片
图 7.2 以往标准中句法元素的分层结构

在这样的结构中,每一层的头部和它的数据部分形成管理与被管理的强依赖关系,头部的句法元素是该层数据的核心,而一旦头部丢失,数据部分的信息几乎不可能再被正确解码出来。尤其在序列层及图像层,由于网络中 MTU(最大传输单元)大小的限制,不可能将整个层的句法元素全部放入同一个分组中,这个时候如果头部所在的分组丢失,该层其他分组即使能被正确接收也无法解码,造成资源浪费。


H264系列十三 句法元素的分层结构_第3张图片
图 7.3 H.264 中句法元素的分层结构

在 H.264 中,分层结构最大的不同是取消了序列层和图像层,并将原本属于序列和图像头部的大部分句法元素游离出来形成序列和图像两级参数集,其余的部分则放入片层。参数集是一个独立的数据单位,不依赖于参数集外的其他句法元素。图 7.3 描述了参数集与参数集外句法元素的关系,在图中我们可以看到,参数集只是在片层句法元素需要的时候被引用,而且,一个参数集并不对应某个特定的图像或序列,同一个序列参数集可以被多个序列中的图像参数集引用,同理,同一个图像参数集也可以被多个图像引用。只在编码器认为需要更新参数集的内容时,才会发送出新的参数集。在这种机制下,由于参数集是独立的,可以被多次重发或者采用特殊技术加以保护。

在图 7.3 的描述中,参数集与参数集外部的句法元素处于不同信道中,这是 H.264 的一个建议,我们可以使用更安全但成本更昂贵的通道来传输参数集,而使用成本低但不够可靠的信道传输其他句法元素,只需要保证片层中的某个句法元素需要引用某个参数集时,那个参数集已经到达解码器,也就是参数集在时间上必须先被传送。当然,在条件不允许的情况下,我们也可以采用妥协的办法:在同一个物理信道中传输所有的句法元素,但专门为参数集采用安全可靠的通信协议,如 TCP。当然,H.264 也允许我们为包括参数集在内的所有句法元素指定同样的通信协议,但这时所有参数集必须被多次重发,以保证解码器最终至少能接收到一个。在参数集和片使用同个物理信道的情况下,图 7.3 中的信道 1 和信道 2 应该被理解为逻辑上的信道,因为从逻辑上看,参数集与其它句法元素还是处于各自彼此独立的信道中。

H.264 在片层增加了新的句法元素指明所引用的参数集的编号,同时因为取消了图像层,片成为了信道 2 中最上层的独立的数据单位,每个片必须自己携带关于所属图像的编号、大小等基本信息,这些信息在同一图像的每个片中都必须是一致的。在编码时,H.264 的规范要求将参数集、片这些独立的数据单位尽可能各自完整地放入一个分组中被传送。

从表面上看来,H.264 关于参数集和片层的结构增加了编码后数据的冗余度(比如参数集必须多次重发,又如每个片都必须携带一部分相同的关于整个图像的信息,而这些数据完全是重复的),降低了编码效率,但这些技术的采用使得通信的鲁棒性大大增强,当数据传输中出现丢包,能够将使错误限制在最小范围,防止错误的扩散,解码后对错误的掩藏和恢复也能起到很好的作用。 一个片的丢失将不会影响其它片的解码,还可以通过该片前后的片来恢复该片的数据。

图 7.3 所示的码流的结构是一种简化的模型,这个模型已经能够正确工作,但还不够完善,不适合复杂的场合。在复杂的通信环境中,除了片和参数集外还需要其他的数据单位来提供额外的信息。图 7.4 描述了在复杂通信中的码流中可能出现的数据单位。如前文所述,参数集可以被抽取出来使用其它信道。


H264系列十三 句法元素的分层结构_第4张图片
图 7.4 H.264 码流中的数据单位(这里的数据单位是指可以被独立放入一个分组传输的句法元素集合)

在图 7.4 中我们看到,一个序列的第一个图像叫做 IDR 图像(立即刷新图像),IDR 图像都是 I图像。H.264 引入 IDR 图像是为了解码的重同步,当解码器解码到 IDR 图像时,立即将参考帧队列清空,将已解码的数据全部输出或抛弃,重新查找参数集,开始一个新的序列。这样,如果在前一个序列的传输中发生重大错误,如严重的丢包,或其他原因引起数据错位,在这里可以获得重新同步。IDR 图像之后的图像永远不会引用 IDR 图像之前的图像的数据来解码。

要注意 IDR 图像和 I 图像的区别, I和IDR帧都是使用帧内预测的。它们都是同一个东西而已,在编码和解码中为了方便,要首个I帧和其他I帧区别开,所以才把第一个首个I帧叫IDR,这样就方便控制编码和解码流程。IDR帧的作用是立刻刷新,使错误不致传播,从IDR帧开始,重新算一个新的序列开始编码。而I帧不具有随机访问的能力,这个功能是由IDR承担,IDR会导致DPB(参考帧列表——这是关键所在)清空,而I不会。IDR图像一定是I图像,但I图像不一定是IDR图像。一个序列中可以有很多的I图像,I图像之后的图像可以引用I图像之间的图像做运动参考。一个序列中可以有很多的I图像,I图像之后的图象可以引用I图像之间的图像做运动参考。

对于IDR帧来说,在IDR帧之后的所有帧都不能引用任何IDR帧之前的帧的内容,与此相反,对于普通的I-帧来说,位于其之后的B-和P-帧可以引用位于普通I-帧之前的I-帧。从随机存取的视频流中,播放器永远可以从一个IDR帧播放,因为在它之后没有任何帧引用之前的帧。但是,不能在一个没有IDR帧的视频中从任意点开始播放,因为后面的帧总是会引用前面的帧。

在图 7.4 中,除了参数集与片外还有其它的数据单位,这些数据单位可以提供额外的数据或同步信息,这些数据单位也是一系列句法元素的集合。它们在解码过程中不是必需的,但却可以适当提高同步性能或定义图像的复杂特征。

你可能感兴趣的:(H264系列十三 句法元素的分层结构)