【mpeg2】MPEG-2标准总结文档

Date: 2018.10.24


1、MPEG-2简介

    MPEG组织于1994年正式推出MPEG-2压缩标准,以实现视/音频服务与应用互操作的可能性。最典型和成功的应用就是DVD产品。MPEG-2标准包括了系统层、视频层、音频层等9个部分,本文档主要讲述ISO/IEC 13818 Part2 视频部分。MPEG-2标准就是定义了一个标准的MPEG-2码流中每一位的具体含义,MPEG-2码流的结构以及视频解码的过程。 
    MPEG-2标准是针对标准数字电视和高清晰度电视在各种应用下的压缩方案和系统层的详细规定,编码码率从每秒3M比特~100M比特,标准的正式规范在ISO/IEC13818中。MPEG-2不是MPEG-1的简单升级,MPEG-2在系统和传送方面作了更加详细的规定和进一步的完善。MPEG-2特别适用于广播级的数字电视的编码和传送,被认定为SDTV和HDTV的编码标准。
    MPEG-2图像压缩的原理是利用了图像中的两种特性:空间相关性和时间相关性。这两种相关性使得图像中存在大量的冗余信息。如果我们能将这些冗余信息去除,只保留少量非相关信息进行传输,就可以大大节省传输频带。而接收机利用这些非相关信息,按照一定的解码算法,可以在保证一定的图像质量的前提下恢复原始图像。一个好的压缩编码方案就是能够最大限度地去除图像中的冗余信息。
     MPEG-2的编码图像被分为三类,分别称为I帧,P帧和B帧。 I帧图像采用帧内编码方式,即只利用了单帧图像内的空间相关性,而没有利用时间相关性。P帧和B帧图像采用帧间编码方式,即同时利用了空间和时间上的相关性。P帧图像只采用前向时间预测,可以提高压缩效率和图像质量。P帧图像中可以包含帧内编码的部分,即P帧中的每一个宏块可以是前向预测,也可以是帧内编码。B帧图像采用双向时间预测,可以大大提高压缩倍数。

2、档次和级别 (Profile && Level)

    为了实现标准的语法体系的实用性(满足不同的应用),定义了Profile和Level的方式来限定有限数目的语法子集。Profile是标准中定义个完整比特流语法一个子集(偏向于功能性约束);Level是对比特流语法中各个参数进行限定的集合(偏向于参数限定)。
    MPEG-2标准定义了7种Profile和4种Level,如下表所示:
