• [GStreamer] 插件的名字要和GST_PLUGIN_DEFINE匹配


    在自定义插件的时候,输出的插件名字需要和 GST_PLUGIN_DEFINE 的第三个参数进行一定形式的匹配。

    GST_PLUGIN_DEFINE 底层会调用 static gchar * extract_symname (const char *filename) 来获取插件名字对应的 short name,源码如下:

    1. static gchar *
    2. extract_symname (const char *filename)
    3. {
    4. gchar *bname, *name, *symname;
    5. const gchar *dot;
    6. gsize prefix_len, len;
    7. int i;
    8. bname = g_path_get_basename (filename);
    9. for (i = 0; bname[i]; ++i) {
    10. if (bname[i] == '-')
    11. bname[i] = '_';
    12. }
    13. if (g_str_has_prefix (bname, "libgst"))
    14. prefix_len = 6;
    15. else if (g_str_has_prefix (bname, "lib"))
    16. prefix_len = 3;
    17. else if (g_str_has_prefix (bname, "gst"))
    18. prefix_len = 3;
    19. else
    20. prefix_len = 0; /* use whole name (minus suffix) as plugin name */
    21. dot = g_utf8_strchr (bname, -1, '.');
    22. if (dot)
    23. len = dot - bname - prefix_len;
    24. else
    25. len = strlen (bname + prefix_len);
    26. name = g_strndup (bname + prefix_len, len);
    27. g_free (bname);
    28. symname = g_strconcat ("gst_plugin_", name, "_get_desc", NULL);
    29. g_free (name);
    30. return symname;
    31. }

    注意,如果 插件的名字时 libgst 开头的,那么就会从 libgst 后面的第一个字符开始摘取字符串,然后拼接成 gst_plugin_xxx_get_desc 函数名称,而这个函数名称的定义是在宏 GST_PLUGIN_DEFINE 中进行的。

    所以,如果有 libgstmyplugin.so , 那么 GST_PLUGIN_DEFINE 的第三个参数就必须是  myplugin ,否则就会出现 “ libgstmyplugin.so 不是插件 “ 的错误。

    如果插件文件是 libgstgstmyplugin.so ,那么 GST_PLUGIN_DEFINE 的第三个参数就必须是 gstmyplugin,否则也会出现“ libgstmyplugin.so 不是插件 “ 的错误。

    另外,如果插件文件时 libmyplugin.so ,那么 GST_PLUGIN_DEFINE 的第三个参数就必须是  myplugin , 因为代码中发现没有libgst 开头,而是lib开头,则会从lib后的第一位开始算。

    这个地方非常迷惑,如果不用 GST_PLUGIN_DEFINE 宏注册插件则不会有这些问题,因为注册函数需要自己明确指定 get_desc 的函数名,不会出现拼接函数名的情况。

    这个问题如果不看源码,根本毫无规律可循,包括官方文档也没有给出明确的说明,这个坑比较容易踩,也很费时费神。

  • 相关阅读:
    vue2进阶学习知识汇总
    「团队训练赛」ShanDong Multi-University Training #3
    Express框架的使用
    Docker 学习笔记总结(三)
    如何制作企业招聘二维码?
    Python数据分析与机器学习3-Pandas
    内置MOS升压芯片FP6293 双节锂升压8.4V/1A
    第九周内容回顾
    java基于springboot在线音乐分享网站的ssm社交网站
    汇编:循环结构
  • 原文地址:https://blog.csdn.net/ykun089/article/details/126040589