给新人交接vlc的代码,顺便记下来。
1.vlc的代码结构
compat:跨平台的函数
src/control:外部接口
src:调用逻辑
modules:插件
前文提到过,vlc用c语言实现了多态。这里具体说一说。
1.1插件的导出函数
以modules/access/fs.c为例
宏vlc_module_begin,宏vlc_module_end导出函数vlc_entry__filesystem( module_t *p_module )
宏set_callbacks( Open, Close )设置 module->pf_activate, module->pf_deactivate。
宏set_capability,设置插件的能力。可以用于访问的"access",解复用的“demux”,解码的“decoder”
1.2src/modules/modules.c
遍历plugins下的所有动态库,将这些module_t 放入module_bank。
1.3使用插件
src/input/access.c
p_access->p_module = module_need( p_access, "access", psz_access, true );
遍历module_bank,找到有"access"能力,而且可以处理文件的插件。
调用插件的 module->pf_activate,调用下面的代码,将access_t的成员函数指针指向modules/access/fs.c文件中的函数,这就是“c语言实现多态”的全过程。
{
p_access->pf_write = Write;
p_access->pf_read = Read;
p_access->pf_seek = Seek;
p_access->pf_control = Control;
}
2.线程结构
以播放视频文件(PS+H264)为例,一路视频共有4个线程
A input线程
B decoder线程
C video_output线程
D 窗口消息循环线程
AB,BC之间使用数据队列联系,典型的消费/生产模型。