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

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

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

static gchar *
extract_symname (const char *filename)
{
  gchar *bname, *name, *symname;
  const gchar *dot;
  gsize prefix_len, len;
  int i;

  bname = g_path_get_basename (filename);
  for (i = 0; bname[i]; ++i) {
    if (bname[i] == '-')
      bname[i] = '_';
  }

  if (g_str_has_prefix (bname, "libgst"))
    prefix_len = 6;
  else if (g_str_has_prefix (bname, "lib"))
    prefix_len = 3;
  else if (g_str_has_prefix (bname, "gst"))
    prefix_len = 3;
  else
    prefix_len = 0;             /* use whole name (minus suffix) as plugin name */

  dot = g_utf8_strchr (bname, -1, '.');
  if (dot)
    len = dot - bname - prefix_len;
  else
    len = strlen (bname + prefix_len);

  name = g_strndup (bname + prefix_len, len);
  g_free (bname);

  symname = g_strconcat ("gst_plugin_", name, "_get_desc", NULL);
  g_free (name);

  return symname;
}

注意,如果 插件的名字时 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 的函数名,不会出现拼接函数名的情况。

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值