gstreamer插件开发-What are states?

## What are states?状态描述元素实例是否初始化、是否准备好传输数据以及当前是否正在处理数据。在GStreamer中定义了四种状态:
> - GST_STATE_NULL> - GST_STATE_READY> - GST_STATE_PAUSED> - GST_STATE_PLAYING
从现在开始,它们将被简单地称为“NULL”、“READY”、“PAUSED”和“PLAYING”。**GST_STATE_NULL** 是元素的默认状态。在这种状态下,它没有分配任何运行时资源,没有加载任何运行时库,显然它不能处理数据。**GST_STATE_READY** 是元素可以进入的下一个状态。在READY状态下,元素分配了所有默认资源(运行时库、运行时内存)。然而,它还没有分配或定义任何特定于流的东西。当从NULL到READY状态(**GST_STATE_CHANGE_NULL_TO_READY**)时,元素应该分配任何非流特定的资源,并且应该加载运行时可加载的库(如果有的话)。当进行相反的操作时(从**READY**到NULL, **GST_STATE_CHANGE_READY_TO_NULL**),元素应该卸载这些库并释放所有已分配的资源。这种资源的例子是硬件设备。请注意,文件通常是流,因此这些文件应被视为特定于流的资源;因此,不应该在这种状态下分配它们。**GST_STATE_PAUSED** 是元素准备接受和处理数据的状态。对于大多数元素,这种状态与PLAYING相同。此规则的唯一例外是接收元素。Sink元素只接受一个数据缓冲区,然后阻塞。在这一点上,管道是“预卷”,并准备立即呈现数据。**GST_STATE_PLAYING** 是元素可以处于的最高状态。对于大多数元素来说,这种状态与暂停状态完全相同,它们接受并处理带有数据的事件和缓冲区。只有sink元素需要区分暂停状态和播放状态。在播放状态下,接收器元素实际渲染传入数据,例如输出音频到声卡或渲染视频图像到图像接收器。## Managing filter state
如果可能的话,您的元素应该从一个新的基类(预制基类)派生。对于不同类型的源、汇和过滤器/转换元素,有现成的通用基类。除此之外,音频和视频元素以及其他元素还存在专门的基类。如果使用基类,则很少需要自己处理状态更改。您所要做的就是重写基类的start()和stop()虚函数(可能根据基类的不同而被不同地调用),基类将为您处理所有事情。但是,如果您不是从现成的基类派生,而是从GstElement或其他不是构建在基类之上的类派生,那么您很可能必须实现自己的状态更改函数,以便收到状态更改的通知。如果你的插件是一个demuxer或demuxer,这是绝对必要的,因为还没有针对muxers或demuxers的基类。可以通过虚函数指针通知元素状态更改。在这个函数中,元素可以初始化元素所需的任何类型的特定数据,并且它可以选择从一种状态切换到另一种状态。对于未处理的状态更改不要g_assert;这是由GstElement基类处理的。
```
static GstStateChangeReturn
gst_my_filter_change_state (GstElement *element, GstStateChange transition);static void
gst_my_filter_class_init (GstMyFilterClass *klass)
{GstElementClass *element_class = GST_ELEMENT_CLASS (klass);element_class->change_state = gst_my_filter_change_state;
}static GstStateChangeReturn
gst_my_filter_change_state (GstElement *element, GstStateChange transition)
{GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;GstMyFilter *filter = GST_MY_FILTER (element);switch (transition) {case GST_STATE_CHANGE_NULL_TO_READY:if (!gst_my_filter_allocate_memory (filter))return GST_STATE_CHANGE_FAILURE;break;default:break;}ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);if (ret == GST_STATE_CHANGE_FAILURE)return ret;switch (transition) {case GST_STATE_CHANGE_READY_TO_NULL:gst_my_filter_free_memory (filter);break;default:break;}return ret;
}
```
请注意,向上(NULL=>READY, READY=>PAUSED, PAUSED=>PLAYING)和向下(PLAYING=>PAUSED, PAUSED=>READY, READY=>NULL)状态变化是在两个单独的块中处理的,向下的状态变化只有在我们链接到父类的状态变化函数之后才能处理。为了安全地处理多线程的并发访问,这是必要的。这样做的原因是,在向下状态变化的情况下,你不想破坏分配的资源,而你的插件的链函数(例如)仍然在另一个线程中访问这些资源。你的链式函数是否在运行取决于插件的垫的状态,而这些垫的状态与元素的状态密切相关。Pad状态在GstElement类的状态更改函数中处理,包括适当的锁定,这就是为什么在销毁分配的资源之前必须链接起来的原因。

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

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

