mpeg1视频解码标准简介

1.概述

Mpeg1是上世纪90年代提出来的视频标准,比较古老了。其特性包括:

  • 视频压缩编码,压缩后码率在 1.5Mbps,可用于视频传输和视频存储;编码前必须将视频图像转换成逐行扫描图像。
  • 录像机的正放、图像冻结快进、快退和慢放功能以及随机存储功能。
    Mpeg1使用了一系列的编码技术提升压缩率,包括:
  • 1) 使用基于块的运动补偿减少空间冗余;
  • 2) 使用DCT变换后量化,减少空间相关性,并丢弃部分不重要的高频信息;
  • 3) 对mv和DCT参数信息使用变长编码
2.码流结构

如图所示,Mpeg1码流结构可以分为以下几层:

  • 码流由一个序列头和多个GOP组成,并以endcode结尾;
  • GOP是一组可以单独解码的图像,是mpeg1码流实现随机播放的基本单元;GOP内第一个编码帧是I帧;
  • Piture层:Mpeg1标准只支持YUV420格式,一帧图像包含三个分量:Y、Cb、Cr,Y亮度分量宽高需要是偶数,CbCr色度分量宽高是Y分量的一半;支持4中帧类型:I帧、P帧、B帧、D帧;
  • Slice层:slice是防止误差扩散的基本单元,一帧图像由多个slice构成,相邻slice不能重叠也不能出现空隙;
  • Mb层:一个宏块包含例一个16x16亮度块(4个亮度block)和两个8x8的色度块(2个色度block)
  • Block层:8x8的亮度或色度块

在这里插入图片描述

3.解码流程

Mpeg1/2标准解码整个流程如下图所示。

  • 按照码流语法结构,通过VLC解码出DC/AC参数;
  • 解码出来的参数是游程编码(run-level),因此需要经过反扫描恢复参数;
  • 参数矩阵经反量化、反变换后得到残差数据;
  • 如果是P、B宏块需要通过运动补偿重建该宏块数据;如果是I宏块,则反变换后的数据为该宏块重建数据;
    在这里插入图片描述
    以上解码流程的基本单元是8x8大小的block。
    解码过程按照宏块类型可分为4种:帧内编码宏块、P帧中的预测编码宏块、B帧中的预测编码宏块、Skip宏块;
3.1 帧内编码宏块

I帧中所有宏块都以帧内编码方式,P帧和B帧中也可能存在帧内编码宏块(由macroblock_type语法决定)。Mpeg标准没有帧内预测,由于DCT变换后DC参数数值较大,直接编码会占用较多数据量,因此帧内编码使用DC预测减少码率。
帧内编码宏块解码步骤如下:

  • 1) 根据block中语法元素dct_dc_differential和dct_coeff_next可以得到dct系数矩阵dct_zz[];
  • 2) Dct_zz[] 乘上量化参数和加权矩阵可得到重建后的dct系数矩阵dct_reconn[m][n];
  • 3) 每个颜色通道的8x8 block的DC系数由上一block的DC预测得到,因此dct_reconn[0][0] += dct_dc_y_past;
  • 4) 对dct_reconn进行反变换得到该宏块重建数据
3.2 P帧中的预测编码宏块

MPEG1标准预测编码支持半像素精度,对于半像素的预测宏块是通过线性插值实现。
P帧中的预测编码宏块解码主要可分为两个部分:一是重建宏块的前向运动矢量以及预测宏块;二是存放在码流中的block DCT参数经过反量化、反变换并与预测宏块叠加;
计算步骤如下:

  • 1) 重建mv,由于相邻块的mv存在相关性,因此可以使用前一块的mv做预测以减少编码数据。解码过程中需要结合宏块头信息中的语法元素以及前一相邻块的mv计算得到当前宏块mv;
  • 2) 重建预测宏块,使用上一个解码的I帧或P帧作为参考帧,结合mv,计算得到当前宏块预测像素值。如果是全像素精度,可以直接从参考图中找到对应像素值;如果是半像素精度,则需要对相邻像素求平均值。
  • 3) 根据block中语法元素解析得到dct参数,经IDCT后得到残差值,加上预测宏块像素值则得到该解码宏块重建像素值;
