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

  • 相关阅读:
    目标检测 YOLOv5 - Rockchip rknn模型的测试 包括精度,召回率,mAP等详细信息
    【C++】AVL树(平衡搜索二叉树)
    通讯录的实现(文件版本)
    线性表顺序存储结构--(Java)
    通过json-server生成接口并实现一个CRUD项目
    HTTP协议的不同版本及其新特性
    DAZ To UMA⭐二.设置DAZ导出的形态键 和 Daz贴图位置
    简析Cookie、Session、Token
    vue11Vuex解说+子父传参详细使用
    spark集群环境下,实现人口平均年龄计算
  • 原文地址:https://blog.csdn.net/ykun089/article/details/133925510