当前位置: 首页 > news >正文

二、Plugin The chain/event/query function

The chain function

链函数是所有数据处理都在其中进行的函数。在简单过滤器的情况下(本节示例的情况),_chain()函数大多是线性函数——因此对于每个传入的缓冲区,也将输出一个缓冲区。下面是一个非常简单的chain函数的实现:


static GstFlowReturn gst_my_filter_chain (GstPad    *pad,GstObject *parent,GstBuffer *buf);[..]static void
gst_my_filter_init (GstMyFilter * filter)
{
[..]/* configure chain function on the pad before adding* the pad to the element */gst_pad_set_chain_function (filter->sinkpad,gst_my_filter_chain);
[..]
}static GstFlowReturn
gst_my_filter_chain (GstPad    *pad,GstObject *parent,GstBuffer *buf)
{GstMyFilter *filter = GST_MY_FILTER (parent);if (!filter->silent)g_print ("Have data of size %" G_GSIZE_FORMAT" bytes!\n",gst_buffer_get_size (buf));return gst_pad_push (filter->srcpad, buf);
}

显然,上面的代码没什么用。你通常会在那里处理数据,而不是打印出数据所在的位置。但请记住,缓冲区并不总是可写的。

在更高级的元素(进行事件处理的元素)中,你可能需要另外指定一个事件处理函数,在发送流事件时调用该函数(如caps、end-of-stream、newsegment、tags等)。

static void
gst_my_filter_init (GstMyFilter * filter)
{
[..]gst_pad_set_event_function (filter->sinkpad,gst_my_filter_sink_event);
[..]
}static gboolean
gst_my_filter_sink_event (GstPad    *pad,GstObject *parent,GstEvent  *event)
{GstMyFilter *filter = GST_MY_FILTER (parent);switch (GST_EVENT_TYPE (event)) {case GST_EVENT_CAPS:/* we should handle the format here */break;case GST_EVENT_EOS:/* end-of-stream, we should close down all stream leftovers here */gst_my_filter_stop_processing (filter);break;default:break;}return gst_pad_event_default (pad, parent, event);
}static GstFlowReturn
gst_my_filter_chain (GstPad    *pad,GstObject *parent,GstBuffer *buf)
{GstMyFilter *filter = GST_MY_FILTER (parent);GstBuffer *outbuf;outbuf = gst_my_filter_process_data (filter, buf);gst_buffer_unref (buf);if (!outbuf) {/* something went wrong - signal an error */GST_ELEMENT_ERROR (GST_ELEMENT (filter), STREAM, FAILED, (NULL), (NULL));return GST_FLOW_ERROR;}return gst_pad_push (filter->srcpad, outbuf);
}

在某些情况下,元素还可以控制输入数据速率。在这种情况下,你可能想写一个所谓的基于循环的元素。源元素(只有源source pads)也可以是基于get-based的元素。这些概念将在本指南的高级部分和专门讨论源source pads的部分中进行解释。

The event function

event函数会通知你datastream中发生的特殊事件(例如caps、end-of-stream、newsegment、tags等)。事件可以upstream和downstream传递,所以你可以通过sink pad和source pad接收它们。

下面是一个非常简单的事件函数,我们将其安装在元素的sink pads上。

static gboolean gst_my_filter_sink_event (GstPad    *pad,GstObject *parent,GstEvent  *event);[..]static void
gst_my_filter_init (GstMyFilter * filter)
{
[..]/* configure event function on the pad before adding* the pad to the element */gst_pad_set_event_function (filter->sinkpad,gst_my_filter_sink_event);
[..]
}static gboolean
gst_my_filter_sink_event (GstPad    *pad,GstObject *parent,GstEvent  *event)
{gboolean ret;GstMyFilter *filter = GST_MY_FILTER (parent);switch (GST_EVENT_TYPE (event)) {case GST_EVENT_CAPS:/* we should handle the format here *//* push the event downstream */ret = gst_pad_push_event (filter->srcpad, event);break;case GST_EVENT_EOS:/* end-of-stream, we should close down all stream leftovers here */gst_my_filter_stop_processing (filter);ret = gst_pad_event_default (pad, parent, event);break;default:/* just call the default handler */ret = gst_pad_event_default (pad, parent, event);break;}return ret;
}

对于未知事件,最好调用默认的事件处理程序gst_pad_event_default()。根据事件类型,默认处理程序将转发事件或简单地取消引用它。默认情况下,CAPS事件是不转发的,因此我们需要在事件处理程序中执行此操作。

