mpeg2peter: 解码过程概述

来源:互联网 发布:unity3d 视频播放 编辑:程序博客网 时间:2024/05/01 05:18

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系数

原创粉丝点击