VLC播放器架构剖析

时间:2021-02-25 16:12:11
VLC采用多线程并行解码架构,线程之间通过单独的一个线程控制所有线程的状态,解码器采用filter模式.组织方式为模块架构


模块简述:
libvlc                  
是VLC的核心部分。它是一个提供接口的库,比如给VLC提供功能接口:流的接入,音频视频的输出,插件管理,线程系统。

interface           包含与用户交互的按键和设备弹出。
Playlist               管理播放列表的交互,如停止,播放,下一个,或者随机播放。
Video_output    初始化video显示器,从解码器得到所有的图片和子图片。随意将他们转换为其他的格式并且播放(如YUV到RGB)
Stream_output  类似Audio_output
Misc                    是被其他部分使用的杂项,如线程系统,消息队列,CPU探测,对象查询系统,或者特定平台代码。
 

运行时架构:步骤

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()作为音频的渲染。