(参考自:https://www.cs.rutgers.edu/~elgammal/classes/cs334/slide11_short.pdf)
在这里插入图片描述
其中在Main Profile中分为High,High 1440,Main和Low四种Level,具体规定如下图:
在这里插入图片描述

3、码流的分层结构

    编码的视频数据由称作layer的比特流序列组成。如果仅有一层,那么这个视频流就是不可分级的视频比特流。如果有两层或多层,则称为分级的视频比特流。
     MPEG-2的编码码流共分为六个层次。为更好地表示编码数据,MPEG-2用句法Syntax规定了一个层次性结构。它共分为六层,自上到下分别是:图像序列层(Video Sequence)、图像组层(GOP)、图像层(Picture)、宏块条层(Slice)、宏块层(MacroBlock)和块层(Block)。

3.1、Video Sequence 视频序列

    编码的比特流中的最高语法结构就是视频序列。一个视频序列以一个序列头开始,后面可选地跟着一组图像头和一个或多个编码帧。视频序列以一个sequence_end_code终止。序列头、图像组头和图像头在视频序列中可能是重复出现的,通过重复第一个序列头的数据单元,从而使得对视频序列的随机访问成为可能。
  在这里插入图片描述

3.2、Group of Pictures(GOP) 图像组

     图像组是由一系列的编码图像组成。在编码比特流中,图像组头后面的第一个编码帧是I帧。

3.3、逐行序列和隔行序列

     MPEG-2标准支持逐行编码和隔行编码。

3.4、Picture 图像

     一个重构图可以通过对一个编码图的解码获得。一个编码图是由一个图像头、紧跟后面的可选扩展以及图像数据组成。一个编码图可以是一个帧图或一个场图。一个重构图可以是一个重构帧,或是一个重构帧的一个场。

MPEG-2支持三种图像类型:

  • I 图 : 只使用当前帧的编码信息。
  • P 图 :利用前面的I图或P图使用运动补偿预测进行编码的图。
  • B 图: 利用前面的或后面的I图或P图使用运动补偿预测进行编码的图。
3.5、Slice 条带(块组)

    Slice是由一系列任意数目的连续宏块组成。Slice的第一个和最后一个宏块不能是Skip块。一个Slice中至少要包含一个宏块。Slice之间不能重叠。Slice的第一个和最后一个宏块要在同一宏块水平行上。

3.6、Macroblock 宏块

    宏块包含亮度分离和对应的色度分量。MPEG-2支持3种色度格式:4:2:0,4:2:2和4:4:4。对于4:2:0格式的图像,亮度宏块的大小为16x16,色度块的大小为8x8。一个宏块是由6个块组成的,分别是4个亮度块和2个色度块。
    对于隔行扫描的图像,亮度块有2种组织方式:
(1)帧DCT编码中,每个块由两场的行交替组成;
(2)场DCT编码中,每个块仅由两场中之一个场的行组成。
所以对场DCT编码的图像中,一个亮度块解码之后,要按照隔行的方式去存放,才能恢复出原来的图像。

3.7、Block 块

    块是视频编码中处理的最小单元。一般来说,DCT变换和量化的基本单元就是8x8的块。
    这里块既可以指源图像数据和重构图像数据,也可以指DCT系数或相应的编码数据单元。

4、视频比特流的语法
4.1、 起始码

    起始码是不会在视频中另外出现的特定位模式。
    每个起始码由一个起始码前缀和跟在后面的一个起始码值组成。起始码前缀是由一串23个零值和跟在后面的一位1值组成,即“0000 0000 0000 0000 0000 00001”。
    起始码值是个8bit整数,表明了起始码的类型。大部分起始码类型只有一个起始码值,而slice_start_code由许多起始码值表示,在这种情况下slice的起始码值是slice_vertical_position。

表1. MPEG-2标准定义的起始码值
在这里插入图片描述

4.2、 Sytax of Video Sequence

详见标准P22。包括了Sequence header、Extension and user data、Sequence extension、Sequence display extension、Sequence scalable extension和Group of pictures header的句法。

4.3、Sytax of Picture header

详见标准P27。包括了Picture coding extension、Quant matrix extension、Picture display extension和Picture temporal scalable extension、Copyright extension等句法。

4.4、Sytax of Picture data

详见标准P30。

4.5、Sytax of Slice

详见标准P32。

4.6、Sytax of Macroblock

详见标准P33。

4.7、Sytax of Block

详见标准P35。

5、视频比特流的语义
5.1 视频比特流的语法结构

图1 高层比特流组织方式

在这里插入图片描述

下面的语义规则适用于:

  • 如果视频序列的第一个sequence_header()后面没有紧跟着sequence_extension(),那么视频流将与ISO/IEC 11172-2一致。
  • 如果视频序列的第一个sequence_header()后面紧跟着一个sequence_extension(),那么后面所有出现sequence_header的后面都要紧跟一个sequence_extension()。
  • sequence_extension仅紧跟在sequence_header后面。
  • 如果sequence_extension在比特流中出现,那么每个picture_header后面都将紧跟一个picture_coding_extension。
  • picture_coding_extension仅紧跟在picture_header后面。
  • 跟在group_of_picure_header后面的第一个编码图像应该是I图像。
5.2、语义分析

详细语义参见标准P38~60。

6、视频流解码过程

    视频流解码过程就是从编码码流中恢复出重建图像的过程。
简化的视频流解码流程如下图所示:
在这里插入图片描述

视频解码流程

6.1、高层语法结构

    码流中针对宏块和所有其他语法结构中的各种参数和标志都应该按照第6小节(参考文献)的语法和语义进行解释。很多参数和标志将会影响下面的解码过程。一旦给定图像中所有宏块都解码完,整幅图像就可以重建出来了。
    重构场图将成对形成重构帧。
    重构帧序列需要按照6.1.1.11进行帧重排序。
    如果progressive_sequence==1,则重构帧将以帧周期为时间间隔从解码过程输出。如果progressive_sequence==0,则重构帧将被分成一个重构场的序列,在解码过程中,以由规律的场周期为时间间隔出现。

6.2、可变长解码VLD(Variable length decoding)

(1)帧内块DC系数(DC coefficient(n=0))

    dct_dc = dct_dc_pred[cc] + dct_dc_diff ;

  • 1)差分值dct_dc_diff的确定
        帧内宏块中块的DC系数按照标准中附录II-B的表II-B-12和II-B-13所定义的变长码进行编码,并指明dct_dc_size。如果dct_dc_size等于0,则当前帧内块的DC系数就等于DC系数的预测值;否则,后面要跟着一个固定长度码(以dct_dc_size为位数的dc_dct_differential)。这个DC系数差分值首先从编码的数据中恢复出来,然后加上预测值就可以恢复出最终的解码系数。
  • 2)预测值dct_dc_pred[cc]的确定
        有三个DC系数的预测器,每个颜色分量一个。每次对帧内宏块中的块的DC系数进行解码时,将预测值与差分值相加来恢复实际的DC系数值。然后预测器的值被设置为刚刚解码的系数值。在下面描述的不同时刻,预测器的值需要被重置。
    • 在一个Slice的开始;
    • 当解码的宏块是非帧内宏块时;
    • 当解码的宏块时Skip块,即当macroblock_address_increment > 1时。

复位值的确定通过参数intra_dc_precision按下表确定:
在这里插入图片描述

  • 3)Intra块DC系数值QFS[0]的计算:
    在这里插入图片描述

    • 4)范围限定
      比特流中有一个规定,QFS[0]必须在以下范围内取值:
      0~((2^(8 + intra_dc_precision)) - 1)

(2)其他系数(AC系数(n>0)和非帧内块的DC系数)
    除了帧内DC系数外的其他系数都采用标准中表B.14,B.15和B.16进行编码。

  • 1)所有变长码首先都要使用表B.14或表B.15来解码,解码值指明了采用下面三种行动中的哪一种。

    • 块结束。此时块中再没有别的系数,块中剩余的系数应被置为0。采用句法"End of block"表示 。

    • 正常系数。解码得到的run和level值的后面紧跟一个bit的s值,s给出了这个系数的符号。run个系数应该设置为0,剩余系数应该设置为signed_level。
      if (s ==0)
      signed_level = level;
      else
      signed_level = (-level);

    • Escape编码系数。其中run和signed_level采用定长编码,具体见 4)Escape编码。

  • 2)表选择
    下表指明了DCT系数的解码将用到哪个表。
    在这里插入图片描述

  • 3)非帧内块DC系数的解码
        对于非帧内块的第一个系数的解码,需要将表B.14按照表下面的Note2和Note3所指示的那样进行修改。这个修改仅影响了表示run=0,level=+/-1的表项。(此处有疑问? Note 3)

  • 4)Escape编码
        很多可能的run和level值的组合并没有变长码来表示它们。为了编码这些统计上很少出现的组合, 采用了Escape编码方法。
    Escape编码方法:
    Escape VLC采用6位的固定长度码来表示run,紧跟12位的固定长度码表示signed_level,表B.16中定义了紧跟ESCAPE码后的run和level的固定长度编码方法。
    在这里插入图片描述

  • 5) 其余系数解码的小结
    在其余系数解码开始,对于帧内块n=1,对于非帧内块,n=0。
    在这里插入图片描述

6.3、反扫描 Inverse scan

    以QFS[n]表示变长码解码器输出端的数据,n在0~63的区间内。
    反扫描的过程就是将一维数据QFS[n]转换成二维系数矩阵QF[v][u],其中u和v均在区间0~7中。反扫描的块大小为8x8。
    MPEG-2标准定义了2个扫描模板。将要采用的扫描模板通过编码在picture_coding_extension中的句法alternate_scan来确定。

   下面图7-2和图7-3分别是2种扫描模板:
在这里插入图片描述

在这里插入图片描述
图7-2为alternate_scan为0的情况,是常用的zig_zag扫描顺序。
图7-3为alternae_scan位1的情况,是垂直交替扫描方式,与MPEG-4标准中的垂直交替扫描方式一样。

反扫描过程等效于下面过程:
在这里插入图片描述

6.3.1 加载矩阵的反扫描

    当量化矩阵被加载时,它们以一种扫描顺序在比特流中编码,被转化成反量化器中使用的二维矩阵,就像系数使用的方法一样。
    对于矩阵加载,通常采用zigzag扫描方式,即图7-2中的扫描方式。
    以W[w][u]][v]表示反量化器中的加权矩阵,W[w][n]表示码流中编码的矩阵。则加载矩阵等效于下面过程:
在这里插入图片描述

6.4 反量化 Inverse quantisation
6.5 反变换 IDCT
6.6 运动补偿 Motion compensation
7、参考文献

https://www.itu.int/rec/dologin_pub.asp?lang=e&id=T-REC-H.262-200002-S!!PDF-E&type=itemshttp://ecee.colorado.edu/~ecen5653/ecen5653/papers/iso13818-2.pdf


THE END!