[GStreamer] 定义并使用多参数信号

前言:

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")的使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值