相关文章

GPT的前世今生:从gpt1到chatgpt的能力提升

从2017年google brain提出transformer模型,到2018年基于transformer模型open ai推出了gpt1模型以及google推出了bert模型,到2019-2021年open ai陆续推出gpt2和gpt3,再到2022-2023年推出chat-gpt和gpt4,大语言模型已经发展成了一个…

遥感语义分割、变化检测论文小trick合集(持续更新)

目录 💗💗1.影像融合机制 💗💗2.上下文聚合模块 💗💗3.adapter即插即用模块 💗💗1.影像融合机制 参考【多源特征自适应融合网络的高分遥感影像语义分割】文章中的“多源特征自适应…

【软考】数据库篇:并发控制-数据不一致问题

简介 本文介绍软考数据库篇,关于事务的考核内容。软考在数据库事务篇的考察,几乎都是出选择题类题目,不过在数据库系统工程师的内容里,会在下午提以一个小题出现,可见还是比较重要的知识点。 考纲内容 考核并发控制…

快速排序(c语言代码实现)

交换排序:快速排序(不稳定的排序) 快速排序(Quick Sort)是一种常见的排序算法,它采用分治法的思想,对待排序序列进行划分,使得划分出的子序列可以分别进行排序,最终使整…

买卖股票的最佳时机 II

给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有一股 股票。你也可以先购买,然后在 同一天 出售。返回 你能获得的 最大 利润 。 示例 1&#…

淘宝商品链接获取淘宝商品评论数据(用 Python实现淘宝商品评论信息抓取)

在网页抓取方面,可以使用 Python、Java 等编程语言编写程序,通过模拟 HTTP 请求,获取淘宝多网站上的商品详情页面评论内容。在数据提取方面,可以使用正则表达式、XPath 等方式从 HTML 代码中提取出有用的信息。值得注意的是&#…

Docker 镜像常用命令总结

目录 1. Docker镜像相关命令(重点掌握) 1.1 docker pull 镜像名称 [:tag] 拉取镜像 1.2 docker search 镜向名称 (查询某个镜像) 1.3 docker images 列出当前主机上所有镜像 1.4 docker rmi 镜像ID 删除镜像 1.5 docker system df 查看所有镜像容器所占空间 2. Docker …

JMeter + Ant + Jenkins持续集成-接口自动化测试

需要安装的工具: jdk1.8jmeter3.2ant1.9jenkins2.1 1、Jdkwin7系统如何安装jdk及环境变量的配置-百度经验 安装包安装设置环境变量验证是否安装正确 Java -version检查,如下就代表安装成功了,环境变量设置就去搜索了,网上很多…

RabbitMQ中方法channel.basicAck的使用说明

方法channel.basicAck的作用 在RabbitMQ中,channel.basicAck方法用于确认已经接收并处理了消息。 方法的参数说明 public void basicAck(long deliveryTag,boolean multiple) 参数: long deliveryTag 消息的唯一标识。每条消息都有自己的ID号&#x…

牛客网刷题-(4)

🌈write in front🌈 🧸大家好,我是Aileen🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流. 🆔本文由Aileen_0v0🧸 原创 CSDN首发🐒 如…

