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