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


    前言:

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

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

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

    定义信号:

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

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

    定义信号处理函数:

    1. static void GstAppSrcCacheInfoCb(GstElement* element, guint64 size, guint64 cnt, gpointer
    2. userdata) {
    3. cacheInfoCb_GstAppSrcUserData* src = static_cast(userdata);
    4. printf("size = %llu, cnt = %llu" , size , cnt );
    5. }

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

    连接信号:

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

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

    发送信号:

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

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

    参考:

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

  • 相关阅读:
    鹰潭实验室设计要素盘点
    程序员敲诈老板,或面临37年监禁
    沃趣QFusion数据库管理平台-权限管理
    使用 C++ 部署深度学习模型快速上手方案
    NAFNet(ECCV 2022)-图像修复论文解读
    ConfigurationClassPostProcessor 如何放入processors中
    lightdb-归档日志清理优化(22.4)
    闺蜜和我,我和闺蜜
    mysql 在eclipse在配置
    4.1 MSF 制作shellcode,且运行
  • 原文地址:https://blog.csdn.net/ykun089/article/details/133925510