ffmpeg的mpeg2编码I帧代码解读(三)
1.完整的初始化过程,函数调用关系如下:
encode_init
MPV_encode_init:里面要根据不同的Codec_ID来配置一些数据
MPV_common_init:基本的结构体的初始化,在此之前,高度宽度等变量已经设置好了
dsputil_init:初始化了fdct,而MPV_encode_init紧接着,执行前面提到的dct_quantize的初始化。
然而,这个时候量化表并没有初始化,量化表的初始化是用函数ff_set_qscale进行的。而这个函数的调用关系,在第二点中讲到
2.编码器运行的函数调用关系如下:
MPV_encode_picture:顶层函数
encode_picture:编码一副图像,这个时候首先要编码图像头,调用mpeg1_encode_picture_header函数,然后在2912行,通过s指针调用了encode_thread函数,开始编码
encode_thread里面,调用了ff_set_qscale,进行qscale的初始化,然后调用encode_mb_hq进行编码
encode_mb_hq调用encode_mb进行宏块编码
encode_mb调用encode_mb_internal进行帧内编码
encode_mb_internal调用mpeg1_encode_mb进行编码
mpeg1_encode_mb调用mpeg1_encode_mb_internal进行编码
mpeg1_encode_mb_internal调用mpeg1_encode_block进行16x16的块编码
3.关于header
mpeg1_encode_picture_header调用了mpeg1_encode_sequence_header写入了序列的头
mpeg1_encode_sequence_header调用了ff_write_quant_matrix这里面,包括了要填的量化表的写入,这个量化表是用户自定义的。在后面又调用了ff_mpeg1_encode_slice_header。
ff_mpeg1_encode_slice_header又调用了写header,写qscale的函数,写文件头。
posted on 2009-09-14 15:32 vincenzo.lai 阅读(2491) 评论(0) 编辑 收藏 举报