因为工作需要,同事写了一个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插件特别要注意事件处理(含代码范例)相关推荐

  1. gst-crypto GStreamer插件

    gst-crypto GStreamer插件 内容 • 1. gst-crypto概述 o 1.1gst-crypto GStreamer插件功能 o 1.2用例范例 • 2. GStreamer插件 ...

  2. 编写一个GStreamer插件

    前面章节对GStreamer做了概述,不过我们最终用到主要是插件,下面我们对插件做一个简单介绍,大部分内容都是copy的,并非原创,主要用于学习记录,英文好的可以看官方文档,我和官方校对过,翻译的大体 ...

  3. GStreamer插件实列rockchipmpp

    尽管这些年arm发展取得了不少的进步,不过对于音视频的编解码仍然心有余力不足,好在芯片厂家在SOC里面提供了硬件加速能力.善于发挥出芯片的能力,才能打造出完美的应用.今天我们一起来探索一下rk3568 ...

  4. 给IntelliJ IDEA换了个皮肤,加了几个插件,发现我爱上了敲代码:)

    先说结论 IntelliJ IDEA中使用Material Theme UI 的Theme + Rainbow Brackets 这俩插件,并且Editor->Color Scheme中选择Da ...

  5. Pytorch优化器全总结(三)牛顿法、BFGS、L-BFGS 含代码

    目录 写在前面 一.牛顿法 1.看图理解牛顿法 2.公式推导-三角函数 3.公式推导-二阶泰勒展开 二.BFGS公式推导 三.L-BFGS 四.算法迭代过程 五.代码实现 1.torch.optim. ...

  6. 【03】Unity AR 2022Vuforia图片识别超详细案例(小岛动画交互)【含代码】

    Unity AR Vuforia(拓展)--Vuforia图片识别超详细案例(小岛动画交互)[含代码] 文章目录 Unity AR Vuforia(拓展)--Vuforia图片识别超详细案例(小岛动画 ...

  7. 前端实现红包雨功能_最全解密微信红包随机算法(含代码实现)

    code小生 一个专注大前端领域的技术平台公众号回复 Android加入安卓技术群 "  1.引言 这个系列文章已经整理了10篇,但都没有涉及到具体的红包算法实现,主要有以下两方面原因.一方 ...

  8. 【阅读笔记】多任务学习之PLE(含代码实现)

    本文作为自己阅读论文后的总结和思考,不涉及论文翻译和模型解读,适合大家阅读完论文后交流想法. PLE 一. 全文总结 二. 研究方法 三. 结论 四. 创新点 五. 思考 六. 参考文献 七. Pyt ...

  9. 最全解密微信红包随机算法(含代码实现)

    code小生 一个专注大前端领域的技术平台 公众号回复Android加入安卓技术群 " 本文内容编写时,参考了网上的资料,详见"参考资料"部分,感谢分享者..本文已同步发 ...

  10. mybatis-generator生成带中文注释POJO类的超详细教程含代码和图解

    mybatis-generator生成带中文注释POJO类的超详细教程含代码和图解 mybatis-generator自动生成带中文注释POJO类和增删改查,idea和eclipes都可以使用 MyC ...

最新文章

  1. web复习day03:request
  2. 人脸识别屡遭非议,会成为“潘多拉魔盒”吗?
  3. Dynpro程序抬头信息要求多值输入的解决方法
  4. (百度、谷歌)地图经纬度gps偏移解决办法:gps纠偏数据库纠偏
  5. C++中的(unsigned int)代表的意思
  6. Android自定义View之paint(一)
  7. 插件前奏-android黑科技 hook介绍
  8. 重启Oracle 服务
  9. 文件已被占用的解决方法
  10. Python常用取整函数
  11. 【日语】英语26个字母的日语读法
  12. 基于股票大数据分析的Python入门实战(实践记录)(持续更新)
  13. 2353563-50-3,Thalidomide-O-PEG4-Acid一种鱼精蛋白连接物,在活化剂EDC或HATU存在下可与含胺部分反应
  14. 什么是 IP 欺骗?
  15. python爬虫之糗事百科
  16. Java 实现顺时针螺旋二维数组输出
  17. 【dubbo-2.5.x】Linux下dubbo-admin监控/管理平台部署详细教程
  18. 浅谈一下刚学的Java集合
  19. 如何查看suse系统服务器sn,suse 配置 - sncder的个人空间 - OSCHINA - 中文开源技术交流社区...
  20. Android 培训课件编写--- 第1章 Android应用开发概述

热门文章

  1. mysql 使用内置函数来进行模糊搜索(locate()等)
  2. 通过Properties读取配置文件
  3. [20180625]10g下查询条件rownum = 0.txt
  4. PHP语言 -- 封装连接数据库类
  5. 为了有利于保护安全性,IE已限制此网页运行可以访问计算机的脚本或 ActiveX 控件。请单击这里获取选项......
  6. IT项目管理之无休止会议
  7. 一步一步教你使用AgileEAS.NET基础类库进行应用开发-基础篇-涉及的数据定义
  8. JavaScript数据结构学习笔记(封装栈、队列、优先级队列、链表、双向链表)
  9. net core引用外部dll发布后报错找不到文件
  10. PHP静态方法中调用非静态方法