[GStreamer] 定义并使用多参数信号
  tCdZJQtjUpyw 2023年11月02日 39 0


前言:

glib里面定义型号的时候可以指定参数个数以及每个参数的类型,因此说明是可以传递多个参数给信号callback的。

正常情况下可以把所有参数封装到一个结构体里面,然后通过传递结构体的方式同时传递多个参数,但是这样会增加代码量。

下文介绍如何直接传递多个参数给信号callback。

定义信号:

/**
   * GstAppSrc::cache-info:
   * @appsrc: the appsrc element that emitted the signal
   * @size: total size are there in the appsre queue in size_t of queue element.
   * @cnt: buffer count are there in the appsrc queue.
   *
   * Signal the cache info of source. 
   */
  gst_app_src_signals[SIGNAL_CACHE_INFO] =
      g_signal_new ("cache-info", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST,
      0, NULL, NULL, NULL, G_TYPE_NONE, 2, G_TYPE_UINT64, G_TYPE_UINT64);

定义一个信号,叫做cache-info,这个信号传递两个参数,都是 G_TYPE_UINT64 类型。

定义信号处理函数:

static void GstAppSrcCacheInfoCb(GstElement* element, guint64 size, guint64 cnt, gpointer 
  userdata) {
    cacheInfoCb_GstAppSrcUserData* src = static_cast<GstAppSrcUserData*>(userdata);
	printf("size = %llu, cnt = %llu" , size , cnt );
}

这里的信号处理函数是4个参数,第一个是信号所属的element的实例,最后一个是g_signal_connect时指定传递给信号处理函数的额外入参,中间的参数就是信号的参数,参数个数在定义信号时有指定。

连接信号:

g_signal_connect(G_OBJECT(element_.get()), "cache-info", G_CALLBACK(GstAppSrcCacheInfoCb), this);

element_是当前信号所属的element实例,最后一个参数(这里的this)对应信号处理函数的 gpointer userdata 入参。

发送信号:

g_signal_emit (appsrc, gst_app_src_signals[SIGNAL_CACHE_INFO], 0,
              priv->queued_bytes, priv->queued_buffers, NULL);

需要在最后用NULL结尾,这很重要,如果是一个参数的信号就不需要,大于等于两个的信号发送时都要在结尾补上NULL。

参考:

gstreamer源码中 Cairo_overlay.c 里面对于 Gstcairolay.c 的 SIGNAL_DRAW 信号("draw")的使用。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

上一篇: VS2022:结构化诊断 下一篇: 2023/10/18
  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
tCdZJQtjUpyw