diff options
author | Sebastian Dröge <sebastian.droege@collabora.co.uk> | 2010-09-25 10:46:34 +0200 |
---|---|---|
committer | Sebastian Dröge <sebastian.droege@collabora.co.uk> | 2010-09-25 10:46:34 +0200 |
commit | 8dc7347d65e923d9a86ced26bba9411e99f90aaa (patch) | |
tree | 4fbe96152c72926fc3fb12080b52b2ed8ecc4487 | |
parent | bf74bcc1af18a5ee712869758a7d0b71965c725f (diff) |
frei0r: Fix scanning of plugin subdirectories and support different vendors
The frei0r spec specifies, that plugins can be in subdirectories inside
the main plugin directories to introduce new namespaces called vendors.
-rw-r--r-- | gst/frei0r/gstfrei0r.c | 62 | ||||
-rw-r--r-- | gst/frei0r/gstfrei0rfilter.c | 9 | ||||
-rw-r--r-- | gst/frei0r/gstfrei0rfilter.h | 2 | ||||
-rw-r--r-- | gst/frei0r/gstfrei0rmixer.c | 9 | ||||
-rw-r--r-- | gst/frei0r/gstfrei0rmixer.h | 2 | ||||
-rw-r--r-- | gst/frei0r/gstfrei0rsrc.c | 9 | ||||
-rw-r--r-- | gst/frei0r/gstfrei0rsrc.h | 2 |
7 files changed, 62 insertions, 33 deletions
diff --git a/gst/frei0r/gstfrei0r.c b/gst/frei0r/gstfrei0r.c index d6604ec90..2254dc2ec 100644 --- a/gst/frei0r/gstfrei0r.c +++ b/gst/frei0r/gstfrei0r.c @@ -457,7 +457,8 @@ gst_frei0r_set_property (f0r_instance_t * instance, GstFrei0rFuncTable * ftable, } static gboolean -register_plugin (GstPlugin * plugin, const gchar * filename) +register_plugin (GstPlugin * plugin, const gchar * vendor, + const gchar * filename) { GModule *module; GstFrei0rPluginRegisterReturn ret = GST_FREI0R_PLUGIN_REGISTER_RETURN_FAILED; @@ -547,14 +548,14 @@ register_plugin (GstPlugin * plugin, const gchar * filename) switch (info.plugin_type) { case F0R_PLUGIN_TYPE_FILTER: - ret = gst_frei0r_filter_register (plugin, &info, &ftable); + ret = gst_frei0r_filter_register (plugin, vendor, &info, &ftable); break; case F0R_PLUGIN_TYPE_SOURCE: - ret = gst_frei0r_src_register (plugin, &info, &ftable); + ret = gst_frei0r_src_register (plugin, vendor, &info, &ftable); break; case F0R_PLUGIN_TYPE_MIXER2: case F0R_PLUGIN_TYPE_MIXER3: - ret = gst_frei0r_mixer_register (plugin, &info, &ftable); + ret = gst_frei0r_mixer_register (plugin, vendor, &info, &ftable); break; default: break; @@ -589,22 +590,38 @@ invalid_frei0r_plugin: static gboolean register_plugins (GstPlugin * plugin, GHashTable * plugin_names, - const gchar * path) + const gchar * path, const gchar * base_path) { GDir *dir; gchar *filename; const gchar *entry_name; - gboolean ret = FALSE; + gboolean ret = TRUE; - GST_DEBUG ("Scanning director '%s' for frei0r plugins", path); + GST_DEBUG ("Scanning directory '%s' for frei0r plugins", path); dir = g_dir_open (path, 0, NULL); if (!dir) return FALSE; while ((entry_name = g_dir_read_name (dir))) { - if (g_hash_table_lookup_extended (plugin_names, entry_name, NULL, NULL)) + gchar *tmp, *vendor = NULL; + gchar *hashtable_name; + + tmp = g_strdup (path + strlen (base_path)); + if (*tmp == G_DIR_SEPARATOR && *(tmp + 1)) + vendor = tmp + 1; + else if (*tmp) + vendor = tmp; + + if (vendor) + hashtable_name = g_strconcat (vendor, "-", entry_name, NULL); + else + hashtable_name = g_strdup (entry_name); + + if (g_hash_table_lookup_extended (plugin_names, hashtable_name, NULL, NULL)) { + g_free (hashtable_name); continue; + } filename = g_build_filename (path, entry_name, NULL); if ((g_str_has_suffix (filename, G_MODULE_SUFFIX) @@ -614,15 +631,17 @@ register_plugins (GstPlugin * plugin, GHashTable * plugin_names, ) && g_file_test (filename, G_FILE_TEST_IS_REGULAR)) { gboolean this_ret; - this_ret = register_plugin (plugin, filename); + this_ret = register_plugin (plugin, vendor, filename); if (this_ret) - g_hash_table_insert (plugin_names, g_strdup (entry_name), NULL); + g_hash_table_insert (plugin_names, g_strdup (hashtable_name), NULL); ret = ret && this_ret; } else if (g_file_test (filename, G_FILE_TEST_IS_DIR)) { - ret = ret && register_plugins (plugin, plugin_names, filename); + ret = ret && register_plugins (plugin, plugin_names, filename, base_path); } g_free (filename); + g_free (hashtable_name); + g_free (tmp); } g_dir_close (dir); @@ -657,22 +676,23 @@ plugin_init (GstPlugin * plugin) gchar **p, **paths = g_strsplit (frei0r_path, ":", -1); for (p = paths; *p; p++) { - register_plugins (plugin, plugin_names, *p); + register_plugins (plugin, plugin_names, *p, *p); } g_strfreev (paths); } else { +#define register_plugins2(plugin, pn, p) register_plugins(plugin, pn, p, p) homedir = g_get_home_dir (); - path = g_build_filename (homedir, ".frei0r-1", NULL); - register_plugins (plugin, plugin_names, path); + path = g_build_filename (homedir, ".frei0r-1", "lib", NULL); + register_plugins2 (plugin, plugin_names, path); g_free (path); - - register_plugins (plugin, plugin_names, "/usr/local/lib/frei0r-1"); - register_plugins (plugin, plugin_names, "/usr/lib/frei0r-1"); - register_plugins (plugin, plugin_names, "/usr/local/lib32/frei0r-1"); - register_plugins (plugin, plugin_names, "/usr/lib32/frei0r-1"); - register_plugins (plugin, plugin_names, "/usr/local/lib64/frei0r-1"); - register_plugins (plugin, plugin_names, "/usr/lib64/frei0r-1"); + register_plugins2 (plugin, plugin_names, "/usr/local/lib/frei0r-1"); + register_plugins2 (plugin, plugin_names, "/usr/lib/frei0r-1"); + register_plugins2 (plugin, plugin_names, "/usr/local/lib32/frei0r-1"); + register_plugins2 (plugin, plugin_names, "/usr/lib32/frei0r-1"); + register_plugins2 (plugin, plugin_names, "/usr/local/lib64/frei0r-1"); + register_plugins2 (plugin, plugin_names, "/usr/lib64/frei0r-1"); +#undef register_plugins2 } g_hash_table_unref (plugin_names); diff --git a/gst/frei0r/gstfrei0rfilter.c b/gst/frei0r/gstfrei0rfilter.c index cca29fccd..54989c8f4 100644 --- a/gst/frei0r/gstfrei0rfilter.c +++ b/gst/frei0r/gstfrei0rfilter.c @@ -227,8 +227,8 @@ gst_frei0r_filter_init (GstFrei0rFilter * self, GstFrei0rFilterClass * klass) } GstFrei0rPluginRegisterReturn -gst_frei0r_filter_register (GstPlugin * plugin, const f0r_plugin_info_t * info, - const GstFrei0rFuncTable * ftable) +gst_frei0r_filter_register (GstPlugin * plugin, const gchar * vendor, + const f0r_plugin_info_t * info, const GstFrei0rFuncTable * ftable) { GTypeInfo typeinfo = { sizeof (GstFrei0rFilterClass), @@ -246,7 +246,10 @@ gst_frei0r_filter_register (GstPlugin * plugin, const f0r_plugin_info_t * info, GstFrei0rFilterClassData *class_data; GstFrei0rPluginRegisterReturn ret = GST_FREI0R_PLUGIN_REGISTER_RETURN_FAILED; - tmp = g_strdup_printf ("frei0r-filter-%s", info->name); + if (vendor) + tmp = g_strdup_printf ("frei0r-filter-%s-%s", vendor, info->name); + else + tmp = g_strdup_printf ("frei0r-filter-%s", info->name); type_name = g_ascii_strdown (tmp, -1); g_free (tmp); g_strcanon (type_name, G_CSET_A_2_Z G_CSET_a_2_z G_CSET_DIGITS "-+", '-'); diff --git a/gst/frei0r/gstfrei0rfilter.h b/gst/frei0r/gstfrei0rfilter.h index 1b1914a94..5a685cbfc 100644 --- a/gst/frei0r/gstfrei0rfilter.h +++ b/gst/frei0r/gstfrei0rfilter.h @@ -58,7 +58,7 @@ struct _GstFrei0rFilterClass { gint n_properties; }; -GstFrei0rPluginRegisterReturn gst_frei0r_filter_register (GstPlugin *plugin, const f0r_plugin_info_t *info, const GstFrei0rFuncTable *ftable); +GstFrei0rPluginRegisterReturn gst_frei0r_filter_register (GstPlugin *plugin, const gchar * vendor, const f0r_plugin_info_t *info, const GstFrei0rFuncTable *ftable); G_END_DECLS diff --git a/gst/frei0r/gstfrei0rmixer.c b/gst/frei0r/gstfrei0rmixer.c index f61a57341..9c8e605c0 100644 --- a/gst/frei0r/gstfrei0rmixer.c +++ b/gst/frei0r/gstfrei0rmixer.c @@ -768,8 +768,8 @@ gst_frei0r_mixer_init (GstFrei0rMixer * self, GstFrei0rMixerClass * klass) } GstFrei0rPluginRegisterReturn -gst_frei0r_mixer_register (GstPlugin * plugin, const f0r_plugin_info_t * info, - const GstFrei0rFuncTable * ftable) +gst_frei0r_mixer_register (GstPlugin * plugin, const gchar * vendor, + const f0r_plugin_info_t * info, const GstFrei0rFuncTable * ftable) { GTypeInfo typeinfo = { sizeof (GstFrei0rMixerClass), @@ -790,7 +790,10 @@ gst_frei0r_mixer_register (GstPlugin * plugin, const f0r_plugin_info_t * info, if (ftable->update2 == NULL) return GST_FREI0R_PLUGIN_REGISTER_RETURN_FAILED; - tmp = g_strdup_printf ("frei0r-mixer-%s", info->name); + if (vendor) + tmp = g_strdup_printf ("frei0r-mixer-%s-%s", vendor, info->name); + else + tmp = g_strdup_printf ("frei0r-mixer-%s", info->name); type_name = g_ascii_strdown (tmp, -1); g_free (tmp); g_strcanon (type_name, G_CSET_A_2_Z G_CSET_a_2_z G_CSET_DIGITS "-+", '-'); diff --git a/gst/frei0r/gstfrei0rmixer.h b/gst/frei0r/gstfrei0rmixer.h index f077d341a..7cb66005e 100644 --- a/gst/frei0r/gstfrei0rmixer.h +++ b/gst/frei0r/gstfrei0rmixer.h @@ -68,7 +68,7 @@ struct _GstFrei0rMixerClass { gint n_properties; }; -GstFrei0rPluginRegisterReturn gst_frei0r_mixer_register (GstPlugin *plugin, const f0r_plugin_info_t *info, const GstFrei0rFuncTable *ftable); +GstFrei0rPluginRegisterReturn gst_frei0r_mixer_register (GstPlugin *plugin, const gchar * vendor, const f0r_plugin_info_t *info, const GstFrei0rFuncTable *ftable); G_END_DECLS diff --git a/gst/frei0r/gstfrei0rsrc.c b/gst/frei0r/gstfrei0rsrc.c index 1e6beeefa..c74e2607d 100644 --- a/gst/frei0r/gstfrei0rsrc.c +++ b/gst/frei0r/gstfrei0rsrc.c @@ -392,8 +392,8 @@ gst_frei0r_src_init (GstFrei0rSrc * self, GstFrei0rSrcClass * klass) } GstFrei0rPluginRegisterReturn -gst_frei0r_src_register (GstPlugin * plugin, const f0r_plugin_info_t * info, - const GstFrei0rFuncTable * ftable) +gst_frei0r_src_register (GstPlugin * plugin, const gchar * vendor, + const f0r_plugin_info_t * info, const GstFrei0rFuncTable * ftable) { GTypeInfo typeinfo = { sizeof (GstFrei0rSrcClass), @@ -411,7 +411,10 @@ gst_frei0r_src_register (GstPlugin * plugin, const f0r_plugin_info_t * info, GstFrei0rSrcClassData *class_data; GstFrei0rPluginRegisterReturn ret = GST_FREI0R_PLUGIN_REGISTER_RETURN_FAILED; - tmp = g_strdup_printf ("frei0r-src-%s", info->name); + if (vendor) + tmp = g_strdup_printf ("frei0r-src-%s-%s", vendor, info->name); + else + tmp = g_strdup_printf ("frei0r-src-%s", info->name); type_name = g_ascii_strdown (tmp, -1); g_free (tmp); g_strcanon (type_name, G_CSET_A_2_Z G_CSET_a_2_z G_CSET_DIGITS "-+", '-'); diff --git a/gst/frei0r/gstfrei0rsrc.h b/gst/frei0r/gstfrei0rsrc.h index e5a71b738..cba620ae9 100644 --- a/gst/frei0r/gstfrei0rsrc.h +++ b/gst/frei0r/gstfrei0rsrc.h @@ -62,7 +62,7 @@ struct _GstFrei0rSrcClass { gint n_properties; }; -GstFrei0rPluginRegisterReturn gst_frei0r_src_register (GstPlugin *plugin, const f0r_plugin_info_t *info, const GstFrei0rFuncTable *ftable); +GstFrei0rPluginRegisterReturn gst_frei0r_src_register (GstPlugin *plugin, const gchar * vendor, const f0r_plugin_info_t *info, const GstFrei0rFuncTable *ftable); G_END_DECLS |