在自定义插件的时候,输出的插件名字需要和 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 的函数名,不会出现拼接函数名的情况。
这个问题如果不看源码,根本毫无规律可循,包括官方文档也没有给出明确的说明,这个坑比较容易踩,也很费时费神。