四、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 到目前为止,我们只处理了总是可用的pad。然而,也有一些pad仅在某些情况下创建,或者仅在应用程序请求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. 基本概念:redis 是一个开源的、使用 C 语言编写的、支持网络交互的、可基于内存也可持…...
robotiq 2f 140安装在UR3机械臂后面在gazebo仿真中散架、抖动
robotiq 2f 140安装在UR3机械臂后面在gazebo仿真中散架、抖动 搭建环境: ubuntu: 20.04 ros: Nonetic sensor: robotiq_ft300 gripper: robotiq_2f_140_gripper UR: UR3 通过上一篇博客配置好ur3、力传感器和robotiq夹爪的gazebo仿真环境后,夹爪看起来…...
坐标系概念 四元数 欧拉角
1、四个概念:“地理”坐标系、“机体”坐标系、他们之间换算公式、换算公式用的系数。地理坐标系:东、北、天,以下简称地理。在这个坐标系里有重力永远是(0,0,1g),地磁永远是(0,1,x)…...
从0开始写Vue项目-SpringBoot整合Mybatis-plus实现登录、注册功能
1.从0开始写Vue项目-环境和项目搭建_慕言要努力的博客-CSDN博客 2. 从0开始写Vue项目-Vue2集成Element-ui和后台主体框架搭建_慕言要努力的博客-CSDN博客 3. 从0开始写Vue项目-Vue页面主体布局和登录、注册页面_慕言要努力的博客-CSDN博客 一、前言 在之前我们以及搭建好了基…...
K8s中gRpc通信负载均衡失效
上篇文章在做 整合K8sSpringCloudK8sSpringBootgRpc 时,发现K8s中使用gRpc通信,负载均衡功能失效查了下gRpc的最佳实践,找到这里Load balancingSome load balancers dont work effectively with gRPC. L4 (transport) load balancers operate…...
第三届区块链服务网络(BSN)全球合作伙伴大会在杭州成功举办
为持续推动分布式技术和产业创新发展,2023年2月17日,由杭州市人民政府指导,杭州市拱墅区人民政府、国家信息中心主办,中国移动通信集团有限公司、区块链服务网络(BSN)发展联盟承办,中国移动通信…...
人工智能基础部分13-LSTM网络:预测上证指数走势
大家好,我是微学AI,今天给大家介绍一下LSTM网络,主要运用于解决序列问题。 一、LSTM网络简单介绍 LSTM又称为:长短期记忆网络,它是一种特殊的 RNN。LSTM网络主要是为了解决长序列训练过程中的梯度消失和梯度爆炸问题…...
内网穿透/组网/设备上云平台EasyNTS上云网关的安装操作指南
EasyNTS上云网关的主要作用是解决异地视频共享/组网/上云的需求,网页对域名进行添加映射时,添加成功后会生成一个外网访问地址,在浏览器中输入外网访问地址,即可查看内网应用。无需开放端口,EasyNTS上云网关平台会向Ea…...
易点天下基于 StarRocks 全面构建实时离线一体的湖仓方案
作者:易点天下数据平台团队易点天下是一家技术驱动发展的企业国际化智能营销服务公司,致力于为客户提供全球营销推广服务,通过效果营销、品牌塑造、垂直行业解决方案等一体化服务,帮助企业在全球范围内高效地获取用户、提升品牌知…...
Tomcat的类加载机制
不遵循双亲委托 在JVM中并不是一次性地把所有的文件都加载到,而是按需加载,加载机制采用 双亲委托原则,如下图所示: BootStrapClassLoader 引导类加载器ExtClassLoader 扩展类加载器AppClassLoader 应用类加载器CustomClassLoad…...
【shell 编程大全】数组,逻辑判断以及循环
数组,逻辑判断以及循环1. 概述 大家好,我又来了。今天呢我们继续学习shell相关的知识。还是老样子我们先回顾下上一次【脚本交互 以及表达式】学习到的知识 登录shell 关联配置文件什么是子shellumask 修改默认权限read 基础表达式 简单计算表达式expr 计…...
Android13 Bluetooth更新
目录 Android 13 版本说明 LE Audio 代码更新 Android 12代码路径 Android 13代码路径 Android 13 版本说明 里面对蓝牙更新的描述较少,一出提到蓝牙的一...
手工测试混了5年,年底接到了被裁员的消息....
大家都比较看好软件测试行业,只是因为表面上看起来:钱多事少加班少。其实这个都是针对个人运气好的童人才会有此待遇。在不同的阶段做好不同阶段的事情,才有可能离这个目标更近,作为一枚软件测试人员,也许下面才是我们…...
Umi框架
什么是 umi umi 是由 dva 的开发者 云谦 编写的一个新的 React 开发框架。umi 既是一个框架也是一个工具,可以将它简单的理解为一个专注性能的类 next.js 前端框架,并通过约定、自动生成和解析代码等方式来辅助开发,减少开发者的代码量。 u…...
教你学git
前言 git是一种用于多人合作写项目。详细说明如下 文章目录前言什么是版本控制?什么是 Git?它就属于人工版本控制器版本控制工具常见版本控制工具怎么工作的?git 文件生命周期状态区域安装配置-- global检查配置创建仓库工作流与基本操作查看…...
【工作笔记】syslog,kern.log大量写入invalid cookie错误信息问题
任务描述 错误出现出现过四五次,应该是诊断单元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++】多线程
多任务处理有两种形式,即:多进程和多线程。 基于进程的多任务处理是程序的并发执行。基于线程的多任务处理是同一程序的片段的并发执行 文章目录1. 多线程介绍2. Windows多线程1. 多线程介绍 每一个进程(可执行程序)都有一个主线…...
0202插入删除-算法第四版红黑树-红黑树-数据结构和算法(Java)
文章目录4 插入4.1 序4.2 向单个2-结点插入新键4.3 向树底部的2-结点插入新键4.4 向一棵双键树(3-结点)中插入新键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>四、属性说明 …...
Leather Dress Collection 角色扮演效果:模拟不同风格的IT技术面试官
Leather Dress Collection 角色扮演效果:模拟不同风格的IT技术面试官 最近在玩一个挺有意思的AI工具,叫Leather Dress Collection。名字听起来有点怪,但它有个功能让我眼前一亮:角色扮演。你可以让它扮演各种角色,并且…...
OBS Advanced Timer:全场景直播计时神器,让你的直播节奏掌控自如
OBS Advanced Timer:全场景直播计时神器,让你的直播节奏掌控自如 【免费下载链接】obs-advanced-timer 项目地址: https://gitcode.com/gh_mirrors/ob/obs-advanced-timer 作为主播,你是否曾因手动计时失误导致直播环节超时ÿ…...
小白也能学会:MogFace透明蒙版可视化,人脸检测不再难
小白也能学会:MogFace透明蒙版可视化,人脸检测不再难 1. 为什么需要透明蒙版可视化? 想象一下这样的场景:你拍了一张全家福,想用AI工具检测照片中有多少人。传统的检测工具会在每个人脸上画一个绿色的方框࿰…...
终极指南:buger/jsonparser如何10倍加速处理第三方API不确定性数据
终极指南:buger/jsonparser如何10倍加速处理第三方API不确定性数据 【免费下载链接】jsonparser One of the fastest alternative JSON parser for Go that does not require schema 项目地址: https://gitcode.com/gh_mirrors/js/jsonparser 在处理第三方AP…...
mkcert 命令文档 - 本地 HTTPS 开发证书生成工具详解
1. 命令简介mkcert 是一个用 Go 语言编写的、零配置的本地开发用自签名证书生成工具。它能够自动创建并安装本地证书颁发机构(CA)到系统的信任存储中,并生成受本地信任的开发证书,大幅简化 HTTPS 本地开发环境的搭建过程ÿ…...
TTI-Chicago等机构突破性研究:AI学会了一笔一划创作矢量草图
这项由芝加哥丰田技术研究院(TTI-Chicago)、芝加哥大学和麻省理工学院联合开展的研究发表于2026年,论文编号为arXiv:2603.19500v1。有兴趣深入了解技术细节的读者可以通过该编号查询完整论文。当我们看到一位画家创作时,他们通常不…...
用Python+Simulink复现数维杯A题:手把手教你搭建车辆主动减振模型(附代码)
PythonSimulink实战:从零构建车辆主动减振系统 1. 理解车辆振动控制的核心问题 车辆振动问题一直是工程领域的重要挑战。想象一下,当你驾驶一辆重型卡车经过颠簸路面时,那种令人不适的震动不仅影响驾驶体验,长期来看还会对车辆结构…...
AIVideo效果对比展示:不同参数下的视频生成质量评测
AIVideo效果对比展示:不同参数下的视频生成质量评测 1. 开场白:参数设置对视频效果的影响 你有没有遇到过这样的情况:用AI生成视频时,明明输入的内容一样,但出来的效果却天差地别?有时候画面模糊不清&…...
计算机组成原理知识可视化:影墨·今颜生成硬件结构图解
计算机组成原理知识可视化:影墨今颜生成硬件结构图解 每次给学生讲计算机组成原理,最头疼的就是怎么把那些抽象的概念讲明白。什么“冯诺依曼结构”、“CPU流水线”、“Cache工作原理”,光靠文字和PPT里的方块图,学生听得云里雾里…...
永磁同步电机这玩意儿现在工业上用得是真多,今天咱们来点硬核的,手搓个IPMSM的数学模型。先别急着关页面,代码实现和调试坑点都给你备好了
IPMSM数学模型,模拟电机对不同输入的响应,包含速度环和电流环,输出电流转速和转矩。先甩几个核心方程镇楼。d-q轴电压方程: def voltage_equation(t, state, Vd, Vq):id, iq, w_r, theta stateVd ... # 这里放你的控制算法输出V…...
