VLC播放主要流程

前言

VLC 播放流程大概是先加载解封装器,然后通过es_out控制所有的stream。然后会加载decoder。最终通过resource文件的方法交给输出 模块。下面简要介绍。

正文

播放器主要分为三层。主要通过两个接口实现了功能隔离。分别是es_out.c和decoder.c的实现了:

//控制解封装后的的数据,通过send增加数据
static const struct es_out_callbacks es_out_cbs =
{.add = EsOutAdd,.send = EsOutSend,.del = EsOutDel,.control = EsOutControl,.destroy = EsOutDelete,.priv_control = EsOutPrivControl,
};//解封装后的数据传给输出
static const struct decoder_owner_callbacks dec_video_cbs =
{.video = {.get_device = ModuleThread_GetDecoderDevice,.format_update = ModuleThread_UpdateVideoFormat,.buffer_new = ModuleThread_NewVideoBuffer,.queue = ModuleThread_QueueVideo,.queue_cc = ModuleThread_QueueCc,.get_display_date = ModuleThread_GetDisplayDate,.get_display_rate = ModuleThread_GetDisplayRate,},.get_attachments = InputThread_GetInputAttachments,
};
static const struct decoder_owner_callbacks dec_audio_cbs =
{.audio = {.format_update = ModuleThread_UpdateAudioFormat,.queue = ModuleThread_QueueAudio,},.get_attachments = InputThread_GetInputAttachments,
};

解封装部分主要通过Run方法开启的线程实现多线程的解封装。

int input_Start( input_thread_t *p_input )
{void *(*func)(void *) = Run;/* Create thread and wait for its readiness. */priv->is_running = !vlc_clone( &priv->thread, func, priv );
}static void *Run( void *data )
{if( !Init( p_input ) ){MainLoop( p_input, true ); /* FIXME it can be wrong (like with VLM) */End( p_input );}
}

这是核心问题,主要是初始化,加载读取存储截至的资源(比如网络资源,硬盘等)加载stream filter(比如缓存控制等),最后加载解封装器。然后通过MainLoop,的MainLoopDemux的demux_Demux。本质上就是调用demux模块的demux_pf的。
拿到的结果交给第二部分。EsOutSend。最终交给decoder。然后返回给dec.c中。
第三部分则通过ModuleThread_QueueAudio。拿到解码后的数据,然后调用audiofilter,处理声音,最终交给aout 的play函数,最终初始化audiotrack,播放数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/35396.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法练习-搜索 相关

文章目录 迷宫问题 迷宫问题 定义一个二维数组 m行 * n列 ,如 4 5 数组下所示: int arr[5][5] { 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, }; 它表示一个迷宫,1表示墙壁,0表示可以走的路,只…

Synchronized八锁

