summaryrefslogtreecommitdiff
path: root/subprojects/gst-plugins-bad/gst-libs/gst/player/gstplayer-visualization.c
diff options
context:
space:
mode:
Diffstat (limited to 'subprojects/gst-plugins-bad/gst-libs/gst/player/gstplayer-visualization.c')
-rw-r--r--subprojects/gst-plugins-bad/gst-libs/gst/player/gstplayer-visualization.c179
1 files changed, 179 insertions, 0 deletions
diff --git a/subprojects/gst-plugins-bad/gst-libs/gst/player/gstplayer-visualization.c b/subprojects/gst-plugins-bad/gst-libs/gst/player/gstplayer-visualization.c
new file mode 100644
index 0000000000..0f425a6f68
--- /dev/null
+++ b/subprojects/gst-plugins-bad/gst-libs/gst/player/gstplayer-visualization.c
@@ -0,0 +1,179 @@
+/* GStreamer
+ *
+ * Copyright (C) 2014-2015 Sebastian Dröge <sebastian@centricular.com>
+ * Copyright (C) 2015 Brijesh Singh <brijesh.ksingh@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+/**
+ * SECTION:gstplayer-visualization
+ * @title: GstPlayerVisualization
+ * @short_description: Player Visualization
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gstplayer-visualization.h"
+
+#include <string.h>
+
+static GMutex vis_lock;
+static GQueue vis_list = G_QUEUE_INIT;
+static guint32 vis_cookie;
+
+G_DEFINE_BOXED_TYPE (GstPlayerVisualization, gst_player_visualization,
+ (GBoxedCopyFunc) gst_player_visualization_copy,
+ (GBoxedFreeFunc) gst_player_visualization_free);
+
+/**
+ * gst_player_visualization_free:
+ * @vis: #GstPlayerVisualization instance
+ *
+ * Frees a #GstPlayerVisualization.
+ */
+void
+gst_player_visualization_free (GstPlayerVisualization * vis)
+{
+ g_return_if_fail (vis != NULL);
+
+ g_free (vis->name);
+ g_free (vis->description);
+ g_free (vis);
+}
+
+/**
+ * gst_player_visualization_copy:
+ * @vis: #GstPlayerVisualization instance
+ *
+ * Makes a copy of the #GstPlayerVisualization. The result must be
+ * freed using gst_player_visualization_free().
+ *
+ * Returns: (transfer full): an allocated copy of @vis.
+ */
+GstPlayerVisualization *
+gst_player_visualization_copy (const GstPlayerVisualization * vis)
+{
+ GstPlayerVisualization *ret;
+
+ g_return_val_if_fail (vis != NULL, NULL);
+
+ ret = g_new0 (GstPlayerVisualization, 1);
+ ret->name = vis->name ? g_strdup (vis->name) : NULL;
+ ret->description = vis->description ? g_strdup (vis->description) : NULL;
+
+ return ret;
+}
+
+/**
+ * gst_player_visualizations_free:
+ * @viss: a %NULL terminated array of #GstPlayerVisualization to free
+ *
+ * Frees a %NULL terminated array of #GstPlayerVisualization.
+ */
+void
+gst_player_visualizations_free (GstPlayerVisualization ** viss)
+{
+ GstPlayerVisualization **p;
+
+ g_return_if_fail (viss != NULL);
+
+ p = viss;
+ while (*p) {
+ g_free ((*p)->name);
+ g_free ((*p)->description);
+ g_free (*p);
+ p++;
+ }
+ g_free (viss);
+}
+
+static void
+gst_player_update_visualization_list (void)
+{
+ GList *features;
+ GList *l;
+ guint32 cookie;
+ GstPlayerVisualization *vis;
+
+ g_mutex_lock (&vis_lock);
+
+ /* check if we need to update the list */
+ cookie = gst_registry_get_feature_list_cookie (gst_registry_get ());
+ if (vis_cookie == cookie) {
+ g_mutex_unlock (&vis_lock);
+ return;
+ }
+
+ /* if update is needed then first free the existing list */
+ while ((vis = g_queue_pop_head (&vis_list)))
+ gst_player_visualization_free (vis);
+
+ features = gst_registry_get_feature_list (gst_registry_get (),
+ GST_TYPE_ELEMENT_FACTORY);
+
+ for (l = features; l; l = l->next) {
+ GstPluginFeature *feature = l->data;
+ const gchar *klass;
+
+ klass = gst_element_factory_get_metadata (GST_ELEMENT_FACTORY (feature),
+ GST_ELEMENT_METADATA_KLASS);
+
+ if (strstr (klass, "Visualization")) {
+ vis = g_new0 (GstPlayerVisualization, 1);
+
+ vis->name = g_strdup (gst_plugin_feature_get_name (feature));
+ vis->description =
+ g_strdup (gst_element_factory_get_metadata (GST_ELEMENT_FACTORY
+ (feature), GST_ELEMENT_METADATA_DESCRIPTION));
+ g_queue_push_tail (&vis_list, vis);
+ }
+ }
+ gst_plugin_feature_list_free (features);
+
+ vis_cookie = cookie;
+
+ g_mutex_unlock (&vis_lock);
+}
+
+/**
+ * gst_player_visualizations_get:
+ *
+ * Returns: (transfer full) (array zero-terminated=1) (element-type GstPlayerVisualization):
+ * a %NULL terminated array containing all available
+ * visualizations. Use gst_player_visualizations_free() after
+ * usage.
+ */
+GstPlayerVisualization **
+gst_player_visualizations_get (void)
+{
+ gint i = 0;
+ GList *l;
+ GstPlayerVisualization **ret;
+
+ gst_player_update_visualization_list ();
+
+ g_mutex_lock (&vis_lock);
+ ret = g_new0 (GstPlayerVisualization *, g_queue_get_length (&vis_list) + 1);
+ for (l = vis_list.head; l; l = l->next)
+ ret[i++] = gst_player_visualization_copy (l->data);
+ g_mutex_unlock (&vis_lock);
+
+ return ret;
+}