VLC目录结构介绍

http://blog.csdn.net/tteaonly/article/details/7279130

0. 起因

VLC最近出了2.0版本,决定今年深入掌握之,从分析代码开始,以此为备忘。

1. 概述

VLC多媒体框架的优点是:1.系统更加紧凑、高效;2.跨平台支持好,特别是桌面平台(包括Windows、Mac);
3. 编译系统完善,很容易可以构造出支持Windows,Linux的版本;4. 社区活跃,长期技术更新支持有保证。

整个VLC是以libvlc和libvlccore以及第三方插件组成,前端是独立的。据悉VLC C源码是黑客级别,本人看了多
眼之后,深以为然,包括有:类对象架构,观察者模式,插件管理系统等值得学习的代码。另外一方面,整个代
码要消化和理解也是一件不容易的事情。而且由于历史原因,整个VLC代码到处充满了垃圾和无用的代码,估计
清理起来也非常麻烦。

2. 目录说明 ( 以 vlc-2.0.0 为准)

  • include/                         libvlccore 库的头文件,编写自己的插件也是需要包含这里
  • include/vlc                     libVLC头文件,如果仅仅使用libvlc开发,需要包含这里
  • bin                                 vlc程序代码,即原生GUI前端程序代码
  • lib                                  libVLC接口实现代码
  • compat                          跨 OS 代码
  • contrib                           第三方库的针对VLC的patch以及编译脚本
  • extras                            一些不太常用的辅助工具以及脚本
  • modules                        将各种第三方库封装为VLC的插件,按目录区分功能,如demux,video_filter等等
  • src                                 libvlccore实现,是vlc架构最重要部分

主要需要重点学习和关注的是:lib src两个目录之下的代码,这个两个目录也是整个vlc项目的核心。

3.    核心对象

使用libVLC构建一个最简单的播放器只需要调用下面间的API

[cpp] view plain copy

  1. _vlcinstance = <strong>libvlc_new</strong>(sizeof(vlc_args) / sizeof(vlc_args[0]), vlc_args);
  2. _mp = <strong>libvlc_media_player_new</strong> (_vlcinstance);
  3. libvlc_media_player_set_xwindow (_mp, windid );
  4. _msource = libvlc_media_new_location(_vlcinstance, "./demo.mp4");
  5. <strong>libvlc_media_player_set_media</strong> (_mp, _msource);
  6. <strong>ibvlc_media_player_play</strong> (_mp);

首先通过libvlc_new构造一个全局的instance对象,这个指针可以看作VLC context的handler.  整个VLC对象使用
XXX_new , XXX_release, XXX_retain 三个函数来管理对象的创建销毁以及引用,针对每个对象使用ref_count记录
指针引用次数,这样可以调用XXX_release函数多次,在最后一次进行真正的资源释放工作。 libvlc_instance_t 对
象组成如下,包括两个核心功能的顶层指针(核心对象一个是管理播放,一个是管理流媒体服务)。

libvlc_instance对象组成
libvlc_int_t *p_libvlc_int;
libvlc_vlm_t  libvlc_vlm;
unsigned      ref_count;
vlc_mutex_t   instance_lock;

为了完成播放人物还需libvlc_media_player_t 以及 libvlc_media_t 两个对象,这个两个对象都是从libvlc_instance对象
创建,其中libvlc_media_t封装了多媒体对象,可以是一个文件,一个URL或者一个媒介(如DVD)。 libvlc_media_player
对象则封装播放相管内容。

首先看看 libvlc_media_t 对象,主要组成如下:

libvlc_media对象组成

 //指向顶层指针

int                i_refcount;

libvlc_instance_t *p_libvlc_instance;   

//播放对象描述
input_item_t      *p_input_item;
libvlc_media_list_t *p_subitems;
void *p_user_data;
//控制变量
libvlc_event_manager_t * p_event_manager;
vlc_cond_t parsed_cond;
vlc_mutex_t parsed_lock;
//内置变量
bool is_parsed;
bool has_asked_preparse;

接下来就是最重要libvlc_player对象的组成了:

libvlc_player对象组成
int                i_refcount;
libvlc_instance_t * p_libvlc_instance;
vlc_mutex_t        object_lock;
libvlc_media_t * p_md;
libvlc_event_manager_t * p_event_manager;
    struct
    {   
        input_thread_t   *p_thread;
        input_resource_t *p_resource;
        vlc_mutex_t       lock;
    } input;

其中最最重要的就是这个 struct  input结构体,几乎所有重要的内容都在这个结构体内部,是理解整个VLC的核心,VLC内
主要的对象Access, Stream, Demuxer, Decoder, Vout, Aout全部都包含在input_thread, input_resource内。

时间: 2024-10-19 14:03:19

VLC目录结构介绍的相关文章

vue学习笔记——目录结构介绍(二)

