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


整个程序可以通过将断点打在ALSAThread()上观察,数据从文件或者网络流到最终被解码的数据的流程,其中几个比较关键的概念是ES,PES,PS,TS。
这个地方对VLC模块的讲解非常清晰:
http://www.enjoythearchitecture.com/vlc-architecture.html


附一张EMACS+GDB调试VLC播放器的截图