加载中…
个人资料
青草梦想2
青草梦想2
  • 博客等级:
  • 博客积分:0
  • 博客访问:12,779
  • 关注人气:0
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

mplayer源码分析(一)

(2007-04-23 17:56:53)
 

我们原来的播放软件,用了mplayer中的库,但是是通过了多次的转接。十分的复杂。于是决定直接去看mplayer的代码。

mplayer代码库下有很多libxxx的目录,是各个解码器针对某一种格式的代码。然后有一个库来综合他们,如此按照层次在综合到总的codec。

比如 mpeg2格式。  在libmpeg中有一个mpeg2_parse函数,这个函数提供给了libmpcodecs中的decode函数使用。 而这个decode函数 将会在libavcodec里被调用。

在libmpcodec中有一个宏,这个宏在vd_internal.h中。如下
#define LIBVD_EXTERN(x) vd_functions_t mpcodecs_vd_##x = {\
 &info,\
 init,\
        uninit,\
 control,\
 decode\
};

可以看出,每个引用这个头文件并使用这个宏的文件中都会产生一个名字类似,后缀不同的变量。
比如在vd_libmpeg2.c中有这样的声明:
#include "vd_internal.h"

//#undef MPEG12_POSTPROC

static vd_info_t info =
{
 "MPEG 1/2 Video decoder libmpeg2-v0.4.0b",
 "libmpeg2",
 "A'rpi & Fabian Franz",
 "Aaron & Walken",
 "native"
};

LIBVD_EXTERN(libmpeg2)

生成的这个变量就叫做mpcodecs_vd_libmpeg2 ,这个变量被用在了lib_mpcodecs/vd.c 的数组mpcodecs_vd_drivers中。
这是一种函数的组织方式。一种编译期的插件机制。是很好的模块化。

顺着这条线继续走,发现原来这个变量用在了mplayer的显示上和lib_mpcodeces的init_video里。

int init_video(sh_video_t *sh_video,char* codecname,char* vfm,int status);

这个函数的参数中有一个codecname,函数中就做过一个查表工作,找到对应的codec。
然后调用他的init方法,并把自己参数中的的sh_video传给他,由他来初始化。

在ini_video中还发现了一个控制动态连接和静态连接的宏。看来是支持动态连接。

这个ini_video被init_best_video调用。

 

 

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有