VLC程序宏及线程分析

VLC 插件加载管理分析 VLC 插件分为动态插件和静态插件,静态插件直接链接进 VLC 核心,动态插件则在 VLC 可执行文件的链接信息中,无法看到对它们的直接依赖,它们通过动态链接加载机制加载。函数计算所有插件的模块配置的总数,为所有各个模块配置指针分配空间,将各个模块配置指针复制到新分配的模块配置指针数组中,对模块配置指针数组进行排序。VLC 插件/模块框架加载插件时,通过。,则首先在插件缓存中查找插件,查找所用的 key 即为插件文件相对于插件根目录的相对路径,如果找到了,且缓存中的信息不够新,则销毁对应的。 阅读详情

版权信息:

本文来自internet,转载这里供流媒体爱好者学习和研究使用,请尊重作者的劳动成果。未经授权而在商业上使用原作者的文章属侵权行为,后果由使用者自负,本人不承担任何法律责任。

VLC程序宏、线程、回调等相关架构的分析

第一部分 变量及宏定义
1.消息映射宏
vlc_module_begin();
…………………..
vlc_module_end();
2.结构中包含函数
struct input_thread_t
{
    VLC_COMMON_MEMBERS

    /* Thread properties */
    vlc_bool_t              b_eof;
    vlc_bool_t              b_out_pace_control;

    /* Access module */
    module_t *       p_access;
    ssize_t       (* pf_read ) ( input_thread_t *, byte_t *, size_t );
    int           (* pf_set_program )( input_thread_t *, pgrm_descriptor_t * );
    int           (* pf_set_area )( input_thread_t *, input_area_t * );
    void          (* pf_seek ) ( input_thread_t *, off_t );
}
3.宏与换行符妙用
#define VLC_COMMON_MEMBERS 
/* name VLC_COMMON_MEMBERS 
 * these members are common for all vlc objects
*/
/**@{*
    int   i_object_id;
    int   i_object_type;
    char *psz_object_type;
    char *psz_object_name;

 /** Just a reminder so that people don't cast garbage */
    int be_sure_to_add_VLC_COMMON_MEMBERS_to_struct;
/**@}*/                   

#define VLC_OBJECT( x ) / 
((vlc_object_t *)(x))+
0*(x)->be_sure_to_add_VLC_COMMON_MEMBERS_to_struct

struct vlc_object_t
{
    VLC_COMMON_MEMBERS
};//定义一个结构来使用宏定义的公共成员

4.定义导出函数
#ifndef __PLUGIN__
#   define VLC_EXPORT( type, name, args ) type name args
#else
#   define VLC_EXPORT( type, name, args ) struct _u_n_u_s_e_d_
    extern module_symbols_t* p_symbols;
#endif
5.定义回调函数

typedef int ( * vlc_callback_t ) ( vlc_object_t *,      /* variable's object */
 char const *, /* variable name */
 vlc_value_t, /* old value */
 vlc_value_t, /* new value */
 void * ); /* callback data */

6.函数作为参数的定义方式
int Fun(int n,int (*pf)(int ,int),char *pstr)
{
int j =10;
pf(n,j);
}

7.回调函数的声明
必须声明为global,或者static int   vlc_callback_t (int ,int){。。。。。。。。。。。}

8.回调函数的使用
Fun(0, vlc_callback_t,"test");

9.函数表达式
#define input_BuffersInit(a) __input_BuffersInit(VLC_OBJECT(a))
void * __input_BuffersInit( vlc_object_t * );

#define module_Need(a,b,c,d) __module_Need(VLC_OBJECT(a),b,c,d)
VLC_EXPORT( module_t *, __module_Need, ( vlc_object_t *, const char *, const char *, vlc_bool_t ) );

10.定义函数
/* Dynamic array handling: realloc array, move data, increment position */
#define INSERT_ELEM( p_ar, i_oldsize, i_pos, elem )
    do
    {
        if( i_oldsize )
        {
            (p_ar) = realloc( p_ar, ((i_oldsize) + 1) * sizeof( *(p_ar) ) );
        }
        else
        {
            (p_ar) = malloc( ((i_oldsize) + 1) * sizeof( *(p_ar) ) );
        }
        if( (i_oldsize) - (i_pos) )
        {
            memmove( (p_ar) + (i_pos) + 1,
                     (p_ar) + (i_pos),
                     ((i_oldsize) - (i_pos)) * sizeof( *(p_ar) ) );
        }
        (p_ar)[i_pos] = elem;
        (i_oldsize)++;
    }
    while( 0 )