prosemirror 学习记录(四)decoration

使用 decorations 使用 props - decorations() 添加 decorations 写一个简单的插件:高亮所有 apple 节点 export const MyHighlightApplesPlugin new Plugin({props: {// view 每次变化都会执行 decorations 方法decorations(state) {let arrs [];state.doc.de…

QT项目如何打包成可执行文件

QT项目打包成可执行文件 一 建立一个文件夹二. 编译2.1 打开QT MSVC编译工具2.2 进入publish文件夹 一 建立一个文件夹 例如:publish 二. 编译 2.1 打开QT MSVC编译工具 2.2 进入publish文件夹 cd 路径 执行命令 windeployqt 项目名 例:windeployq…

C/C++实现的MD5哈希校验

C/C实现的MD5哈希校验 网上找到的不知道哪位博主的代码,搜集使用,侵权删。 #ifndef MD5_H #define MD5_H#ifdef __cplusplus extern "C" { #endiftypedef struct {unsigned int count[2];unsigned int state[4];unsigned char buffer[64]; } …

vue3学习心得

1、组件v-model 与其说 组件v-model&#xff0c;倒不如说&#xff0c;父子组件通讯的双向邦定&#xff0c;我倒喜欢这样子去理解。就好比&#xff0c;我在子组件内有一个input框&#xff0c;然后&#xff0c;这个框的值会跟父组件定的属性一起变化。 <!--子组件 AttCompone…

美海军用于情报、监视和侦察的中大型无人系统概述

源自&#xff1a;中国指挥与控制学会 “人工智能技术与咨询” 发布 简 介 1 引 言 2 超大型无人潜航器 图1 波音“回声航行者”无人潜航器 图2 “虎鲸”超大型无人潜航器 3 中型无人水面舰艇 图3 “海鹰”无人水面舰艇 图4 “海上猎人”无人水面舰艇 4 …

SpringMVC 资源状态转移RESTful

文章目录 1、RESTful简介a>资源b>资源的表述c>状态转移 2、RESTful的实现HiddenHttpMethodFilterRESTful案例 1、RESTful简介 REST&#xff1a;Representational State Transfer&#xff0c;表现层资源状态转移。 a>资源 资源是一种看待服务器的方式&#xff0c…

GO语言代码示例

首先&#xff0c;我们需要安装 rod 库&#xff0c;这是一个用于构建网络爬虫的 Go 语言库。 使用 go get 命令安装 rod 库&#xff1a;go get -u github.com/gofiber/rod 创建一个新的 Go 程序文件&#xff0c;例如&#xff1a;main.go 在 main.go 文件中&#xff0c;导入 r…

都2023年了,诸佬们肯定熟知RabbitMQ了吧

前言&#xff1a;大家好&#xff0c;我是小威&#xff0c;24届毕业生&#xff0c;曾经在某央企公司实习&#xff0c;目前入职某税务公司。本篇文章将记录和分享RabbitMQ相关的知识点。 本篇文章记录的基础知识&#xff0c;适合在学Java的小白&#xff0c;也适合复习中&#xff…

Springboot日志记录方案—官方原版

一、概述 Spring Boot在所有内部日志中使用 Commons Logging &#xff0c;但对底层日志的实现保持开放。 为 Java Util Logging 、 Log4j2 、 Logback 提供了默认配置。 在每一种情况下&#xff0c;记录器&#xff08;logger&#xff09;都被预设为使用控制台输出&#xff0c;也…

binutils 2.40 Linker (ld) 官方文档下载

前言 最近需要熟悉 elf 与 共享库 的链接与加载流程&#xff0c;需要先了解 elf 文件 是怎么链接的&#xff0c;链接脚本如何阅读 最有效的方式是查看 GNU 官方的 Linker (ld) 文档&#xff0c;通过查找&#xff0c;这个 Linker (ld) 属于 GNU binutils&#xff0c;当前的较新…