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