应用为:
     INSERT_ELEM( p_new->p_libvlc->pp_objects,
                     p_new->p_libvlc->i_objects,
                     p_new->p_libvlc->i_objects,
                     p_new );
11.改变地址的方式传递其值
stream_t *input_StreamNew( input_thread_t *p_input )
{    stream_t *s = vlc_object_create( p_input, sizeof( stream_t ) );
    input_stream_sys_t *p_sys;
    if( s )
    {
        s->p_sys = malloc( sizeof( input_stream_sys_t ) );
        p_sys = (input_stream_sys_t*)s->p_sys;
        p_sys->p_input = p_input;
    }
return s;//注解:s->p_sys改变了
}

第二部分  程序框架实现
1. 播放列表文件src/playlist/playlist.c的线程
playlist_t * __playlist_Create ( vlc_object_t *p_parent )函数中创建的线程,线程函数为
static void RunThread ( playlist_t *p_playlist )
线程思路分析:
在RunThread里面执行循环,如果没有任务执行,则适当的延迟,如果接到p_playlist->i_status != PLAYLIST_STOPPED的条件,则调用PlayItem( p_playlist )函数,在PlayItem( p_playlist )函数中从新创建输入线程。

通过void playlist_Command( playlist_t * p_playlist, playlist_command_t i_command,int i_arg )接收来自GUI界面的各种命令,然后设置p_playlist->i_status的状态,由该状态改变该播放列表文件主循环线程的执行。

2. 输入文件SRC/INPUT/INPUT.C的输入线程
input_thread_t *__input_CreateThread( vlc_object_t *p_parent, input_item_t *p_item )

函数中创建的线程,线程函数为
static int RunThread( input_thread_t *p_input )
线程思路分析:
由 input_thread_t结构的成员分析是接收文件流还是网络流,如果是文件流,则调用file module 的读函数(pf_read)和打开函数(--).如果是network 则打开network   module 的打开函数和读函数(pf_read)。
在 RunThread线程函数中接收数据和调用demux 或者decode etc处理。
一旦产生新的输入,则在播放列表线程中会首先结束该输入线程,然后从新创建新的输入线程。

3. 视频输出文件src/video_output/ video_output.c的线程
vout_thread_t * __vout_Create( vlc_object_t *p_parent,
                               unsigned int i_width, unsigned int i_height,
                               vlc_fourcc_t i_chroma, unsigned int i_aspect )函数中创建的线程,线程函数为
static void RunThread( vout_thread_t *p_vout)
线程思路分析:
     在RunThread里面执行循环,任务是显示视频。

4. 在modules/gui/wxwindows/wxwindows.cpp中的GUI线程
static void Run( intf_thread_t *p_intf ) 函数中创建的线程,线程函数为
static void Init( intf_thread_t *p_intf )

线程思路分析:
     在Init( intf_thread_t *p_intf )里面执行循环,创建新的GUI实例。Instance-》OnInit()(CreateDialogsProvider)-》DialogsProvider为运行的对话框。
 
     接收网络文件的步骤
OnOpenNet( wxCommandEvent& event )打开网络文件的步骤。打开OpenDialog对话框,点击Ok后调用OpenDialog::OnOk( wxCommandEvent& WXUNUSED(event) )函数,调用playlist_Command函数改变播放列表线程的状态。

  激活线程分析:
         在wxwindow.cpp中的消息映射中 set_callbacks( OpenDialogs, Close ); 则设置了module_t->pf_activate= OpenDialogs函数,
        在module.c 的__module_Need( vlc_object_t *p_this, const char *psz_capability,
                          const char *psz_name, vlc_bool_t b_strict )
函数中用到了pf_activate激活GUI对话框;
    在video_output.c 的static void RunThread( vout_thread_t *p_vout)线程中,也用到了pf_activate激活GUI对话框;

5. 开始所有module 的精髓
消息映射宏
vlc_module_begin();
set_callbacks( NetOpen, NULL );
vlc_module_end();
然后设置模块结构的成员函数为:
#define set_callbacks( activate, deactivate )
p_submodule->pf_activate = activate;
p_submodule->pf_deactivate = deactivate

在__module_Need函数中启动pf_activate  激活相应的module。

线程池版的VLC从服务器拉取视频流 根据(URL),利用线程池,拉取视频流, 立即下载

相关推荐

Ubuntu20.04浏览器上网慢解决方法——体验优化