The query function

通过query函数,元素将收到查询,并必须响应查询。这些查询包括位置、持续时间等,还包括元素支持的格式和调度模式。查询可以在上游和下游传输,所以你可以在sink pad和source pad上接收它们。

下面是我们在元素的source pad上安装的一个非常简单的查询函数。

static gboolean gst_my_filter_src_query (GstPad    *pad,GstObject *parent,GstQuery  *query);[..]static void
gst_my_filter_init (GstMyFilter * filter)
{
[..]/* configure event function on the pad before adding* the pad to the element */gst_pad_set_query_function (filter->srcpad,gst_my_filter_src_query);
[..]
}static gboolean
gst_my_filter_src_query (GstPad    *pad,GstObject *parent,GstQuery  *query)
{gboolean ret;GstMyFilter *filter = GST_MY_FILTER (parent);switch (GST_QUERY_TYPE (query)) {case GST_QUERY_POSITION:/* we should report the current position */[...]break;case GST_QUERY_DURATION:/* we should report the duration here */[...]break;case GST_QUERY_CAPS:/* we should report the supported caps here */[...]break;default:/* just call the default handler */ret = gst_pad_query_default (pad, parent, query);break;}return ret;
}

对于未知的查询,最好调用默认的查询处理程序gst_pad_query_default()。根据查询类型,默认处理程序将转发查询或简单地取消引用它。

相关文章:

二、Plugin The chain/event/query function

The chain function 链函数是所有数据处理都在其中进行的函数。在简单过滤器的情况下(本节示例的情况),_chain()函数大多是线性函数——因此对于每个传入的缓冲区,也将输出一个缓冲区。下面是一个非常简单的chain函数的实现: sta…...

了解 PostgreSQL 的扩展查询协议

1.介绍 本篇博客用于解释扩展协议的工作原理以及它与简单查询的区别。 2.简单查询 在PostgreSQL中,客户端连接能够发起两种类型的查询:简单查询和扩展协议查询。 简单查询顾名思义。 当启动 psql 客户端连接到pg服务器时,几乎所有发送的…...

接入网关和隔离网关

文章目录1. 什么是网关?2. 网关的作用是什么?3. 接入网关和隔离网关1. 什么是网关? 网关(Gateway)是一种网络设备,通常用于将不同网络之间的流量进行转发和路由,将一个网络连接到另一个网络&…...

实用指南:如何在Anolis OS上轻松使用 Kata 安全容器?

文/云原生SIG本篇文章我们将详细介绍怎么轻松在 Anolis OS 上使用 Kata Containers 安全容器,我们将介绍 Kata Container 社区于 2022 年 10 月 10 日最新发行的 Kata3.0.0 的安装部署方式,3.0.0 版本包含了基于袋鼠 RunD 开源的最新 Rust Kata runtime …...

如何锁定Word文档部分文字不被修改

我们知道,想要保护Word文档的内容无法随意更改,可以设置“限制编辑”的保护模式。 那如果实际工作中,只需要固定的一部分内容不能编辑,可以实现吗?答案是肯定的,今天就来说说如何设置Word文档部分文字可修…...

聊聊8万8的私董会,很扎心

聊聊8万8的私董会,很扎心 道几句真心话,很扎心,但也很现实。 如果你喜欢刷抖音,这种感觉应该会更加明显。 股市哀鸿遍野,实体一地鸡毛,我们办公室楼下的门面换了一波又一波。 别说那些不起眼的小生意&a…...

卷积网络与全连接网络的区别

问题卷积神经网络是一类包含卷积计算且具有深度结构的前馈神经网络,是深度学习。卷积神经网络具有表征学习能力,能够按其阶层结构对输入信息进行平移不变分类,因此也被称为“平移不变人工神经网络。全连接神经网络是具有多层感知器的的网络&a…...

【5000左右电脑配置清单】预算不高于5000,不带显示器的电脑配置清单推荐

由于本人是学生党经济有限&#xff0c;预算不高于5000元配一套电脑主机&#xff0c;说实话5000左右的电脑配置已经很好了&#xff0c;今天站长整理了几款配置给大家参考参考&#xff0c;更多电脑配置还请继续关注西安SEO优化站点&#xff01; 配置1&#xff1a; <CPU> I5…...

在 4G 内存的机器上,申请 8G 内存会怎么样?

