VLC采用多線程并行解碼架構(gòu),線程之間通過單獨的一個線程控制所有線程的狀態(tài),解碼器采用filter模式.組織方式為模塊架構(gòu)

模塊簡述:
libvlc                  
是VLC的核心部分。它是一個提供接口的庫,
比如給VLC提供功能接口:流的接入,音頻視頻的輸出,插件管理,線程系統(tǒng)。
interface           包含與用戶交互的按鍵和設(shè)備彈出。
Playlist               管理播放列表的交互,如停止,播放,下一個,或者隨機播放。
Video_output    初始化video顯示器,從解碼器得到所有的圖片和子圖片。隨意將他們轉(zhuǎn)換為其他的格式并且播放(如YUV到RGB)
Stream_output  類似Audio_output
Misc                    是被其他部分使用的雜項,如線程系統(tǒng),消息隊列,CPU探測,對象查詢系統(tǒng),或者特定平臺代碼。

運行時架構(gòu):步驟
1.main負(fù)責(zé)初始化所有結(jié)構(gòu)體,全局資源,派生出:
--->   2.playlist,初始化和管理播放器的播放列表。
--->   3.一個中間線程,
--->   4.SigThread控制播放器的播放暫停等,管理最終的程序退出,在接到信號(待定)后執(zhí)行l(wèi)ibvlc_Quit()銷毀所有與libvlc相關(guān)的線程和資源.。播放完畢后,音視頻的輸出線程先退出(可能由他們自己管理自己,完成后自動退出 )
      接著渲染(或者驅(qū)動)線程退出。2個視頻解碼渲染,1個音頻解碼渲染。
        ( 7-Vout,    9-video_output,   10-xcb.c/Thread()
                                                    11-xdg.c/Thread()
            8-Aout,    12-audio_output/alsa.c/ALSAThread()循環(huán)調(diào)用ALSAFill(p_aout))
--->  5.RunInterface: setups necessary data and give control to the interface
     執(zhí)行Run(),控制所有線程開始,其他線程得到消息之后并行運行。 Run()函數(shù)中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 );循環(huán)解析播放列表,播放所有的資源。
線程6派生出:
      線程7.input/DecoderThread(),這個線程被VoutCreate函數(shù)創(chuàng)建,使用Ffmpeg作為解碼庫
      線程8.input/DecoderThread(),這個線程被audio_output/alsa.c/Open()函數(shù)創(chuàng)建
線程7是Video的解碼線程,它派生出:
      線程9.video_output/RunThread(),這個線程作為視頻解碼器使用,這是它的調(diào)用棧的回溯表:
          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創(chuàng)建,它派生出線程12.audio_output/alsa.c/ALSAThreade()作為音頻的渲染。


整個程序可以通過將斷點打在ALSAThread()上觀察,數(shù)據(jù)從文件或者網(wǎng)絡(luò)流到最終被解碼的數(shù)據(jù)的流程,其中幾個比較關(guān)鍵的概念是ES,PES,PS,TS。
這個地方對VLC模塊的講解非常清晰:
http://www.enjoythearchitecture.com/vlc-architecture.html


附一張EMACS+GDB調(diào)試VLC播放器的截圖