/** * Description: 8 锁 * 1 标准访问,先打印短信还是邮件 ------sendSMS ------sendEmail 2 停 4 秒在短信方法内,先打印短信还是邮件 ------sendSMS ------sendEmail 3 新增普通的 hello 方法,是先打短信还是 hello ------getHello ------…

Idea中使用statement接口对象,显示mysql版本号,所有库和表名

使用statement 接口对象,进行以下操作: 显示数据库版本号显示所有库显示所有库中的table表 显示数据库版本号: public class StatementDemo {Testvoid showall(){try{Statement st conn.createStatement();ResultSet rs st.executeQuery(…

pytest fixture 常用参数

fixture 常用的参数 参数一:autouse,作用:自动运行,无需调用 举例一:我们在类中定义一个function 范围的fixture; 设置它自动执行autouseTrue,那么我们看下它执行结果 输出: 说明:…

Leetcode-每日一题【剑指 Offer 12. 矩阵中的路径】

题目 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。 例如,在下面的 34 的矩阵中包含单词 "ABCCED"(单词中的字母…

CUDA执行模型

一、CUDA执行模型概述 二、线程束执行 1. 线程束与线程块 线程束是SM中基本的执行单元。 当一个线程块的网格被启动后,网格中的线程块分布在SM中。 一旦线程块被调度到一个SM中,线程块中的线程会被进一步划分成线程束。 一个线程束由32个连续的线程…

【Express.js】数据库初始化

数据库初始化 在软件开发阶段和测试阶段,为了方便调试,我们通常会进行一系列的数据库初始化操作,比如重置数据表,插入记录等等,或者在部署阶段进行数据初始化的操作 根据前面章节介绍过的 knex.js 和 sequelize.js&…

基于自适应曲线阈值和非局部稀疏正则化的压缩感知图像复原研究【自适应曲线阈值去除加性稳态白/有色高斯噪声】(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

什么是媒体代发布?媒体代发布注意事项

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 媒体代发布是指将新闻稿或其他宣传内容委托给专业的媒体代理机构或公司进行发布和推广的活动。这些机构通常拥有丰富的媒体资源、人脉和经验,能够更好地将信息传递给目标受众…

C语言 指针与内存之间的关系

一、内存与字节 一个内存单元一个字节一个地址 整型 int 类型中int类型的字节数是4 且一个字节表示八个bite位 一个二进制数位有着32个bite 所以又可以表示为:一个字节 8个比特位 32位数的二进制数位的八分之一 例如: int a 10; 该表达式…

项目实战 — 消息队列(9){编写demo程序}

消息队列服务器核心功能就是,提供了虚拟主机,交换机, 队列,消息等概念的管理,实现三种典型的消息转发方式,可以实现跨主机/服务器之间的生产者消费模型。 这里,就编写一个demo,实现…

【实战讲解】数据血缘落地实施

‍在复杂的社会分工协作体系中,我们需要明确个人定位,才能更好的发挥价值,数据也是一样,于是,数据血缘应运而生。 今天这篇文章会全方位的讲解数据血缘,并且给出具体的落地实施方案。 一、数据血缘是什么…

JAVA多线程和并发基础面试问答(翻译)

JAVA多线程和并发基础面试问答(翻译) java多线程面试问题 1. 进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用。而线程是在进程中执行的一个任务。Java运行环境是一个包含了不同的类和程序…

苏州OV泛域名RSA加密算法https

RSA加密算法是一种非对称加密算法,它被广泛应用于信息安全领域。与对称加密算法不同,RSA加密算法使用了两个密钥,一个公钥和一个私钥。公钥可以公开,任何人都可以使用它加密信息,但只有私钥的持有者才能解密信息。RSA加…

php如何对接伪原创api

在了解伪原创api的各种应用形态之后,我们继续探讨智能写作背后的核心技术。需要说明的是,智能写作和自然语言生成、自然语言理解、知识图谱、多模算法等各类人工智能算法都有紧密的关联,在百度的智能写作实践中,常根据实际需求将多…

全球劳动力革命,Papaya Global 打破薪资界限

员工需求和劳动力结构的进一步变化,只会增加对更加自动化和全面的全球薪资解决方案的需求。 远程工作潮流与全球劳动力的蓬勃发展,使得企业在全球范围内,寻找最优秀的人才成为可能。然而,随之而来的复杂薪资管理挑战,也…

优雅地处理RabbitMQ中的消息丢失

目录 一、异常处理 二、消息重试机制 三、错误日志记录 四、死信队列 五、监控与告警 优雅地处理RabbitMQ中的消息丢失对于构建可靠的消息系统至关重要。下面将介绍一些优雅处理消息丢失的方案,包括异常处理、重试机制、错误日志记录、死信队列和监控告警等。…

BUUCTF题目Web部分wp(持续更新)

关于SQL注入的一些通用办法 可以访问哪些表 如有权限,查询当前用户可以访问的所有表 --Oracle查询当前用户可访问的所有表 select owner, table_name from all_tables order by table_name; --MySQL查询用户可访问的所有数据库和表 select table_sche…

爬虫017_urllib库_get请求的quote方法_urlencode方法_---python工作笔记036

按行来看get请求方式 比如这个地址 上面这个地址复制粘贴过来以后 可以看到周杰伦变成了一堆的Unicode编码了 所以这个时候我们看,我们说https这里,用了UA反爬,所以这里 我们构建一个自定义的Request对象,里面要包含Us

电脑mfc140u.dll丢失的怎么办呢?这个方法亲测可以解决

修复mfc140u.dll是我最近遇到的一个技术问题,虽然在解决过程中遇到了一些困难,但最终的成功修复让我对技术的力量有了更深的体会。 首先,我想谈谈遇到问题时的困惑。当我尝试运行一个应用程序时,突然弹出一个错误提示,…