/**
* SECTION:gst
+ * @title: GStreamer
* @short_description: Media library supporting arbitrary formats and filter
* graphs.
*
* and argv variables so that GStreamer can process its own command line
* options, as shown in the following example.
*
- * <example>
- * <title>Initializing the gstreamer library</title>
- * <programlisting language="c">
+ * ## Initializing the gstreamer library
+ *
+ * |[ <!-- language="C" -->
* int
* main (int argc, char *argv[])
* {
* gst_init (&argc, &argv);
* ...
* }
- * </programlisting>
- * </example>
+ * ]|
*
* It's allowed to pass two %NULL pointers to gst_init() in case you don't want
* to pass the command line args to GStreamer.
*
* You can also use GOption to initialize your own parameters as shown in
* the next code fragment:
- * <example>
- * <title>Initializing own parameters when initializing gstreamer</title>
- * <programlisting>
+ *
+ * ## Initializing own parameters when initializing gstreamer
+ * |[ <!-- language="C" -->
* static gboolean stats = FALSE;
* ...
* int
* g_option_context_free (ctx);
* ...
* }
- * </programlisting>
- * </example>
+ * ]|
*
* Use gst_version() to query the library version at runtime or use the
* GST_VERSION_* macros to find the version at compile time. Optionally
* gst_version_string() returns a printable string.
*
* The gst_deinit() call is used to clean up all internal resources used
- * by <application>GStreamer</application>. It is mostly used in unit tests
- * to check for leaks.
+ * by GStreamer. It is mostly used in unit tests to check for leaks.
*/
#include "gst_private.h"
#define WIN32_LEAN_AND_MEAN /* prevents from including too many things */
#include <windows.h> /* GetStdHandle, windows console */
#endif
+#if defined (__APPLE__)
+#include "TargetConditionals.h"
+#if !TARGET_OS_IPHONE && !TARGET_OS_SIMULATOR && !TARGET_OS_EMBEDDED
+#include <libproc.h> /* proc_pidpath, PROC_PIDPATHINFO_MAXSIZE */
+#endif
+#endif
#include "gst-i18n-lib.h"
#include <locale.h> /* for LC_ALL */
extern gboolean _priv_gst_disable_registry_update;
#endif
+gchar *_gst_executable_path = NULL;
+
#ifndef GST_DISABLE_GST_DEBUG
const gchar *priv_gst_dump_dot_dir;
#endif
* threading system as one of the very first things in your program
* (see the example at the beginning of this section).
*
- * Returns: (transfer full): a pointer to GStreamer's option group.
+ * Returns: (transfer full) (nullable): a pointer to GStreamer's option group.
*/
GOptionGroup *
#endif
}
+#if defined(__linux__)
+static void
+find_executable_path (void)
+{
+ GError *error = NULL;
+
+ if (_gst_executable_path)
+ return;
+
+ _gst_executable_path = g_file_read_link ("/proc/self/exe", &error);
+ if (error)
+ g_error_free (error);
+}
+#elif defined(G_OS_WIN32)
+static void
+find_executable_path (void)
+{
+ char buffer[MAX_PATH];
+
+ if (!GetModuleFileName (NULL, buffer, MAX_PATH))
+ return;
+
+ _gst_executable_path = g_strdup (buffer);
+}
+#elif defined(__APPLE__) && !TARGET_OS_IPHONE && !TARGET_OS_SIMULATOR && !TARGET_OS_EMBEDDED
+static void
+find_executable_path (void)
+{
+ int ret;
+ pid_t pid;
+ char pathbuf[PROC_PIDPATHINFO_MAXSIZE];
+
+ pid = getpid ();
+ ret = proc_pidpath (pid, pathbuf, sizeof (pathbuf));
+ if (ret > 0)
+ _gst_executable_path = g_strdup (pathbuf);
+}
+#else
+static void
+find_executable_path (void)
+{
+ GST_FIXME ("Couldn't look up executable path, add support for this platform");
+}
+#endif
+
+/**
+ * gst_get_main_executable_path:
+ *
+ * This helper is mostly helpful for plugins that need to
+ * inspect the folder of the main executable to determine
+ * their set of features.
+ *
+ * When a plugin is initialized from the gst-plugin-scanner
+ * external process, the returned path will be the same as from the
+ * parent process.
+ *
+ * Returns: (transfer none) (nullable): The path of the executable that
+ * initialized GStreamer, or %NULL if it could not be determined.
+ *
+ * Since: 1.14
+ */
+const gchar *
+gst_get_main_executable_path (void)
+{
+ return _gst_executable_path;
+}
+
/**
* gst_init_check:
* @argc: (inout) (allow-none): pointer to application's argc
* <link linkend="gst-running">Running GStreamer Applications</link>
* for how to disable automatic registry updates.
*
- * <note><para>
- * This function will terminate your program if it was unable to initialize
- * GStreamer for some reason. If you want your program to fall back,
- * use gst_init_check() instead.
- * </para></note>
+ * > This function will terminate your program if it was unable to initialize
+ * > GStreamer for some reason. If you want your program to fall back,
+ * > use gst_init_check() instead.
*
* WARNING: This function does not work in the same way as corresponding
* functions in other glib-style libraries, such as gtk_init\(\). In
return gst_initialized;
}
-#ifndef GST_DISABLE_REGISTRY
+#ifndef GST_DISABLE_OPTION_PARSING
+# ifndef GST_DISABLE_REGISTRY
static void
add_path_func (gpointer data, gpointer user_data)
{
_priv_gst_plugin_paths =
g_list_append (_priv_gst_plugin_paths, g_strdup (data));
}
+# endif
#endif
#ifndef GST_DISABLE_OPTION_PARSING
return TRUE;
}
+ find_executable_path ();
+
_priv_gst_start_time = gst_util_get_timestamp ();
#ifndef GST_DISABLE_GST_DEBUG
/*
* this bit handles:
- * - initalization of threads if we use them
+ * - initialization of threads if we use them
* - log handler
* - initial output
* - initializes gst_format
g_type_class_ref (gst_allocator_flags_get_type ());
g_type_class_ref (gst_stream_flags_get_type ());
g_type_class_ref (gst_stream_type_get_type ());
+ g_type_class_ref (gst_stack_trace_flags_get_type ());
+ g_type_class_ref (gst_promise_result_get_type ());
_priv_gst_event_initialize ();
_priv_gst_buffer_initialize ();
return TRUE;
}
-#ifndef GST_DISABLE_GST_DEBUG
+#ifndef GST_DISABLE_OPTION_PARSING
+# ifndef GST_DISABLE_GST_DEBUG
static gboolean
select_all (GstPlugin * plugin, gpointer user_data)
{
g_slist_free (list);
g_print ("\n");
}
-#endif
+# endif /* GST_DISABLE_OPTION_PARSING */
+#endif /* GST_DISABLE_GST_DEBUG */
#ifndef GST_DISABLE_OPTION_PARSING
static gboolean
* This function is therefore mostly used by testsuites and other memory
* profiling tools.
*
- * After this call GStreamer (including this method) should not be used anymore.
+ * After this call GStreamer (including this method) should not be used anymore.
*/
void
gst_deinit (void)
GstBinClass *bin_class;
GstClock *clock;
+ if (!gst_initialized)
+ return;
+
GST_INFO ("deinitializing GStreamer");
if (gst_deinitialized) {
return;
}
g_thread_pool_set_max_unused_threads (0);
- bin_class = GST_BIN_CLASS (g_type_class_peek (gst_bin_get_type ()));
- if (bin_class->pool != NULL) {
+ bin_class = (GstBinClass *) g_type_class_peek (gst_bin_get_type ());
+ if (bin_class && bin_class->pool != NULL) {
g_thread_pool_free (bin_class->pool, FALSE, TRUE);
bin_class->pool = NULL;
}
_priv_gst_plugin_paths = NULL;
#endif
+ if (_gst_executable_path) {
+ g_free (_gst_executable_path);
+ _gst_executable_path = NULL;
+ }
+
clock = gst_system_clock_obtain ();
gst_object_unref (clock);
gst_object_unref (clock);
g_type_class_unref (g_type_class_peek (gst_allocator_flags_get_type ()));
g_type_class_unref (g_type_class_peek (gst_stream_flags_get_type ()));
g_type_class_unref (g_type_class_peek (gst_debug_color_mode_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_stack_trace_flags_get_type ()));
+ g_type_class_unref (g_type_class_peek (gst_promise_result_get_type ()));
gst_deinitialized = TRUE;
GST_INFO ("deinitialized GStreamer");