mpeg2视频解码标准简介

更新时间内容
2020.12.11初版
2021.01.26更新预测方式内容

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.1.1 DC coefficients in intra blocks

I宏块DC系数解析与其他系数解析有些差异,因为DC参数数值较大,而相邻块DC系数具有相关行,因此DC系数解析会用上一个块的DC系数做预测值。
DC系数最终会根据码流中的元素dc_dct_size 和dc_dct_differential以及DC预测值来计算,计算过程如下:
在这里插入图片描述
在以下几种情况,DC系数预测值需要重置。重置的数值与intra_dc_precision相关。

  • slice的第一个宏块
  • 遇到非I宏块时
  • 遇到skipped 宏块时

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运动补偿。6x16宏块分为上下两个16x8块,对于每个预测方向,都有两个mv,第一个用于宏块上方的16x8块,第二个用于宏块下方的16x8块。如果是双向预测,则存在4个mv。
  4. Dual-prime

宏块的预测方式选择与当前当前宏块所在帧的格式(帧/场格式)相关,由宏块头语法元素(frame_motion_type/field_motion_type)指定。帧格式支持的预测方式包括:场预测、帧预测、dual_prime;场格式支持的预测方式包括:场预测、16x8预测以及dual-prime。
在这里插入图片描述
不同预测方式预测宏块获取步骤如下:

  • 帧预测
    帧预测处理方式与mpeg1一致。预测宏块的依赖信息包括参考帧和mv,根据预测宏块以及参考帧数据可以得到预测宏块数据。
  • 场预测
    帧图像的场预测依赖的信息有mv、field_select。前向或后向预测有两个mv,分别表示顶场和底场运动矢量信息。如上图所示,预测过程可分为以下几个步骤。
  1. 以顶场为例,根据mv可以找到顶场对应的参考宏块。由于参考图像为帧格式,需要把参考宏块分为顶场(宏块数据的奇数行)和底场(宏块数据的偶数行);
  2. 根据field_select选择宏块的顶场或顶场作为预测场,再由mv判断是否需要做插值,可以得到顶场的预测场;(如果field_select等于0,使用顶场做预测,否则使用底场)
  3. 同理可得到底场的预测场结果,把顶场和底场的预测场结果分别作为宏块的奇数/偶数行,从而得到预测宏块。
    在这里插入图片描述
  • Dual_prime
    Dual-prime预测方式只存在于P帧,因此只有前向预测。帧格式需要分为顶场和底场分别预测,两场预测分别通过参考顶场和底场运动补偿并取均值,每一场需要用到两个mv,因此一共需要用到4个mv。
    以mv[0]-mv[4]分别表示4个mv。
  • mv[0]用于获取顶场预测块,参考场为顶场时使用的运动矢量;
  • mv[1]用于获取底场预测块,参考场为底场时使用的运动矢量;
  • mv[2]用于获取顶场预测块,参考场为底场时使用的运动矢量;
  • mv[3]用于获取底场预测块,参考场为顶场时使用的运动矢量;
2.5.1.2 场格式中的宏块预测方式

场格式图像预测方式如下图所示,包括三种预测方式:field_based场预测方式、16x8块预测方式、dual-prime预测方式。
其中,根据预测方向场预测可以再细分为4种方式:

  • 前向
  • 后向
  • 双向
  • 没有预测,这种方式可以转变为mv为0的前向预测来实现。

同理,16x8块预测方式根据预测方向也可以再细分为3种方向
在这里插入图片描述

2.5.1.1 帧格式中的宏块预测方式

帧格式预测方式如下表所示,包括frame_based帧预测方式、field_based场预测方式以及dual-prime预测方式。其中帧预测和场预测根据预测方向还可以再细分三种方式(前向/后向/双向)。
不同预测方式预测宏块获取步骤如下:

  • 场预测
    场格式的场预测的几个关键因素有:
    1)预测用到的顶场或底场参考场可能来自于不同帧。如果重建为当前帧第二场,并且与参考场场类型(top/bottom field)不一样,参考场为当前帧的第一场,具体可参考2.5.1.3节;
    2)通过field_select选择参考场。(field_select=0,选择顶场做参考;field_select=1,选择底场做参考)
    3)根据当前参考场类型可以确定当前场数据在重建帧的存放位置;
    在这里插入图片描述

  • 16x8块预测
    16x8块预测就是把16x16宏块分为两个16x8 块(其中一个16x8块包含一个16x8Y分量块、一个8x4 Cb分量块和一个8x4 Cr分量块),然后分别对每个16x8块做预测。预测过程与场预测类似。

  • Dual-prime预测
    场格式的dual-prime预测使用顶场和底场分别预测结果,然后取平均值。预测过程中,当重建场与预测场类型相同时,使用运动矢量mv[0];当长类型不同时,使用运动矢量mv[2]。根据当前重建场类型可分为两种:

  1. 重建场为顶场
    在这里插入图片描述
  2. 重建场为底场
    在这里插入图片描述
2.5.1.3 场预测参考场选择

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

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

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

宏块最终重建结果等于预测结果和变换结果之和。
需要注意的是,对于帧格式最终重建数据的存放与dct_type这个语法元素相关。

  1. 对于frame dct,16x16宏块内的6个block是由两场数据交错存放,如下图所示。其中左边为16x16宏块数据,右边为解码输出的宏块中block。
    在这里插入图片描述
  2. 2)对于field dct,16x16宏块内解码输出的block只包含一个场的数据,如下图所示。因此在重建宏块数据时,需要把解码输出的block按行交错存放
    在这里插入图片描述
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值