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

四、Plugin Request and Sometimes pads

Request and Sometimes pads

到目前为止,我们只处理了总是可用的pad。然而,也有一些pad仅在某些情况下创建,或者仅在应用程序请求pad时创建。第一个有时被称为a;第二个被称为请求pad。pad的可用性(always, sometimes or request)可以在pad的模板中看到。本章将讨论它们各自在什么时候有用,如何创建它们,以及何时处理它们。

Sometimes pads

“有时”pad是在特定条件下创建的pad,但不是在所有情况下创建的pad。这在很大程度上取决于流的内容:demuxers通常会解析流的首部,决定哪些基本流(视频、音频、字幕等)嵌入到系统流中,然后为每个基本流创建一个pad。根据自己的选择,它还可以为每个元素实例创建这些元素的多个实例。唯一的限制是每个新创建的pad都应该有一个唯一的名称。有时,当流数据被销毁时(即从暂停状态切换到就绪状态时),补码也会被销毁。你不应该在EOS上处理pad,因为有人可能会重新激活管道并寻求回到流结束点之前。在EOS之后流应该仍然有效,至少在流数据被处理之前。在任何情况下,元素都是该pad的所有者

下面的示例代码将解析一个文本文件,其中第一行是一个数字(n)。接下来的行都以数字(0到n-1)开始,这是应该发送数据的源pad的编号。

3
0: foo
1: bar
0: boo
2: bye

解析此文件并创建动态“sometimes”pads的代码如下所示:


typedef struct _GstMyFilter {
[..]gboolean firstrun;GList *srcpadlist;
} GstMyFilter;static GstStaticPadTemplate src_factory =
GST_STATIC_PAD_TEMPLATE ("src_%u",GST_PAD_SRC,GST_PAD_SOMETIMES,GST_STATIC_CAPS ("ANY")
);static void
gst_my_filter_class_init (GstMyFilterClass *klass)
{GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
[..]gst_element_class_add_pad_template (element_class,gst_static_pad_template_get (&src_factory));
[..]
}static void
gst_my_filter_init (GstMyFilter *filter)
{
[..]filter->firstrun = TRUE;filter->srcpadlist = NULL;
}/** Get one line of data - without newline.*/static GstBuffer *
gst_my_filter_getline (GstMyFilter *filter)
{guint8 *data;gint n, num;/* max. line length is 512 characters - for safety */for (n = 0; n < 512; n++) {num = gst_bytestream_peek_bytes (filter->bs, &data, n + 1);if (num != n + 1)return NULL;/* newline? */if (data[n] == '\n') {GstBuffer *buf = gst_buffer_new_allocate (NULL, n + 1, NULL);gst_bytestream_peek_bytes (filter->bs, &data, n);gst_buffer_fill (buf, 0, data, n);gst_buffer_memset (buf, n, '\0', 1);gst_bytestream_flush_fast (filter->bs, n + 1);return buf;}}
}static void
gst_my_filter_loopfunc (GstElement *element)
{GstMyFilter *filter = GST_MY_FILTER (element);GstBuffer *buf;GstPad *pad;GstMapInfo map;gint num, n;/* parse header */if (filter->firstrun) {gchar *padname;guint8 id;if (!(buf = gst_my_filter_getline (filter))) {gst_element_error (element, STREAM, READ, (NULL),("Stream contains no header"));return;}gst_buffer_extract (buf, 0, &id, 1);num = atoi (id);gst_buffer_unref (buf);/* for each of the streams, create a pad */for (n = 0; n < num; n++) {padname = g_strdup_printf ("src_%u", n);pad = gst_pad_new_from_static_template (src_factory, padname);g_free (padname);/* here, you would set _event () and _query () functions *//* need to activate the pad before adding */gst_pad_set_active (pad, TRUE);gst_element_add_pad (element, pad);filter->srcpadlist = g_list_append (filter->srcpadlist, pad);}}/* and now, simply parse each line and push over */if (!(buf = gst_my_filter_getline (filter))) {GstEvent *event = gst_event_new (GST_EVENT_EOS);GList *padlist;for (padlist = srcpadlist;padlist != NULL; padlist = g_list_next (padlist)) {pad = GST_PAD (padlist->data);gst_pad_push_event (pad, gst_event_ref (event));}gst_event_unref (event);/* pause the task here */return;}/* parse stream number and go beyond the ':' in the data */gst_buffer_map (buf, &map, GST_MAP_READ);num = atoi (map.data[0]);if (num >= 0 && num < g_list_length (filter->srcpadlist)) {pad = GST_PAD (g_list_nth_data (filter->srcpadlist, num);/* magic buffer parsing foo */for (n = 0; map.data[n] != ':' &&map.data[n] != '\0'; n++) ;if (map.data[n] != '\0') {GstBuffer *sub;/* create region copy that starts right past the space. The reason* that we don't just forward the data pointer is because the* pointer is no longer the start of an allocated block of memory,* but just a pointer to a position somewhere in the middle of it.* That cannot be freed upon disposal, so we'd either crash or have* a memleak. Creating a region copy is a simple way to solve that. */sub = gst_buffer_copy_region (buf, GST_BUFFER_COPY_ALL,n + 1, map.size - n - 1);gst_pad_push (pad, sub);}}gst_buffer_unmap (buf, &map);gst_buffer_unref (buf);
}

请注意,我们在每个地方都进行了大量检查,以确保文件中的内容是有效的。这样做有两个目的:首先,文件可能是错误的,在这种情况下,我们可以防止崩溃。第二个也是最重要的原因是——在极端情况下——该文件可能被恶意使用,导致插件中出现未定义的行为,这可能会导致安全问题。总是假定文件可能被用来做坏事。

Request pads

“请求”填充与有时填充类似,不同之处在于,请求是根据元素外部的内容而不是元素内部的内容创建的。这个概念经常用于muxers,对于将要放置在输出系统流中的每个基本流,将要求一个sink pad。它还可以用于具有可变数量输入或输出填充的元素中,例如tee(多输出)或input-selector(多输入)元素。

要实现请求填充,需要提供一个带有GST_PAD_REQUEST的padtemplate,并在GstElement中实现request_new_pad虚拟方法。为了进行清理,你需要实现release_pad虚拟方法。


static GstPad * gst_my_filter_request_new_pad   (GstElement     *element,GstPadTemplate *templ,const gchar    *name,const GstCaps  *caps);static void gst_my_filter_release_pad (GstElement *element,GstPad *pad);static GstStaticPadTemplate sink_factory =
GST_STATIC_PAD_TEMPLATE ("sink_%u",GST_PAD_SINK,GST_PAD_REQUEST,GST_STATIC_CAPS ("ANY")
);static void
gst_my_filter_class_init (GstMyFilterClass *klass)
{GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
[..]gst_element_class_add_pad_template (klass,gst_static_pad_template_get (&sink_factory));
[..]element_class->request_new_pad = gst_my_filter_request_new_pad;element_class->release_pad = gst_my_filter_release_pad;
}static GstPad *
gst_my_filter_request_new_pad (GstElement     *element,GstPadTemplate *templ,const gchar    *name,const GstCaps  *caps)
{GstPad *pad;GstMyFilterInputContext *context;context = g_new0 (GstMyFilterInputContext, 1);pad = gst_pad_new_from_template (templ, name);gst_pad_set_element_private (pad, context);/* normally, you would set _chain () and _event () functions here */gst_element_add_pad (element, pad);return pad;
}static void
gst_my_filter_release_pad (GstElement *element,GstPad *pad)
{GstMyFilterInputContext *context;context = gst_pad_get_element_private (pad);g_free (context);gst_element_remove_pad (element, pad);
}

相关文章:

四、Plugin Request and Sometimes pads

Request and Sometimes pads 到目前为止&#xff0c;我们只处理了总是可用的pad。然而&#xff0c;也有一些pad仅在某些情况下创建&#xff0c;或者仅在应用程序请求pad时创建。第一个有时被称为a;第二个被称为请求pad。pad的可用性(always, sometimes or request)可以在pad的…...

唤醒手腕 Java 后端 Springboot 结合 Redis 数据库学习笔记(更新中)

Redis 基本介绍 Redis Introduction The open source, in-memory data store used by millions of developers as a database, cache, streaming engine, and message broker. 基本概念&#xff1a;redis 是一个开源的、使用 C 语言编写的、支持网络交互的、可基于内存也可持…...

robotiq 2f 140安装在UR3机械臂后面在gazebo仿真中散架、抖动

robotiq 2f 140安装在UR3机械臂后面在gazebo仿真中散架、抖动 搭建环境&#xff1a; ubuntu: 20.04 ros: Nonetic sensor: robotiq_ft300 gripper: robotiq_2f_140_gripper UR: UR3 通过上一篇博客配置好ur3、力传感器和robotiq夹爪的gazebo仿真环境后&#xff0c;夹爪看起来…...

坐标系概念 四元数 欧拉角

1、四个概念&#xff1a;“地理”坐标系、“机体”坐标系、他们之间换算公式、换算公式用的系数。地理坐标系&#xff1a;东、北、天&#xff0c;以下简称地理。在这个坐标系里有重力永远是&#xff08;0,0,1g&#xff09;&#xff0c;地磁永远是&#xff08;0,1,x&#xff09;…...

从0开始写Vue项目-SpringBoot整合Mybatis-plus实现登录、注册功能

1.从0开始写Vue项目-环境和项目搭建_慕言要努力的博客-CSDN博客 2. 从0开始写Vue项目-Vue2集成Element-ui和后台主体框架搭建_慕言要努力的博客-CSDN博客 3. 从0开始写Vue项目-Vue页面主体布局和登录、注册页面_慕言要努力的博客-CSDN博客 一、前言 在之前我们以及搭建好了基…...

K8s中gRpc通信负载均衡失效

上篇文章在做 整合K8sSpringCloudK8sSpringBootgRpc 时&#xff0c;发现K8s中使用gRpc通信&#xff0c;负载均衡功能失效查了下gRpc的最佳实践&#xff0c;找到这里Load balancingSome load balancers dont work effectively with gRPC. L4 (transport) load balancers operate…...

第三届区块链服务网络(BSN)全球合作伙伴大会在杭州成功举办

为持续推动分布式技术和产业创新发展&#xff0c;2023年2月17日&#xff0c;由杭州市人民政府指导&#xff0c;杭州市拱墅区人民政府、国家信息中心主办&#xff0c;中国移动通信集团有限公司、区块链服务网络&#xff08;BSN&#xff09;发展联盟承办&#xff0c;中国移动通信…...

人工智能基础部分13-LSTM网络:预测上证指数走势

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下LSTM网络&#xff0c;主要运用于解决序列问题。 一、LSTM网络简单介绍 LSTM又称为&#xff1a;长短期记忆网络&#xff0c;它是一种特殊的 RNN。LSTM网络主要是为了解决长序列训练过程中的梯度消失和梯度爆炸问题…...

内网穿透/组网/设备上云平台EasyNTS上云网关的安装操作指南

EasyNTS上云网关的主要作用是解决异地视频共享/组网/上云的需求&#xff0c;网页对域名进行添加映射时&#xff0c;添加成功后会生成一个外网访问地址&#xff0c;在浏览器中输入外网访问地址&#xff0c;即可查看内网应用。无需开放端口&#xff0c;EasyNTS上云网关平台会向Ea…...

易点天下基于 StarRocks 全面构建实时离线一体的湖仓方案

作者&#xff1a;易点天下数据平台团队易点天下是一家技术驱动发展的企业国际化智能营销服务公司&#xff0c;致力于为客户提供全球营销推广服务&#xff0c;通过效果营销、品牌塑造、垂直行业解决方案等一体化服务&#xff0c;帮助企业在全球范围内高效地获取用户、提升品牌知…...

Tomcat的类加载机制

不遵循双亲委托 在JVM中并不是一次性地把所有的文件都加载到&#xff0c;而是按需加载&#xff0c;加载机制采用 双亲委托原则&#xff0c;如下图所示&#xff1a; BootStrapClassLoader 引导类加载器ExtClassLoader 扩展类加载器AppClassLoader 应用类加载器CustomClassLoad…...

【shell 编程大全】数组,逻辑判断以及循环

数组&#xff0c;逻辑判断以及循环1. 概述 大家好&#xff0c;我又来了。今天呢我们继续学习shell相关的知识。还是老样子我们先回顾下上一次【脚本交互 以及表达式】学习到的知识 登录shell 关联配置文件什么是子shellumask 修改默认权限read 基础表达式 简单计算表达式expr 计…...

Android13 Bluetooth更新

目录 Android 13 版本说明 LE Audio 代码更新 Android 12代码路径 Android 13代码路径 Android 13 版本说明 里面对蓝牙更新的描述较少,一出提到蓝牙的一...

手工测试混了5年,年底接到了被裁员的消息....

大家都比较看好软件测试行业&#xff0c;只是因为表面上看起来&#xff1a;钱多事少加班少。其实这个都是针对个人运气好的童人才会有此待遇。在不同的阶段做好不同阶段的事情&#xff0c;才有可能离这个目标更近&#xff0c;作为一枚软件测试人员&#xff0c;也许下面才是我们…...

Umi框架

什么是 umi umi 是由 dva 的开发者 云谦 编写的一个新的 React 开发框架。umi 既是一个框架也是一个工具&#xff0c;可以将它简单的理解为一个专注性能的类 next.js 前端框架&#xff0c;并通过约定、自动生成和解析代码等方式来辅助开发&#xff0c;减少开发者的代码量。 u…...

教你学git

前言 git是一种用于多人合作写项目。详细说明如下 文章目录前言什么是版本控制&#xff1f;什么是 Git&#xff1f;它就属于人工版本控制器版本控制工具常见版本控制工具怎么工作的&#xff1f;git 文件生命周期状态区域安装配置-- global检查配置创建仓库工作流与基本操作查看…...

【工作笔记】syslog,kern.log大量写入invalid cookie错误信息问题

任务描述 错误出现出现过四五次&#xff0c;应该是诊断单元tf卡读写出问题导致下面这条告警一直高频写入到/var/log/下的syslog、kern.log、messages中 Nov 23 06:25:12 embest kernel: omap_hsmmc 48060000.mmc: [omap_hsmmc_pre_dma_transfer] invalid cookie: data->hos…...

【C++】多线程

多任务处理有两种形式&#xff0c;即&#xff1a;多进程和多线程。 基于进程的多任务处理是程序的并发执行。基于线程的多任务处理是同一程序的片段的并发执行 文章目录1. 多线程介绍2. Windows多线程1. 多线程介绍 每一个进程&#xff08;可执行程序&#xff09;都有一个主线…...

0202插入删除-算法第四版红黑树-红黑树-数据结构和算法(Java)

文章目录4 插入4.1 序4.2 向单个2-结点插入新键4.3 向树底部的2-结点插入新键4.4 向一棵双键树&#xff08;3-结点&#xff09;中插入新键4.5 颜色调整4.6 根结点总是黑色4.7 向树底部的3-结点插入新键4.8 将红链接在树中向上传递4.9 实现5 删除5.1 删除最小键5.2 删除6 有序性…...

vue 生成二维码插件 vue-qr使用方法

一、安装 npm install vue-qr --save二、引入 import VueQr from vue-qrcomponents:{VueQr,},三、使用 <vue-qr:text"dyQrcode":size"170":logoSrc"logo":margin"6":logoScale"0.2"></vue-qr>四、属性说明 …...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...