VLC 媒体播放器的运行核称之为libVLCcor.
libVLCcore 管理线程,模块(编解码器,解复用器等), 模块功能层,时钟,播放清单和VLC的低层控制.例如, 音频和视频同步管理。在它的上层,是libVLC,通过该模块,外部的应用开发者可以使用运行库的所有功能。功能模块与livVLCcore关联和交互。
功能模块按照libVLCcore要求设计,而外部应用程序按照libVLC要求设计.
VLC管道和模块化
VLC一个主要的概念是 "模块化".
VLC实际上是一个完整的多媒体框架(有点像DirectShow或 GStreamer),它可以根据需要动态装载插件模块。
该核心框架用来在媒体数据处理过程中,连接各个模块,从输入(文件,网络流)到输出(音频,视频显示或播放,或输出到网络)。VLC使用模块来做实际的各种工作(如复用,解码,过滤,输出)。(请参考VLC装载机制).
每个模块提供不同的功能,这些功能可能满足一些特别的要求或在特定的环境下使用。另外,VLC的可移植性,可以为不同系统平台编写可以音视频输出模块,甚至用户接口模块。
插件模块(plugins)利用函数可以动态装载,这些函数定义在src/modules.c 文件里面。
利用libVLC,功能模块也可以直接在应用系统里面开发,例如有些操作系统不支持动态装载功能。这些模块可以称之内置件(buitlins)
在源代码里面,模块通常放在modules目录下的子目录。
线程管理
VLC为多线程。
使用单线程方法复杂度比较高。解码重入和调度为主要原因(如解码和输出必须分开,否则,不能保证一帧可以在指定时间内显示)。
多进程方法也没有采用。多进程解码意味着更多系统开销,而且进程间通信也是非常困难。
VLC线程结构按照POSIX (pthread)线程进行封装。然而,为了便于移植,VLC没有直接使用pthread函数,而是采用一套定制的API。
线程(vlc_thread_t)
· vlc_clone()创建线程.
· vlc_join() 等待线程终止,并释放占用的资源。
互斥锁 (vlc_mutex_t)
· vlc_mutex_init() 创建非递归锁.
· vlc_mutex_init_recursive() 创建递归锁(不建议).
· vlc_mutex_lock() 锁住,如需要,可以等待.
· vlc_mutex_trylock() 尝试锁定,(如果还没有锁定,就进行锁定,否则,返回一个错误)
· vlc_mutex_unlock() 解锁.
· vlc_mutex_destroy() 销毁锁。
条件变量 (vlc_cond_t)
· vlc_cond_init() 创建一个条件变量,利用mdate()时钟记时。
· vlc_cond_init_daytime() 创建一个条件变量,使用实时时钟记时。
· vlc_cond_signal() 为等待的线程产生一个信号。
· vlc_cond_broadcast()为多个等待的线程产生一个信号。
· vlc_cond_wait() 等待一个条件变量产生信号。
· vlc_cond_timedwait() 在指定的时间内,等待条件变量产生信号。
· vlc_cond_destroy() 销毁条件变量。
其它
VLC 也提供一些同步对象的抽象。瘦读写锁,线程内变量。
原子变量
原子变量是很小的值,这些值可以在没有锁定的情况下,进行操作。了解更多支持的操作,请参考include/vlc_atomic.h。
同步
另一个VLC关键的特点是解码和播放为异步的:解码线程进行解码,音频输出或视频输出线程进行播放。 这个设计目标保证音频或视频帧在正确的时间里面播放,而不会阻塞解码线程。这样就在用户接口,输入,解码,输出模块之间形成一个复杂的通信结构。
几个输入和输出线程允许同时读写多个文件(尽管当前的用户接口不允许这么做)。 这样意味着不可重入的库需要使用全局锁以后才能使用。
播放时间戳在媒体流的系统层,并传送给解码器,这样所有的采样帧相应进行播放记时。输出层根据这个时间进行播放。 时间为毫秒单位,为1970/1/1以来的毫秒数。 mtime_t类型为 64位有符号整数。
当前的时间使用mdate()函数获取。执行线程在等待一定时间后进行播放。
警告
请记住,如果需要进行特别的处理(如 色度转换 ),线程应该比播放时间稍微早一点进行播放。.如在 modules/codec/libmpeg2.c里面, 平均解码时间的跟踪可以保证图片不会解码太迟。
运行库源代码详细介绍
所有 libVLCcore 源代码文件在src目录下的子目录里面:
· audio_output/: 初始化音频混合器,即找到正确的播放频率,然后重新将从解码器传送过来的音频帧进行采样。
· config/: 从命令行和配置文件装载配置信息,提供函数给模块进行读写。
· control/: 控制livVLCcore的行为,如播放/暂停,音量管理,满屏,LOG输出等等
· extras/: 主要为面向平台的代码
· input/: 打开输入模块,读取数据包,解析数据包,将非结构化的单元流传送给解码模块。
· modules/: 模块管理
· interface/: 用户接口代码,如按键,设备弹出。
· misc/: 为分类的实用函数,如线程管理,消息队列,CPU检测,对象查找系统,面向平台的代码
· network/: 网络接口 (套接字管理,网络错误等)
· osd/:屏幕显示操作
· playlist/: 管理播放清单接口,如停止,播放,下一曲,随机播放。
· stream_output/: 将音频/视频流输出到网络
· test/: libVLC 本身测试代码
· text/: 字符集
· video_output/: 初始化视频显示,获取所有图片,需要的化将他们转换成其他格式如 (YUV到 RGB),然后显示。