mpeg2peter: 解码过程概述

mpeg2dec.c

 

在mian()函数中,前面的都是系统的初始化过程,真正的解码时从下面语句开始的

 

  ...

  Initialize_Decoder();

  ret = Decode_Bitstream();

  ...

 

接下来跟踪 Decode_Bitstream()函数,解码过程又跳转到 video_sequence()函数。

 

Video_sequence()函数可以完成一个sequence的解码,其中调用的解码函数为Decode_Picture()函数。

 

在Decode_Picture()函数中,相关函数为picture_data()和frame_reorder()。其中,picture_data()用来形成各个帧图像;frame_reorder()用来完成对解码图像的排序,使其按照正常的顺序排序

 

在picture_data()中,调用了slice()函数,完成解码当前所有的宏块的功能。这里已经到了可以获得视频的原始数据部分。

 

在slice()函数中,通过start_of_slice定位了宏块条层的开始;分别通过decode_macroblock(), skipped_macroblock(), Decode_SNR_Macroblock()完成了对各类宏块的解码;通过motion_compensation()完成了运动补偿。

 

在decode_macroblock()函数中,在以下位置完成了逐个宏块的解码

“/* decode blocks */”,位置为getpic.c(1140),在这里开始对每个宏块进行解码。

      其中,  Decode_MPEG2_Intra_Block(comp,dc_dct_pred)
                 Decode_MPEG1_Intra_Block(comp,dc_dct_pred);
                 Decode_MPEG2_Non_Intra_Block(comp);
                 Decode_MPEG1_Non_Intra_Block(comp);

四个函数分别完成了对应像块的解码。(注意,在这里的解码是指解析出DCT系数)。以Decode_MPEG2_Intra_Block(comp,dc_dct_pred)函数为例,其代码中的“bp[0] = val << (3-intra_dc_precision);”,其中bp[0]位置所存储的即为解码后的DCT[0][0]的DC系数;其代码中的“bp[j] = sign ? -val : val;”所解析出的就是ZIG-ZAG编码后DCT[i]的AC系数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值