运行时架构:步骤
1.main负责初始化所有结构体,全局资源,派生出:
---> 2.playlist,初始化和管理播放器的播放列表。
---> 3.一个中间线程,
---> 4.SigThread控制播放器的播放暂停等,管理最终的程序退出,在接到信号(待定)后执行libvlc_Quit()销毁所有与libvlc相关的线程和资源.。播放完毕后,音视频的输出线程先退出(可能由他们自己管理自己,完成后自动退出 )
接着渲染(或者驱动)线程退出。2个视频解码渲染,1个音频解码渲染。
( 7-Vout, 9-video_output, 10-xcb.c/Thread()
11-xdg.c/Thread()
8-Aout, 12-audio_output/alsa.c/ALSAThread()循环调用ALSAFill(p_aout))
---> 5.RunInterface: setups necessary data and give control to the interface
执行Run(),控制所有线程开始,其他线程得到消息之后并行运行。 Run()函数中ReadCommand( p_intf, p_buffer, &i_size );解析外部命令。这里是一个命令模式
线程2 派生出
线程6.input/Run(),该线程阻塞在while( !LoopInput( p_playlist ) ) vlc_cond_wait( &p_sys->signal, &p_sys->lock ); 上。并且通过 LoopRequest( p_playlist );循环解析播放列表,播放所有的资源。
线程6派生出:
线程7.input/DecoderThread(),这个线程被VoutCreate函数创建,使用Ffmpeg作为解码库
线程8.input/DecoderThread(),这个线程被audio_output/alsa.c/Open()函数创建
线程7是Video的解码线程,它派生出:
线程9.video_output/RunThread(),这个线程作为视频解码器使用,这是它的调用栈的回溯表:
FT_Get_Glyph () from /usr/lib/i386-linux-gnu/libfreetype.so.6
RenderText () at freetype.c:1212
SpuRenderText () at video_output/vout_subpictures.c:1093
SpuRenderRegion () at video_output/vout_subpictures.c:1361
spu_RenderSubpictures () at video_output/vout_subpictures.c:507
vout_RenderPicture () at video_output/vout_pictures.c:383
RunThread () at video_output/video_output.c:1148
线程9派生出两个渲染器线程线程分别为:
---> 线程10.video_output/xcb/Thread()
---> 线程11.modules/misc/inhibit/xdg.c/Thread()
线程8.是音频解码线程,通过aout_outputNew创建,它派生出线程12.audio_output/alsa.c/ALSAThreade()作为音频的渲染。