tee: Check for the removed pad flag also in the slow pushing path
[platform/upstream/gstreamer.git] / gst / gstplugin.c
index 7331a31..70c942d 100644 (file)
@@ -88,7 +88,8 @@ static char *_gst_plugin_fault_handler_filename = NULL;
  * QPL: http://www.trolltech.com/licenses/qpl.html
  * MPL: http://www.opensource.org/licenses/mozilla1.1.php
  * MIT/X11: http://www.opensource.org/licenses/mit-license.php
- * 3-clause BSD: http://www.opensource.org/licenses/bsd-license.php
+ * 3-clause BSD: https://opensource.org/licenses/BSD-3-Clause
+ * Zero-Clause BSD: https://opensource.org/licenses/0BSD
  */
 static const gchar valid_licenses[] = "LGPL\000"        /* GNU Lesser General Public License */
     "GPL\000"                   /* GNU General Public License */
@@ -97,10 +98,13 @@ static const gchar valid_licenses[] = "LGPL\000"        /* GNU Lesser General Pu
     "MPL\000"                   /* MPL 1.1 license */
     "BSD\000"                   /* 3-clause BSD license */
     "MIT/X11\000"               /* MIT/X11 license */
+    "0BSD\000"                  /* Zero-Clause BSD */
     "Proprietary\000"           /* Proprietary license */
     GST_LICENSE_UNKNOWN;        /* some other license */
 
-static const guint8 valid_licenses_idx[] = { 0, 5, 9, 13, 21, 25, 29, 37, 49 };
+static const guint8 valid_licenses_idx[] = { 0, 5, 9, 13, 21, 25, 29, 37, 42,
+  54
+};
 
 static GstPlugin *gst_plugin_register_func (GstPlugin * plugin,
     const GstPluginDesc * desc, gpointer user_data);
@@ -109,13 +113,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 +157,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 +668,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.
@@ -686,20 +687,29 @@ extract_symname (const char *filename)
 {
   gchar *bname, *name, *symname;
   const gchar *dot;
-  gsize prefix_len = 0, len;
+  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;
+    prefix_len = 6;
   else if (g_str_has_prefix (bname, "lib"))
-    prefix_len += 3;
+    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_strrchr (bname, -1, '.');
+  dot = g_utf8_strchr (bname, -1, '.');
   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);
@@ -710,6 +720,10 @@ extract_symname (const char *filename)
   return symname;
 }
 
+/* Note: The return value is (transfer full) although we work with floating
+ * references here. If a new plugin instance is created, it is always sinked
+ * in the registry first and a new reference is returned
+ */
 GstPlugin *
 _priv_gst_plugin_load_file_for_registry (const gchar * filename,
     GstRegistry * registry, GError ** error)
@@ -958,7 +972,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)
@@ -1296,7 +1310,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)
@@ -1339,7 +1354,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)
@@ -1348,7 +1364,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)))
@@ -1689,6 +1705,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;
@@ -1697,6 +1714,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);
 
@@ -1705,12 +1724,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);
       }
     }
   }
@@ -1778,15 +1815,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.