1.初始目录结构如下: 2.目录结构介绍 目录/文件 说明 build 最终发布的代码存放位置. config 配置目录,包括端口号等.我们初学可以使用默认的. node_modules npm 加载的项目依赖模块 src 这里是我们要开发的目录,基本上要做的事情都在这个目录里.里面包含了几个目录及文件: assets: 放置一些图片,如logo等. commponents: 目录里面放了一个组件文件,可以不用. App.vue: 项目入口文件,我们也可以直接将组建写这里,而不使用 commpo

Linux源代码目录结构介绍

1.arch目录:存放不同平台的相关代码,每种平台用不同的目录来区分. ******Alpha平台 ******Arm平台 ******Arv32平台 ******X86平台 2.drivers目录:存放驱动程序的目录,不同的驱动用不同的目录来加以区分. ******ftape:磁带驱动 ******hfmodem:无线电设备驱动 ******joystick:游戏杆驱动 ******paride:从并口访问IDE设备的支持 ******cdrom:光驱驱动 ******char:字符设备驱动

Magento学习第一课——目录结构介绍

Magento学习第一课--目录结构介绍 一.Magento为何强大 Magento是在Zend框架基础上建立起来的,这点保证了代码的安全性及稳定性.选择Zend的原因有很多,但是最基本的是因为zend框架提供了面向对象的代码库并且有很好的团队支持.通过这个框架,Magento主要围绕三个基本点建立: 1. 灵活性:我们相信每一个解决方案都像它的商务支持一样是独一无二的.Magento的代码可以无缝定制的. 2. 可升级性:Magento可方便的实行定制且不丧失升级的能力,因为从社区中获得核心代

微擎目录结构介绍

pro ├─ addons ---------------- [模块安装目录] (意为附加组件) │ ├─ business -------------- 模块的名称 (示例) │ │ ├─ images 建议 css 文件也放此目录. │ │ ├─ template 模板目录 │ │ │ ├─ mobile APP 端模板目录 │ │ │ │ └─ ... *.html APP 端模板文件 │ │ │ └─ ... *.html Web 端模板文件 │ │ ├─ inc 引用的 php 文件目

create-react-app脚手架的安装和目录结构介绍

1.对脚手架的初步了解 编程领域中的"脚手架"指的是能够快速搭建项目"骨架"的一类工具,例如大多数的React项目都有src,public,webpack配置文件等等,而src目录中又包含components目录等等.每次在新建项目时,手动创建这些固定的文件目录.脚手架的作用就是帮助你完成这些重复性的工作,包括一键生成主要的目录结构.安装依赖等等. 2.脚手架的安装 ①两步操作即可完成 npm  install -g create-react-app yarn  (

Linux目录结构介绍

目录结构 重点: linux下一切从根"/"开始 Linux下磁盘不挂载不能使用,必须挂载. 一.Linux系统目录结构的基本特点介绍 (1)Linux目录一切从"根"开始,"/"是所有目录的起点(顶点):相对路径(目录)和绝对路径(目录). (2)Linux根下面的目录是一个有层次的树状结构 (3)倒挂的一棵树 (4)Linux每个目录可以挂载在不同的设备(磁盘)上,windows不容易做到. 在逻辑上所有的目录(包括目录下的子目录)都在最高级

epub电子书--目录结构介绍

epub电子书简介 epub全称为Electronic Publication的缩写,意为:电子出版, epub于2007年9月成为国际数位出版论坛(IDPF)的正式标准,以取代旧的开放Open eBook电子书标准,epub这种格式kindel目前不支持, 必须用相应的软件打开,比如PC端用calibre,(calibre可是kindle的好伙伴, 可以用来整理或者同步kindle的书架), 如下图: 或者用 Adobe Digital Edition(这个软件很小,解析纯文本的epub就好,

Linux的目录结构介绍

简单篇~~~各位大神看到有不正确的地方及时纠正小弟~~~小弟在此抱拳谢过! 此次介绍的目录结构是基于CentOS 6.8系统~ 根目录:/ bin目录:存放普通用户可以使用的命令 boot:存放系统的启动文件 dev:存放系统的硬件设备信息 etc:存放系统的配置信息:属于重要目录,不要随意修改里面的内容 home:普通用户的主目录:每个普通用户都会默认在home目录下有一个跟其名字相同的目录 lib:library,库:公共的,可被调用的方法包 lost+found:系统非正常关闭后,未正常保

iOS 沙盒目录结构介绍

iOS系统中,每个应用都有自己的沙盒,且应用只能访问其对应的沙盒目录下面的文件.当然,在用户授权的情况下,应用也可以访问其他目录下面的文件.比如,用户授权情况下,应用可以访问相册.通讯录.在开发中,经常会涉及到 iOS 沙盒目录,比如读写文件,归档解档等. 一:沙盒的目录结构 app的沙盒目录结构如下图: 可知,沙盒目录下有三个文件夹:Documents.Library.Temp.其中,Library下面有两个文件夹,分别是 Preferences 和 Caches. 二:每个目录下存放的文件