H264---H.264/AVC 的分层结构与画面划分
H.264的分层结构和画面划分是和MPEG-2、MPEG-1不同的地方,也是预测图块可以小到4x4像素的基础
1、H.264/AVC(数据处理流程)的分层结构
(1)视像编码层(Video Coding Layer, 简称VCL),用于有效的表达视像内容,主要负责数据编码。
(2)网络抽象层(Network Abstraction Layer,简称NAL),用于按照一定格式,对视像编码层输出的数据进行打包和封装,并提供包头(header)等信息,以在不同速率的网络上传输或进行存储。
这两个层次,完成了从RGB/YUV像素数据输入,到编码并输出适应不同速率网络的H264码流的过程。
2、H.264/AVC画面划分
与MPEG-2和MPEG-1不同的是,H.264/AVC把一帧画面当做一片(或若干)像片(slice)
没有使用FMO的标准的H.264像片
在MPEG-2和MPEG-1中也有类似的将一帧拆分为多个像片(每个像片16行)
但区别在于FMO
FMO(Flexible Macroblock Ordering,灵活宏块次序)
要详细的了解FMO,还得从图像的扫描方式说起。我们都知道,图像扫描的顺序,是从左上角,一行行扫到右下角。而一帧图片由单个或多个像片组成,每个像片(slice)包含了一系列的宏块(MB),这些宏块的处理顺序,和扫描顺序一致,也即像片中的所有MB,均按照光栅扫描的次序被编码。故解码时,需要先接收到所有的片,并按照扫描的顺序排好后,再解码。这样一来,解码端是很受限制的
而当使用了任意像片次序(Arbitrary slice ordering,ASO)之后,就能够以数据接收的顺序进行解码。
而FMO呢,则是建立在ASO之上,所以它不仅有任意像片次序的功能,还在这个基础上,增加了像片分组的功能。而像片分组这个功能,不仅是FMO,也是H.264的一大重点。
那什么是像片分组(简称:片组)呢?不同片组有各自的宏块扫描方式
片组,其实就是使用某一规则,将一帧画面中的某些宏块划分成一个组,也即片组。
1、不使用FMO:帧包含一个”片组“,一个片组包含一个或多个“像片”,“像片”由宏块组成
//近似:帧由片组成 默认只有一个”片组“ 即上图的标准H264像片
2、使用FMO:帧包含若干”片组“,一个片组包含一个或多个“像片”,“像片”由宏块组成
当使用FMO时,图像根据不同宏块需要的扫描方式的不同,划分成多个片组,这样一来,不同片组的扫描方向和顺序互不影响。
H.264规定了6种典型的分组模式,也即宏块到片组的映射规则,这几种模式使用 slice_group_map_type 来指定,数值分别为0~5,如果设置为6则需要自定义映射规则。
下面就是FMO规定的几种分组模式:
类型0 为不使用FMO时的标准的H.264像片,而Type 1 至Type 5依次对应规则1 至 规则5。
从规则1到规则5,在*上有几张彩图: