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帧图像采用双向时间预测,可以大大提高压缩倍数。
为了实现标准的语法体系的实用性(满足不同的应用),定义了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,具体规定如下图:
编码的视频数据由称作layer的比特流序列组成。如果仅有一层,那么这个视频流就是不可分级的视频比特流。如果有两层或多层,则称为分级的视频比特流。
MPEG-2的编码码流共分为六个层次。为更好地表示编码数据,MPEG-2用句法Syntax规定了一个层次性结构。它共分为六层,自上到下分别是:图像序列层(Video Sequence)、图像组层(GOP)、图像层(Picture)、宏块条层(Slice)、宏块层(MacroBlock)和块层(Block)。
编码的比特流中的最高语法结构就是视频序列。一个视频序列以一个序列头开始,后面可选地跟着一组图像头和一个或多个编码帧。视频序列以一个sequence_end_code终止。序列头、图像组头和图像头在视频序列中可能是重复出现的,通过重复第一个序列头的数据单元,从而使得对视频序列的随机访问成为可能。
图像组是由一系列的编码图像组成。在编码比特流中,图像组头后面的第一个编码帧是I帧。
MPEG-2标准支持逐行编码和隔行编码。
一个重构图可以通过对一个编码图的解码获得。一个编码图是由一个图像头、紧跟后面的可选扩展以及图像数据组成。一个编码图可以是一个帧图或一个场图。一个重构图可以是一个重构帧,或是一个重构帧的一个场。
MPEG-2支持三种图像类型:
Slice是由一系列任意数目的连续宏块组成。Slice的第一个和最后一个宏块不能是Skip块。一个Slice中至少要包含一个宏块。Slice之间不能重叠。Slice的第一个和最后一个宏块要在同一宏块水平行上。
宏块包含亮度分离和对应的色度分量。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编码的图像中,一个亮度块解码之后,要按照隔行的方式去存放,才能恢复出原来的图像。
块是视频编码中处理的最小单元。一般来说,DCT变换和量化的基本单元就是8x8的块。
这里块既可以指源图像数据和重构图像数据,也可以指DCT系数或相应的编码数据单元。
起始码是不会在视频中另外出现的特定位模式。
每个起始码由一个起始码前缀和跟在后面的一个起始码值组成。起始码前缀是由一串23个零值和跟在后面的一位1值组成,即“0000 0000 0000 0000 0000 00001”。
起始码值是个8bit整数,表明了起始码的类型。大部分起始码类型只有一个起始码值,而slice_start_code由许多起始码值表示,在这种情况下slice的起始码值是slice_vertical_position。
表1. MPEG-2标准定义的起始码值
详见标准P22。包括了Sequence header、Extension and user data、Sequence extension、Sequence display extension、Sequence scalable extension和Group of pictures header的句法。
详见标准P27。包括了Picture coding extension、Quant matrix extension、Picture display extension和Picture temporal scalable extension、Copyright extension等句法。
详见标准P30。
详见标准P32。
详见标准P33。
详见标准P35。
图1 高层比特流组织方式
下面的语义规则适用于:
详细语义参见标准P38~60。
视频流解码过程就是从编码码流中恢复出重建图像的过程。
简化的视频流解码流程如下图所示:
视频解码流程
码流中针对宏块和所有其他语法结构中的各种参数和标志都应该按照第6小节(参考文献)的语法和语义进行解释。很多参数和标志将会影响下面的解码过程。一旦给定图像中所有宏块都解码完,整幅图像就可以重建出来了。
重构场图将成对形成重构帧。
重构帧序列需要按照6.1.1.11进行帧重排序。
如果progressive_sequence==1,则重构帧将以帧周期为时间间隔从解码过程输出。如果progressive_sequence==0,则重构帧将被分成一个重构场的序列,在解码过程中,以由规律的场周期为时间间隔出现。
(1)帧内块DC系数(DC coefficient(n=0))
dct_dc = dct_dc_pred[cc] + dct_dc_diff ;
复位值的确定通过参数intra_dc_precision按下表确定:
3)Intra块DC系数值QFS[0]的计算:
(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。
以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标准中的垂直交替扫描方式一样。
反扫描过程等效于下面过程:
当量化矩阵被加载时,它们以一种扫描顺序在比特流中编码,被转化成反量化器中使用的二维矩阵,就像系数使用的方法一样。
对于矩阵加载,通常采用zigzag扫描方式,即图7-2中的扫描方式。
以W[w][u]][v]表示反量化器中的加权矩阵,W[w][n]表示码流中编码的矩阵。则加载矩阵等效于下面过程:
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!