gstreamer插件特别要注意事件处理(含代码范例)

简介: 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;
}
目录
相关文章
|
7月前
|
Python
【python自动化】Playwright基础教程(五)事件操作②悬停&输入&清除精讲
【python自动化】Playwright基础教程(五)事件操作②悬停&输入&清除精讲
178 0
|
JSON 小程序 算法
uniapp小程序封装常用工具函数
类似的工具函数还有很多,这里暂时不一一列举了,上面提到的银行卡校验,还可以使用阿里公开的一个校验接口cardNo=银行卡号码&cardBinCheck=true这个接口会返回对应的银行简称银行卡类型,如果想要显示对应的银行logo的话,可以联系我,由于JSON数据太大,没办法全部放在这里。
205 0
|
4月前
|
图形学
小功能⭐️Unity改变代码执行顺序
小功能⭐️Unity改变代码执行顺序
|
Go
Go 语言跨平台文件监听库 fsnotify 怎么使用?
Go 语言跨平台文件监听库 fsnotify 怎么使用?
127 0
|
缓存 JavaScript iOS开发
iOS 逆向编程(十五)Cycript 语法进阶(封装 .cy 脚本文件)
iOS 逆向编程(十五)Cycript 语法进阶(封装 .cy 脚本文件)
189 0
|
前端开发 JavaScript 定位技术
iOS 逆向编程(十六)DZMCycript 脚本使用(封装了常用的快捷函数,后续会继续添加)
iOS 逆向编程(十六)DZMCycript 脚本使用(封装了常用的快捷函数,后续会继续添加)
140 0
|
人工智能 API 图形学
unity基础脚本代码总结
unity基础脚本代码总结
183 0
|
测试技术 数据库 Python
python接口自动化(二十二)--unittest执行顺序隐藏的坑(详解)
大多数的初学者在使用 unittest 框架时候,不清楚用例的执行顺序到底是怎样的。对测试类里面的类和方法分不清楚,不知道什么时候执行,什么时候不执行。虽然或许通过代码实现了,也是稀里糊涂的一知半解,这样还好,好歹自己鼓 捣出了,但是时间和效率并不是很高,下次遇到还是老样子。那么本篇通过最简单案例来给给为小伙伴详细讲解、演示一下 unittest 执行顺序。
263 0
python接口自动化(二十二)--unittest执行顺序隐藏的坑(详解)
|
JavaScript 前端开发 开发工具
很方便的javascript开发工具--火狐的Scratchpad(代码草稿本)工具
火狐的console控制台可以很方便的测试单行js代码,就像这样:
142 0
很方便的javascript开发工具--火狐的Scratchpad(代码草稿本)工具
gstreamer插件特别要注意事件处理(含代码范例)
gstreamer插件特别要注意事件处理(含代码范例)
175 0