• VLC播放器架构剖析


    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()作为音频的渲染。
     
  • 相关阅读:
    GreenPlum 大数据平台--集群恢复
    GreenPlum 大数据平台--常用命令
    oracle--CRS-0215 : Could not start resource 'ora.node2.ons'.
    ORACLE--10G安装问题( error while loading shared libraries)
    如何启动一个Vue2.x项目
    django admin登陆添加修改内容
    Vue, element-ui Module build failed: Error: No PostCSS Config found
    Mac安装Vue-cli时 提示bash: vue: command not found问题
    一个挺好用的生成GIF格式图片的小程序
    Vue: 生命周期, VueRouter
  • 原文地址:https://www.cnblogs.com/shakin/p/3901338.html
Copyright © 2020-2023  润新知