一、问题描述 ubuntu上网慢的原因可能有多种: 1.主机网络慢 2.客户机下载网络占用 3.域名解析慢 本文仅代表本人配置过程,网络配置需谨慎小心 二、使用本地DNS服务器解决问题 1.安装 dnsmasq sudo apt-get install dnsmasq 2.配置dnsmasq ——终端输入: sudo gedit /etc/dnsmasq.conf ——文本中查找 : #resolv-file= ——将之替换为: resolv-file=/etc/resolv.dnsm

nofear的博客 1万+

VLC源码分析(二)

第一部分 变量及宏定义1.消息映射宏vlc_module_begin();…………………..vlc_module_end();2.结构中包含函数struct input_thread_t{VLC_COMMON_MEMBERS/* Thread properties */vlc_bool_t b_eof;vlc_bool_t b_out_pace_control;/* Access module *...

weixin_30512785的博客 191

西门子博图指令(定时器操作三)

西门子博图定时器中复位定时器功能指令介绍

yue008的博客 8871

03-vlc模块的加载机制

文章代码基于3.0.6版本 一、vlc模块功能 1、介绍 vlc是高度模块化的,大部分功能都是由不同类型的模块完成的,有200-400个模块。 2、重要概念 vlc模块有两个主要属性 1)capability 它描述了模块的类别,主要类别有: audio filter 音频过滤器, 如:equalizer audio mixer 声道混合器, 如: downmixer audio output 音频输出,如: Windows DirectX audio output decoder 解码器, like t

darkGer的博客 1561

Field II 超声相控阵仿真系列:多角度平面波相干合成提升成像质量

本文深入探讨了Field II超声相控阵仿真中,如何通过多角度平面波相干合成技术提升成像质量。针对单次平面波成像对比度与分辨率不足的问题,详细解析了从探头建模、多角度发射延时计算到回波数据相干合成的完整流程,并提供了关键参数调优建议,以实现图像质量与计算效率的平衡。

weixin_29284885的博客 257

《遥感大模型生产级实战:从数据到决策的端到端AI工程》系列第一部分:AI遥感工程师的基础设施与工具链-文章 4:传统遥感分析与机器学习基线

本章将系统性地介绍经典遥感分析工作流,从数据预处理到多维度特征工程,再到如何利用经典的机器学习模型(如随机森林、支持向量机)进行监督与非监督学习。我们将通过一个完整的“智慧农业作物分类”项目实战,展示如何利用我们之前构建的数据湖和工具链,从原始数据到最终的分析结果,构建一个性能可靠、可解释性强的基线系统。更重要的是,我们将深入剖析这种传统方法的局限性,从而为后续章节引入遥感大模型的必要性提供强有力的论证。

panshengwu的博客 704

vlc学习计划(5)--VLC程序宏及线程分析

                第一部分             变量及宏定义1.消息映射宏                       vlc_module_begin();                           …………………..vlc_module_end();2.结构中包含函数       struct input_thread_t{    VLC_COMMON_MEMBER

jsphuang的专栏 7805

计算机控制液压同步顶升系统,PLC四点多点同步顶升系统,同步液压顶升系统

PLC同步顶升系统系统可分为5个部分:液压泵站、PLC计算机控制系统、液压终端、位移压力检测与人机界面操作系统,位移同步精度1mm,同步控制点数:4,8,12,16,20,40,80,99;产品特点:高速置零、低速顶升,升降速度可以任意控制;液压千斤顶内置式(或外置)位移、压力传感器、均载阀,保证了顶升系统在恶劣工作环境下的高可靠性;均载阀的过载保护功能,避免了多缸顶升时常见的胀缸事故;先进的进油...

weixin_30093045的博客 1432

Android VLC - vlc_module_begin

#define vlc_module_begin() \ EXTERN_SYMBOL DLL_SYMBOL \ int CDECL_SYMBOL __VLC_SYMBOL(vlc_entry) (vlc_set_cb, void *); \ EXTERN_SYMBOL DLL_SYMBOL \ int CDECL_SYMBOL __VLC_SYMBOL(vlc_entry) (vlc_se

fanbird2008的专栏 1754

搭建你的第一个MCP服务器(Python版)

在上两篇博客中,我们已经对MCP(Model Context Protocol)有了初步的了解。MCP是一种强大的协议,能够简化LLM(大型语言模型)与外部工具的交互。今天,我们将通过一个具体的例子,展示如何使用Python搭建一个简单的MCP服务器。通过这个过程,你将能够更好地理解MCP的工作原理,并为后续的应用开发打下基础。在MCP中,工具(Tool)是服务器提供给LLM的接口。我们将定义一个简单的工具,用于接收输入文本并返回处理后的结果。首先,我们需要定义一个工具类。这个工具类将继承自,并实现run。

加入“Super Entity”,与全能开发团队共探AI智能体与数字人项目,开启前沿技术之旅。 8093

RK3568平台开发系列讲解(音频篇)配置声卡

📢本篇文章介绍如何配置声卡。

内核笔记 2448

VLC 模块构造宏的展开(access_output_http为例)

宏的定义: vlc_module_begin ()     set_description( N_("HTTP stream output") )     set_capability( "sout access", 0 )     set_shortname( "HTTP" )     add_shortcut( "http", "https", "mmsh" )     set_ca

DANFBAORE的博客 407

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

vlc学习计划(4)--VLC程序宏及线程分析

<br />版权信息:<br /><br />本文来自internet,转载这里供流媒体爱好者学习和研究使用,请尊重作者的劳动成果。未经授权而在商业上使用原作者的文章属侵权行为,后果由使用者自负,本人不承担任何法律责任。<br />VLC程序宏、线程、回调等相关架构的分析<br />第一部分 变量及宏定义<br />1.消息映射宏<br />vlc_module_begin();<br />…………………..<br />vlc_module_end();<br />2.结构中包含函数<br />struct

smilestone322的专栏 1276

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

vlc结构分析和视频播放的基本原理

第一部分 变量及宏定义   1.消息映射宏    vlc_module_begin();    …………………..   vlc_module_end();   2.结构中包含函数    struct input_thread_t   {    VLC_COMMON_MEMBERS    /* Thread properties */    vlc_bool_t b_eof;...

移动开发记录 246

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

加载插件(二)之静态加载

举个例子来说明插件的加载,以核心插件为例,它在libvlc_new中执行,流程如下: 上图中的vlc_entry__core是一个函数指针,定义在modules.h中:/** Core module */ int vlc_entry__core (int (*)(void *, void *, int, ...), void *);那么vlc_entry__core 定义在哪里呢,为什么调用它会跳

奔向火星的博客 751

VLC代码初探(部分内容鉴于作者智商,基本胡扯)

 VLC代码初探(部分内容鉴于作者智商,基本胡扯)1 废话2 代码阅读工具、方法3 VLC部分框架,结合control的rc说明4 下一步工作一废话:惭愧进度比预计的要慢,有老婆孩子就是麻烦阿,尤其是孩子还在老婆肚子里面的时候。想当年年轻的时候晚上工作到2、3点,第2天早上7:30接着搞,LFS的时候3天时间搞定,包括吃饭睡觉几乎没有离开电脑。(bahbahbah.

4361

【十三】【vlc-anroid】EGL OpenGL模块组件加载源码实现分析

由第十二章节分析,可知,vlc使用OpenGL加载时,android端会加载【“opengl”】名的组件模块。 如下找到该组件声明: // 【vlc/modules/video_output/opengl/egl.c】 vlc_module_begin () set_shortname (N_("EGL")) set_description (N_("EGL extension for OpenGL")) set_category (CAT_VIDEO) set_subca

CloverLHao的博客 870

VLC架构及流程分析

VLC架构及流程分析

m0_60259116的博客 1547

vlc相关命令行设置

1:改变VLC模块参数   http://tianxiaoma.blog.51cto.com/1501174/309519 ======================================== ========================================               改变VLC模块参数 一、动态改变参数:     查询得到对象,直接设置参数...

weixin_34220834的博客 635

vlc 播放器的播放进度条的时间不刷新

有些视频如(rmvb)视频在使用vlc播放器播放时会出现进度条不能刷新的问题, 。。。。。。。。。 上面是对整个vlc播放器源码的分析,至于对time当前时间不更新,是解码时间的参数有问题,我的解决方法,直接升级ffmpeg解码模块。找到ffmpeg源码所在目录,修改sh文件。将下载最新的源码拷贝进去编译。生成静态库。问题完美解决。

over666的点滴记载 8843

VLC 加载插件仓库

首先从  vlc/lib/libvlc_new()入手 :   用于初始化一个libvlc的实例,argc表示参数的个数,argv表示参数,                                                   返回创建的实例若当发生错误时返回NULL   {       //vlc/src/libvlc.c       libvlc_InternalCrea

身份验证的专栏 1262
上一篇: 整理开发学习资源
下一篇: 网络数据流接收处理过程分析
xb_smart
博客等级 码龄16年 124粉丝 74原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值