码流的基本单位:
在编码器输出的码流中,数据的基本单位是句法元素,每个句法元素由若干比特组成,它表示某个特定的物理意义 ,比如宏块类型、量化参数等。
句法:
句法表征句法元素的组织结构。
语义:
语义阐述句法元素的具体含义。
所有的视频编码标准都是通过定义句法和语义来规范编解码器的工作流程。
句法元素的分层结构:
编码器输出的比特码流中,每个比特都隶属某个句法元素,也就是说,码流是由一个个句法元素依次衔接组成的,码流中除了句法元素并不存在专门用于控制或同步的内容。在 H.264 定义的码流中,句法元素被组织成有层次的结构,分别描述各个层次的信息。
句法元素的分层结构有助于更有效地节省码流。例如,在一个图像中,经常会在各个片之间有 相同的数据,如果每个片都同时携带这些数据,势必会造成码流的浪费。更为有效的做法是将该图 像的公共信息抽取出来,形成图像一级的句法元素,而在片级只携带该片自身独有的句法元素。在 H264 中,句法元素共被组织成 序列、图像、片、宏块、子宏块五个层次。
以往的句法元素分层结构:
以往的标准中,每一层都有头部,然后在每层的数据部分包含该层的数据。在这样的结构中,每一层的头部和它的数据部分形成管理与被管理的强依赖关系,头部的句法 元素是该层数据的核心,而一旦头部丢失,数据部分的信息几乎不可能再被正确解码出来。尤其在序列层及图像层,由于网络中 MTU
(最大传输单元)大小的限制,不可能将整个层的句法元素全部 放入同一个分组中,这个时候如果头部所在的分组丢失,该层其他分组即使能被正确接收也无法解 码,造成资源浪费。
H264 的句法元素的分层结构:
在 H264 中,分层结构最大的不同是取消了序列层和图像层,并将原本属于序列和图像头部的大部分句法元素游离出来形成序列和图像两级参数集,其余的部分则放入片层。
参数集是一个独立 的数据单位,不依赖于参数集外的其他句法元素。参数集只是在片层句法元素需要的时候被引用,而且,一个参数集并不对应 某个特定的图像或序列,同一个序列参数集可以被多个序列中的图像参数集引用,同理,同一个图像参数集也可以被多个图像引用。只在编码器认为需要更新参数集的内容时,才会发送出新的参数集。在这种机制下,由于参数集是独立的,可以被多次重发或者采用特殊技术加以保护。
参数集和参数集外部的句法元素处理不同的信道中,这是H264的建议,可以使用更安全更昂贵的通道来传输参数集,而使用成本低但不够可靠的信道传输其他句法元素,只需要保证片层中的某个句法元素需要引用某个参数集时,那个参数集已经到达解码器。
H264的参数集和片层的结构增加了编码后数据的冗余度,降低了编码效率,但这些技术的采用使得通信的鲁棒性大大增强,出现丢包时,将错误限制在最小范围。
H264码流中的数据单位:
句法元素与变量:
编码器将数据编码为句法元素然后依次发送。在解码器端,通常要将句法元素作求值计算,得出一些中间数据,这些中间数据就是 H.264 定义的变量。下图中,pic_width_in_mbs_minus1
是解码器直接从码流中提取的句法元素,这个句法元素表征图像的宽度,以宏块为单位。为了提高编码效率,H.264 将图像实际的宽度减去 1 后再传送。
以上变量 PicWidthInMbs
表示图像以宏块为单位的宽,变量 PicWidthInSamplesL
、 PicWidthInSamplesC
分别表示图像的亮度、色度分量以像素为单位的宽。H.264 定义这些变量是因为在后续句法元素的提取算法或图像的重建中需要用到它们的值。
在 H.264 中,句法元素的名称是由小写字母和一系列的下划线组成,而变量名称是大小写字母组成,中间没有下划线。
语法:
句法是句法元素的组织结构,而对一个结构的描述必然少不了对应的语法,语法提供判断、循环等必要的描述方法。H264 采用一种类 C 语法。
描述子:
描述子是指从比特流提取句法元素的方法,即句法元素的解码算法,每个句法元素都有相对应的描述子。由于 H264 编码的最后一步是熵编码,所以这里的描述子大多是熵编码的解码算法。H.264 定义了如下几种描述子:
序号 | 描述子 | 解释 |
---|---|---|
a) | ae(v) | 基于上下文自适应的二进制算数熵编码 |
b) | b(8) | 读进连续的 8 个比特 |
c) | ce(v) | 基于上下文自适应的可变长熵编码 |
d) | f(n) | 读进连续的 n 个比特 |
e) | i(n)/i(v) | 读进连续的若干比特,并把它们解释为有符号整数 |
f) | me(v) | 映射指数Golomb熵编码 |
g) | se(v) | 有符号指数 Golomb 熵编码 |
h) | te(v) | 截断指数 Golomb 熵编码 |
i) | u(n)/u(v) | 读进连续的若干比特,并将它们解释为无符号整数 |
j) | ue(v) | 无符号指数 Golomb 熵编码 |
描述子都在括号中带有一个参数,这个参数表示需要提取的比特数。
当参数是 n
时, 表明调用这个描述子的时候会指明n
的值,也即该句法元素是定长编码的。
当参数是v
时,对应的句法元素是变长编码,这时有两种情况:i(v)
和 u(v)
两个描述子的v
由以前的句法元素指定,也就是说在前面会有句法元素指定当前句法元素的比特长度;除了这两个描述子外,其它描述子都是熵编码,它们的解码算法本身能够确定当前句法元素的比特长度。
略
H264 的语义用来阐述句发表中的具体含义。主要有 NAL 层语义
、序列参数集SPS 语义
、图像参数集PPS 语义
、片头语义
、参考图像序列重排序语义
、加权预测语义
、参考图像序列标记操作语义
、片数据语义
、宏块层语义
、宏块预测语义
、子宏块预测语义
、用 CAVLC 方式编码的残差数据语义
、用 CABAC 方式编码的残差数据语义
等。
书籍:
新一代视频压缩编码标准H.264(毕厚杰)