在 4GB 物理内存的机器上&#xff0c;申请 8G 内存会怎么样&#xff1f; 这个问题在没有前置条件下&#xff0c;就说出答案就是耍流氓。这个问题要考虑三个前置条件&#xff1a; 操作系统是 32 位的&#xff0c;还是 64 位的&#xff1f;申请完 8G 内存后会不会被使用&#x…...

JavaSE学习day9 集合(基础班结束)

1.ArrayList 集合和数组的优势对比&#xff1a; 长度可变 添加数据的时候不需要考虑索引&#xff0c;默认将数据添加到末尾 不能存基本数据类型。只能通过包装。 1.1ArrayList类概述 什么是集合 提供一种存储空间可变的存储模型&#xff0c;存储的数据容量可以发生改变 Ar…...

Python爬虫进阶 - win和linux下selenium使用代理

目录 Windows selenium配置 下载地址 Chrome Chromedriver 版本对应关系 实践测试 操作元素 浏览器操作 获取元素信息 鼠标操作 实战demo selenium添加代理 Linux selenium配置 检查服务器环境 下载安装第三方库&#xff08;最简单版&#xff09; 实践测试 代码…...

力扣-从不订购的客户

大家好&#xff0c;我是空空star&#xff0c;本篇带大家了解一道简单的力扣sql练习题。 文章目录前言一、题目&#xff1a;183. 从不订购的客户二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.正确示范④提交SQL运行结果总结前言…...

速来!掘金数据时代2022年度隐私计算评选活动火热报名中!

开放隐私计算 开放隐私计算开放隐私计算OpenMPC是国内第一个且影响力最大的隐私计算开放社区。社区秉承开放共享的精神&#xff0c;专注于隐私计算行业的研究与布道。社区致力于隐私计算技术的传播&#xff0c;愿成为中国 “隐私计算最后一公里的服务区”。183篇原创内容公众号…...

Springboot @Test 给Controller接口 写 单元测试

前言 最近有小伙伴问到怎么给 controller的接口写单元测试。 单元测试是开发必不可少的一个环节。 既然有人问到了&#xff0c;那我觉得可能不止一个人不会&#xff0c;那就按照惯例&#xff0c;出手。 正文 内容&#xff1a; 主要是get 和 post 两种请求方式的接口 的 单元测…...

ISO 6721-1~12 ,塑料-电动机械性能的测定,2022更新

ISO 6721-1 :2019 Plastics - Determination of dynamic mechanical properties - Part 1: General principles ISO 6721-1 :2019 塑料 - 电动机械性能的测定. 第1部分:一般原理 ISO 6721-2 :2019 Plastics — Determination of dynamic mechanical properties — Part 2:…...

vue3.2中使用swiper缩略图轮播教程

介绍 在vue3 中使用 swiper 实现缩略图的轮播图效果,具体如下图所示: 使用 切换到项目终端 ,输入命令 npm install swiper --save , 进行安装在 main.js里,引入 swiper.css并使用,具体代码如下;import {createApp } from vue import App from ./App.vue import router…...

边玩边学,13个 Python 小游戏真有趣啊(含源码)

经常听到有朋友说&#xff0c;学习编程是一件非常枯燥无味的事情。其实&#xff0c;大家有没有认真想过&#xff0c;可能是我们的学习方法不对&#xff1f; 比方说&#xff0c;你有没有想过&#xff0c;可以通过打游戏来学编程&#xff1f; 今天我想跟大家分享几个Python小游…...

MySQL数据文件迁移(不关闭SELinux)

背景 日常实施中可能会出现在部署MySQL时未更改数据默认存储路径&#xff08;默认&#xff1a;/var/lib/mysql&#xff09;&#xff0c;然而一般分配服务器的人只会给系统分区分配50G的空间&#xff0c;这导致后续空间不够用的情况&#xff0c;也就出现了需要迁移数据的问题。…...

uboot / linux添加/去除 版本号LOCALVERSION

背景 偶然的机会&#xff0c;在insmod驱动模块的时候&#xff0c;遇到报错&#xff1a; 查找原因&#xff0c;说是当前系统内核版本和模块编译使用版本不同&#xff01; 使用如下命令查看当前系统内核版本&#xff1a; uname -r 使用modinfo命令&#xff08;嵌入式设备没有此…...

2023北京养老展,北京养老展会,北京养老产业展览会

CBIAIE第十届中国&#xff08;北京&#xff09;国际老年产业博览会&#xff0c;8月28-30日在北京亦创国际会展中心举办&#xff1b; 预期效果&#xff1a;中国&#xff08;北京&#xff09;国际老年产业博览会China (Beijing) International Aged industry Expo&#xff08;CB…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...