X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gst%2Fgstplugin.c;h=129f60c339fb0b97c57d8b8a12c894964d3008cf;hb=37edc474e3dc292d53e64f9415536da1741ecede;hp=6970fdf6efef497c6eb295cd543ecb2ae0daf505;hpb=f29082bfe1feb3e89e5f52bbd26d081fb7382a6b;p=platform%2Fupstream%2Fgstreamer.git diff --git a/gst/gstplugin.c b/gst/gstplugin.c index 6970fdf..129f60c 100644 --- a/gst/gstplugin.c +++ b/gst/gstplugin.c @@ -109,13 +109,12 @@ static void gst_plugin_desc_copy (GstPluginDesc * dest, static void gst_plugin_ext_dep_free (GstPluginDep * dep); -G_DEFINE_TYPE (GstPlugin, gst_plugin, GST_TYPE_OBJECT); +G_DEFINE_TYPE_WITH_PRIVATE (GstPlugin, gst_plugin, GST_TYPE_OBJECT); static void gst_plugin_init (GstPlugin * plugin) { - plugin->priv = - G_TYPE_INSTANCE_GET_PRIVATE (plugin, GST_TYPE_PLUGIN, GstPluginPrivate); + plugin->priv = gst_plugin_get_instance_private (plugin); } static void @@ -154,8 +153,6 @@ static void gst_plugin_class_init (GstPluginClass * klass) { G_OBJECT_CLASS (klass)->finalize = gst_plugin_finalize; - - g_type_class_add_private (klass, sizeof (GstPluginPrivate)); } GQuark @@ -667,7 +664,7 @@ static GMutex gst_plugin_loading_mutex; /** * gst_plugin_load_file: - * @filename: the plugin filename to load + * @filename: (type filename): the plugin filename to load * @error: pointer to a %NULL-valued GError * * Loads the given plugin and refs it. Caller needs to unref after use. @@ -708,7 +705,7 @@ extract_symname (const char *filename) if (dot) len = dot - bname - prefix_len; else - len = g_utf8_strlen (bname + prefix_len, -1); + len = strlen (bname + prefix_len); name = g_strndup (bname + prefix_len, len); g_free (bname); @@ -971,7 +968,7 @@ gst_plugin_get_description (GstPlugin * plugin) * * get the filename of the plugin * - * Returns: the filename of the plugin + * Returns: (type filename): the filename of the plugin */ const gchar * gst_plugin_get_filename (GstPlugin * plugin) @@ -1309,7 +1306,8 @@ gst_plugin_find_feature_by_name (GstPlugin * plugin, const gchar * name) * * Load the named plugin. Refs the plugin. * - * Returns: (transfer full): a reference to a loaded plugin, or %NULL on error. + * Returns: (transfer full) (nullable): a reference to a loaded plugin, or + * %NULL on error. */ GstPlugin * gst_plugin_load_by_name (const gchar * name) @@ -1352,7 +1350,8 @@ gst_plugin_load_by_name (const gchar * name) * plugin = loaded_plugin; * ]| * - * Returns: (transfer full): a reference to a loaded plugin, or %NULL on error. + * Returns: (transfer full) (nullable): a reference to a loaded plugin, or + * %NULL on error. */ GstPlugin * gst_plugin_load (GstPlugin * plugin) @@ -1361,7 +1360,7 @@ gst_plugin_load (GstPlugin * plugin) GstPlugin *newplugin; if (gst_plugin_is_loaded (plugin)) { - return plugin; + return gst_object_ref (plugin); } if (!(newplugin = gst_plugin_load_file (plugin->filename, &error))) @@ -1702,6 +1701,7 @@ static guint gst_plugin_ext_dep_get_stat_hash (GstPlugin * plugin, GstPluginDep * dep) { gboolean paths_are_default_only; + gboolean paths_are_relative_to_exe; GQueue scan_paths = G_QUEUE_INIT; guint scan_hash = 0; gchar *path; @@ -1710,6 +1710,8 @@ gst_plugin_ext_dep_get_stat_hash (GstPlugin * plugin, GstPluginDep * dep) paths_are_default_only = dep->flags & GST_PLUGIN_DEPENDENCY_FLAG_PATHS_ARE_DEFAULT_ONLY; + paths_are_relative_to_exe = + dep->flags & GST_PLUGIN_DEPENDENCY_FLAG_PATHS_ARE_RELATIVE_TO_EXE; gst_plugin_ext_dep_extract_env_vars_paths (plugin, dep, &scan_paths); @@ -1718,12 +1720,30 @@ gst_plugin_ext_dep_get_stat_hash (GstPlugin * plugin, GstPluginDep * dep) for (paths = dep->paths; paths != NULL && *paths != NULL; ++paths) { const gchar *path = *paths; + gchar *full_path; + + if (paths_are_relative_to_exe && !g_path_is_absolute (path)) { + gchar *appdir; + + if (!_gst_executable_path) { + GST_FIXME_OBJECT (plugin, + "Path dependency %s relative to executable path but could not retrieve executable path", + path); + continue; + } + appdir = g_path_get_dirname (_gst_executable_path); + full_path = g_build_filename (appdir, path, NULL); + g_free (appdir); + } else { + full_path = g_strdup (path); + } - if (!g_queue_find_custom (&scan_paths, path, (GCompareFunc) strcmp)) { - GST_LOG_OBJECT (plugin, "path: '%s'", path); - g_queue_push_tail (&scan_paths, g_strdup (path)); + if (!g_queue_find_custom (&scan_paths, full_path, (GCompareFunc) strcmp)) { + GST_LOG_OBJECT (plugin, "path: '%s'", full_path); + g_queue_push_tail (&scan_paths, full_path); } else { - GST_LOG_OBJECT (plugin, "path: '%s' (duplicate, ignoring)", path); + GST_LOG_OBJECT (plugin, "path: '%s' (duplicate, ignoring)", full_path); + g_free (full_path); } } } @@ -1791,15 +1811,15 @@ gst_plugin_ext_dep_equals (GstPluginDep * dep, const gchar ** env_vars, /** * gst_plugin_add_dependency: * @plugin: a #GstPlugin - * @env_vars: (allow-none): %NULL-terminated array of environment variables affecting the + * @env_vars: (allow-none) (array zero-terminated=1): %NULL-terminated array of environment variables affecting the * feature set of the plugin (e.g. an environment variable containing * paths where to look for additional modules/plugins of a library), * or %NULL. Environment variable names may be followed by a path component * which will be added to the content of the environment variable, e.g. * "HOME/.mystuff/plugins". - * @paths: (allow-none): %NULL-terminated array of directories/paths where dependent files + * @paths: (allow-none) (array zero-terminated=1): %NULL-terminated array of directories/paths where dependent files * may be, or %NULL. - * @names: (allow-none): %NULL-terminated array of file names (or file name suffixes, + * @names: (allow-none) (array zero-terminated=1): %NULL-terminated array of file names (or file name suffixes, * depending on @flags) to be used in combination with the paths from * @paths and/or the paths extracted from the environment variables in * @env_vars, or %NULL.