gstreamer插件特别要注意事件处理(含代码范例)
因为工作需要,同事写了一个Transform插件,吾写了一个 Sink插件。结果吾在测试的时候,发现数据流结束了,流程一直无法正常结束。再网上反复搜索,连蒙带猜的折腾了一番,还是不行。
昨天发现显存无法正常释放,今天在查找原因。先将两个插件从流程中删除,发现可以正常结束。加上Transform就不能正常结束了。原来问题出在这个插件上这里……于是又开始连蒙带猜……
老兄,咱玩编程,好歹也算是搞科研了,汝这样天天连蒙带猜的,这不是事啊,这能靠谱吗?
吾亦知道有点那个(哪个?),那汝可有好办法?实际上搞科研,开始的时候不都是这样嘛。
所以每次解决问题,吾都喜欢公布解决办法,希望其他人能够顺利一些。
SINK插件的事件处理代码:
static gboolean gh_gstsink_event(GstBaseSink *sink, GstEvent *event)
{GstElement* element = (GstElement*)sink;GhGstSink* ghsink = (GhGstSink*) sink;switch(event-> type){case GST_EVENT_EOS:break;case GST_EVENT_FLUSH_START:case GST_EVENT_FLUSH_STOP:default:break;}//关键代码。最关键的就是遇到GST_EVENT_EOS要如此调用。return GST_BASE_SINK_CLASS(parent_class)->event(sink, event);
}static void gh_gstsink_class_init (GhGstSinkClass * klass)
{GObjectClass *gobject_class = (GObjectClass *) klass;GstElementClass *gstelement_class = (GstElementClass *) klass;GstBaseSinkClass *gstbasesink_class= (GstBaseSinkClass *) klass;/* Overide base class functions *///代码对齐,看起来很漂亮专业吧。gobject_class->set_property = GST_DEBUG_FUNCPTR (gh_gstsink_set_property);gobject_class->get_property = GST_DEBUG_FUNCPTR (gh_gstsink_get_property);gstbasesink_class->render = GST_DEBUG_FUNCPTR (gh_gstsink_render);gstbasesink_class->start = GST_DEBUG_FUNCPTR (gh_gstsink_start);gstbasesink_class->stop = GST_DEBUG_FUNCPTR (gh_gstsink_stop);gstbasesink_class->event = GST_DEBUG_FUNCPTR (gh_gstsink_event);
……
}
对于Transform插件(相当于 Filter),事件代码如下:
static gboolean gst_rfcnplugin_sink_event(GstBaseTransform *trans, GstEvent *event)
{//关键代码。最关键的就是遇到GST_EVENT_EOS要如此调用。return GST_BASE_TRANSFORM_CLASS(parent_class)->sink_event(trans, event);
}static gboolean gst_rfcnplugin_src_event(GstBaseTransform *trans, GstEvent *event)
{//关键代码。最关键的就是遇到GST_EVENT_EOS要如此调用。return GST_BASE_TRANSFORM_CLASS(parent_class)->src_event(trans, event);
}static void gst_rfcnplugin_class_init(GstRfcnPluginClass* klass)
{GObjectClass* gobject_class = (GObjectClass*) klass;GstElementClass* gstelement_class = (GstElementClass*) klass;GstBaseTransformClass* gstbasetransform_class = (GstBaseTransformClass*) klass;/* Overide base class functions */gobject_class->set_property = GST_DEBUG_FUNCPTR(gst_rfcn_set_property);gobject_class->get_property = GST_DEBUG_FUNCPTR(gst_rfcnplugin_get_property);gstbasetransform_class->set_caps = GST_DEBUG_FUNCPTR(gst_rfcnplugin_set_caps);gstbasetransform_class->start = GST_DEBUG_FUNCPTR(gst_rfcnplugin_start);gstbasetransform_class->stop = GST_DEBUG_FUNCPTR(gst_rfcnplugin_stop);gstbasetransform_class->transform_ip = GST_DEBUG_FUNCPTR(gst_rfcnplugin_transform_ip);gstbasetransform_class->sink_event = GST_DEBUG_FUNCPTR(gst_rfcnplugin_sink_event);gstbasetransform_class->src_event = GST_DEBUG_FUNCPTR(gst_rfcnplugin_src_event);
……
}
start/stop的正确写法!
static gboolean gh_gstsink_start (GstBaseSink * basesink)
{//do pre work.//这样调用会崩溃。//return GST_BASE_SINK_CLASS(parent_class)->start(basesink);return TRUE;
}static gboolean gh_gstsink_stop (GstBaseSink * basesink)
{//release something.//这样调用会崩溃。//return GST_BASE_SINK_CLASS(parent_class)->stop(basesink);return TRUE;
}
gstreamer插件特别要注意事件处理(含代码范例)相关推荐
- gst-crypto GStreamer插件
gst-crypto GStreamer插件 内容 • 1. gst-crypto概述 o 1.1gst-crypto GStreamer插件功能 o 1.2用例范例 • 2. GStreamer插件 ...
- 编写一个GStreamer插件
前面章节对GStreamer做了概述,不过我们最终用到主要是插件,下面我们对插件做一个简单介绍,大部分内容都是copy的,并非原创,主要用于学习记录,英文好的可以看官方文档,我和官方校对过,翻译的大体 ...
- GStreamer插件实列rockchipmpp
尽管这些年arm发展取得了不少的进步,不过对于音视频的编解码仍然心有余力不足,好在芯片厂家在SOC里面提供了硬件加速能力.善于发挥出芯片的能力,才能打造出完美的应用.今天我们一起来探索一下rk3568 ...
- 给IntelliJ IDEA换了个皮肤,加了几个插件,发现我爱上了敲代码:)
先说结论 IntelliJ IDEA中使用Material Theme UI 的Theme + Rainbow Brackets 这俩插件,并且Editor->Color Scheme中选择Da ...
- Pytorch优化器全总结(三)牛顿法、BFGS、L-BFGS 含代码
目录 写在前面 一.牛顿法 1.看图理解牛顿法 2.公式推导-三角函数 3.公式推导-二阶泰勒展开 二.BFGS公式推导 三.L-BFGS 四.算法迭代过程 五.代码实现 1.torch.optim. ...
- 【03】Unity AR 2022Vuforia图片识别超详细案例(小岛动画交互)【含代码】
Unity AR Vuforia(拓展)--Vuforia图片识别超详细案例(小岛动画交互)[含代码] 文章目录 Unity AR Vuforia(拓展)--Vuforia图片识别超详细案例(小岛动画 ...
- 前端实现红包雨功能_最全解密微信红包随机算法(含代码实现)
code小生 一个专注大前端领域的技术平台公众号回复 Android加入安卓技术群 " 1.引言 这个系列文章已经整理了10篇,但都没有涉及到具体的红包算法实现,主要有以下两方面原因.一方 ...
- 【阅读笔记】多任务学习之PLE(含代码实现)
本文作为自己阅读论文后的总结和思考,不涉及论文翻译和模型解读,适合大家阅读完论文后交流想法. PLE 一. 全文总结 二. 研究方法 三. 结论 四. 创新点 五. 思考 六. 参考文献 七. Pyt ...
- 最全解密微信红包随机算法(含代码实现)
code小生 一个专注大前端领域的技术平台 公众号回复Android加入安卓技术群 " 本文内容编写时,参考了网上的资料,详见"参考资料"部分,感谢分享者..本文已同步发 ...
- mybatis-generator生成带中文注释POJO类的超详细教程含代码和图解
mybatis-generator生成带中文注释POJO类的超详细教程含代码和图解 mybatis-generator自动生成带中文注释POJO类和增删改查,idea和eclipes都可以使用 MyC ...
最新文章
- web复习day03:request
- 人脸识别屡遭非议,会成为“潘多拉魔盒”吗?
- Dynpro程序抬头信息要求多值输入的解决方法
- (百度、谷歌)地图经纬度gps偏移解决办法:gps纠偏数据库纠偏
- C++中的(unsigned int)代表的意思
- Android自定义View之paint(一)
- 插件前奏-android黑科技 hook介绍
- 重启Oracle 服务
- 文件已被占用的解决方法
- Python常用取整函数
- 【日语】英语26个字母的日语读法
- 基于股票大数据分析的Python入门实战(实践记录)(持续更新)
- 2353563-50-3,Thalidomide-O-PEG4-Acid一种鱼精蛋白连接物,在活化剂EDC或HATU存在下可与含胺部分反应
- 什么是 IP 欺骗?
- python爬虫之糗事百科
- Java 实现顺时针螺旋二维数组输出
- 【dubbo-2.5.x】Linux下dubbo-admin监控/管理平台部署详细教程
- 浅谈一下刚学的Java集合
- 如何查看suse系统服务器sn,suse 配置 - sncder的个人空间 - OSCHINA - 中文开源技术交流社区...
- Android 培训课件编写--- 第1章 Android应用开发概述
热门文章
- mysql 使用内置函数来进行模糊搜索(locate()等)
- 通过Properties读取配置文件
- [20180625]10g下查询条件rownum = 0.txt
- PHP语言 -- 封装连接数据库类
- 为了有利于保护安全性,IE已限制此网页运行可以访问计算机的脚本或 ActiveX 控件。请单击这里获取选项......
- IT项目管理之无休止会议
- 一步一步教你使用AgileEAS.NET基础类库进行应用开发-基础篇-涉及的数据定义
- JavaScript数据结构学习笔记(封装栈、队列、优先级队列、链表、双向链表)
- net core引用外部dll发布后报错找不到文件
- PHP静态方法中调用非静态方法