3.3 B帧中的预测编码宏块

B帧中的预测宏块解码过程可分为以下四个步骤:

  • 1) 重建前向mv和前向预测宏块,该步骤类似于P帧的预测宏块重建。
    需要注意以下几点:
    a) 用于预测的前一个block mv只能在以下两种情况下重置:slice中的第一个宏块或上一个解码宏块为帧内编码宏块。
    b) 如果当前宏块没有前向mv,则使用上一个宏块
  • 2) 重建后向mv和后向预测宏块,重建过程与上一步骤类似;
  • 3) 根据前向和后向预测宏块计算预测像素值。如果只有前向或后向预测宏块信息,则使用单一方向做预测;如果两者都存在,则最终预测像素值为二者平均值;
  • 4) 根据block中语法元素解析得到dct参数,经IDCT后得到残差值,加上预测宏块像素值则得到该解码宏块重建像素值;
3.4 skipped宏块

Skipped宏块是指码流中没有编码数据的宏块,这类宏块既没有mv信息也没有DCT参数。这些宏块由宏块头信息中的macroblock_address_increment来表示,当macroblock_address_increment的值大于1时,可以认为当前宏块与上一宏块间存在skipped宏块。

  • I帧中,所有宏块都编码,不存在skipped宏块;
  • P帧中,skipped宏块表示该宏块mv为0,并且没有DCT参数;P帧内skipped宏块重建值直接拷贝参考帧对应位置的像素值;
  • B帧中,skipped宏块mb_type(主要用来确定该宏块的预测方式,前向参考、后向参考还是双向参考)与上一宏块一样,并且mv残差为0,没有DCT参数。在B帧中skipped宏块不能紧跟在帧内编码宏块之后。因此B帧内skipped宏块重建需要考虑三种情况:如果是前向参考,则直接拷贝前向参考帧对应位置像素数据;如果是后向参考,则直接拷贝后向参考帧对应位置像素数据;如果是双向参考,则为前向、后向参考像素值的均值。
3.5 参考帧管理

mpeg1参考帧最多只有2个,为之前解码两个的I或P帧。
假设一段码流显示顺序如下:
1 2 3 4 5 6 7
I B B P B B P
其解码顺序如下:
I P B B P B B

当前解码帧前向参考帧Last_pic后向参考帧Next_pic
解码1I帧101
解码4P帧414
解码2B帧214
解码3B帧314
解码7P帧747
解码5B帧547
解码6B帧647

如上表所示,参考帧管理基本原则是:

  • 当前解码为I帧或P帧前更新参考帧;
  • 更新方法是前向参考帧等于后向参考帧,后向参考帧等于当前帧;当解码P帧时,只使用前向参考帧;当解码B帧时,使用2个参考帧。
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于视频解码的FPGA源码分析,这是一个非常复杂和广泛的话题。在FPGA中实现视频解码通常涉及到以下几个方面: 1. 视频编码标准:FPGA实现视频解码首先需要选择一个视频编码标准,如H.264、H.265、MPEG-2等。不同的标准有不同的压缩算法和编码器结构。 2. 编码器架构:视频编码器通常包括预处理、变换、量化、熵编码等模块。在FPGA中实现编码器,需要设计合适的数据流架构,使得各个模块能够高效地并行处理视频数据。 3. 解码器架构:视频解码器通常包括熵解码、逆量化、逆变换、去块效应滤波等模块。在FPGA中实现解码器,需要设计合适的数据流架构,使得各个模块能够高效地并行处理解码数据。 4. 缓存和存储:视频解码通常需要使用大量的缓存和存储来存储视频数据和中间结果。在FPGA中实现视频解码,需要合理设计和管理缓存和存储结构,以满足高带宽和低延迟的需求。 5. 性能优化:在FPGA中实现视频解码,需要进行一系列的性能优化,如流水线设计、并行处理、资源共享等,以提高系统的吞吐量和效率。 综上所述,视频解码的FPGA源码分析涉及到多个方面的知识和技术,需要深入理解视频解码算法和FPGA架构,并且具备良好的硬件设计和优化能力。对于具体的视频解码源码分析,您可以参考相关的文档、论文或者开源项目,以了解具体实现的细节和思路。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值