mpeg2视频解码标准简介

153 阅读5分钟

mpeg2是mpeg1标准(mpeg1介绍请点这里)的扩展,主要增加以下特性:

  • 支持interlace视频
  • 支持可伸缩编码(由于该特性工作中用不到,没有深入分析)

1.码流结构

Mpeg2的码流语法结构大致与mpeg1一致,只增加了部分扩展元素。

  1. 如果第一个sequence_header之后没有紧跟一个sequence_extension结构,则该码流遵循mpeg1标准,否则是mpeg2;
  2. 如果第一个sequence_header之后紧跟一个sequence_extension结构,则后续所有sequence_header之后都需要有sequence_extension结构。也就是说,MPEG2标准中sequence_header后需要紧跟sequence_extension,而mpeg1没有这个规定,因此可以用该规则判定码流是否为mpeg1;
  3. 两个sequence_header之间至少存在一个picture数据,这也意味着sequence_extension后不能紧跟这sequence_end语法;
  4. 如果码流中存在sequence_extension(即该码流为mpeg2),picture_header后需紧跟一个picture_coding_extension,并且picture_coding_extension只能在picture_header之后,不能在其他位置;
  5. Group_of_picture_header后的第一帧需要是一个I帧。 在这里插入图片描述

2.解码过程

解码流程如下图所示: 在这里插入图片描述 按流程图中各个模块可以把解码过程分为以下几个步骤:

2.1 variable length decoding

mpeg2变长编码的解码过程与mpeg1类似,主要解析码流中的存放的DC、AC系数,分为帧内编码宏块DC和其他系数解码。差异主要有以下两点:

  1. 帧内编码DC系数重置值,mpeg2会根据picture_coding_extension中的intra_dc_precision值做DC系数重置。
  2. 帧内编码宏块VLC解析表不同,mpeg2会根据intra_vlc_format选择使用不同的VLC表。

2.2 inverse scan

上一步解析出来的DC、AC系数是以游程编码方式存放,反扫描这一步主要把系数处理成矩阵格式。Mpeg1/2主要差异在于:mpeg1只支持zigzag扫描,而mpeg2需要通过picture_coding_extension中的alternate_scan选择两种扫描方式。

2.3 inverse quantisation

量化计算过程与量化权重矩阵quant_weight_matrix和量化系数q_scale相关,mpeg1/2主要差异在于:

  1. mpeg2标准中的帧内编码宏块DC系数需要乘以intra_dc_mult,该值与intra_dc_precision相关; 在这里插入图片描述
  2. 量化权重矩阵可以存放在sequence_header中,也可以由quantiser_matrix_extension更新;
  3. Mpeg1标准在slice header或mb header中直接编码q_scale,而mpeg2在slice header或mb header中编码q_scale_code,并在picture_coding_extension中编码q_scale_type,再由两者共同决定q_scale;
  4. Mismatch control计算公式不一样。
    在这里插入图片描述

2.4 inverse DCT

Mpeg12反DCT变换过程是一样的,不再赘述。

2.5 motion compensation

由于mpeg2支持场格式,运动补偿方式要考虑场预测,因此与mpeg1由较大差异。流程如下图所示:
在这里插入图片描述

2.5.1 预测方式

Mpeg2由两种主要的预测方式场预测和帧预测和两种特殊的预测方式16x8块运动补偿和dual-prime方式;

  1. 场预测。使用之前解码的场作为参考进行预测;
  2. 帧预测。使用之前解码的帧作为参考进行预测;
  3. 16x8运动补偿。
  4. Dual-prime

一个场图像只用使用场预测,而一个帧图像既可以使用场预测也可以使用帧预测。

2.5.1.1 场预测

场预测需要根据帧类型做不同处理。 P帧中的场预测两个参考场是指最近一次解码的顶场和底场。存在以下几种场景:

  1. 当前解码图像为帧格式,则其参考场为同属于上一个重建帧的顶场和底场; 在这里插入图片描述
  2. 当前解码图像为场格式,并且为重建帧的第二场,因此其中一个参考场为当前帧的第一场。 当前解码图像为顶场,参考场如下图:
    在这里插入图片描述
    当前解码图像为底场,参考场如下图:
    在这里插入图片描述
    B帧中的场预测是用两个最近重建帧中的两场作为参考,如下图
    在这里插入图片描述

2.5.1.2 帧预测

Mpeg2的帧预测与mpeg1没有差异。分为如下两种情况:

  1. 当前解码帧为P帧,以最近解码的I/P帧作为参考;
    在这里插入图片描述
  2. 当前解码帧为B帧,以最近解码的两个I/P帧作为参考;
    在这里插入图片描述

2.5.2 motion vector

由于相邻块mv具有相关性,编码mv时可以使用相邻块mv做预测,而只编码mv差值可以减少编码数据量。解码mv过程中会使用已解码的相邻块的mv做预测。

2.5.3 forming predictions

生成预测块主要是从参考帧或场中读取参考像素。由于mv是半像素精度,半像素需要通过对相邻像素值线性差值方式获取。 对于场预测,每一个宏块必须从两个可用的参考场中选择一个作为参考。场预测或16x8MC再宏块头中编码选择模式motion_vertical_filed_select。

  • motion_vertical_filed_select为0,选择顶场做参考;
  • motion_vertical_filed_select为1,选择底场做参考。

根据mv和选定的参考场/帧可以得到当前宏块的预测块。

2.5.4 skipped macroblock

Skipped 宏块是指没有编码数据的宏块。如果当前宏块索引macroblock_addr – prev_macroblock_addr > 1,则当前宏块与上一解码宏块间存在skipped宏块。Skipped宏块重建像素值就等于预测像素值。 B帧和P帧中的skipped宏块处理方式不一样,而且帧格式和场格式skipped宏块处理方式也大相径庭。

2.5.4.1 P filed picture

1)如果filed_motion_type是filed_base,需要做预测; 2)需要以同样类型的场做参考; 3)预测mv(下一宏块做mv预测使用)设为0; 4)mv设为0;

2.5.4.2 P frame picture

1)如果frame_motion_type是framed_base,需要做预测; 2)预测mv(下一宏块做mv预测使用)设为0; 3)mv设为0;

2.5.4.3 B field picture

1)如果filed_motion_type是filed_base,需要做预测; 2)需要以同样类型的场做参考; 3)前向/后向/双向预测方向需要与前一宏块一致; 4)预测mv不变; 5)当前块mv与上一宏块mv一样(直接从mv预测获取)

2.5.4.4 B frame picture

1)如果frame_motion_type是framed_base,需要做预测; 2)前向/后向/双向预测方向需要与前一宏块一致; 3)预测mv不变; 4)当前块mv与上一宏块mv一样(直接从mv预测获取)

2.6 combining predictions

最终的预测块需要融合多个预测结果。B帧融合方式为前向预测和后向预测取均值。

2.7 Adding prediction and coefficient data

宏块最终重建结果等于预测结果和变换结果之和。