2005-01-05 David Schleef <ds@schleef.org>
+ * testsuite/registry/Makefile.am:
+ * testsuite/registry/gst-print-formats.c:
+ (print_pad_templates_info), (print_element_list),
+ (print_typefind_list), (list_sort_func), (get_typefind_mime_list),
+ (g_list_uniqify), (get_pad_templates_info),
+ (get_element_mime_list), (print_mime_list), (main): A little
+ program that looks through the registry to find elements of
+ a given type. Not particularly interesting as a test, except
+ that there's no other test covering the same area.
+
+2005-01-05 David Schleef <ds@schleef.org>
+
* tools/gst-launch.c: (idle_func), (fault_handler_sighandler),
(fault_handler_sigaction), (fault_spin),
(sigint_handler_sighandler), (play_handler), (main): Fix deadlocks
--- /dev/null
+include ../Rules
+
+tests_pass = gst-print-formats
+tests_fail =
+tests_ignore =
+
+
--- /dev/null
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ * 2004 Thomas Vander Stichele <thomas@apestaart.org>
+ *
+ * gst-inspect.c: tool to inspect the GStreamer registry
+ *
+ * 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., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <gst/gst.h>
+
+#include "gst/gst-i18n-app.h"
+
+#include <string.h>
+#include <locale.h>
+#include <glib/gprintf.h>
+
+#define static
+
+static void
+print_pad_templates_info (GstElement * element, GstElementFactory * factory,
+ GstPadDirection dir)
+{
+ GstElementClass *gstelement_class;
+ const GList *pads;
+ GstPadTemplate *padtemplate;
+
+ if (!factory->numpadtemplates) {
+ return;
+ }
+
+ gstelement_class = GST_ELEMENT_CLASS (G_OBJECT_GET_CLASS (element));
+
+ pads = factory->padtemplates;
+ while (pads) {
+ padtemplate = (GstPadTemplate *) (pads->data);
+ pads = g_list_next (pads);
+
+ if (padtemplate->direction == dir) {
+ if (padtemplate->caps) {
+ GstStructure *structure;
+ int i;
+
+ for (i = 0; i < gst_caps_get_size (padtemplate->caps); i++) {
+ structure = gst_caps_get_structure (padtemplate->caps, i);
+ g_print (" %s\n", gst_structure_get_name (structure));
+ }
+ }
+ }
+ }
+}
+
+static void
+print_element_list (const char *klass, GstPadDirection dir)
+{
+ GList *plugins;
+
+ g_print ("Elements in %s:\n", klass);
+ for (plugins = gst_registry_pool_plugin_list (); plugins;
+ plugins = g_list_next (plugins)) {
+ GList *features;
+ GstPlugin *plugin;
+
+ plugin = (GstPlugin *) (plugins->data);
+
+ features = gst_plugin_get_feature_list (plugin);
+ while (features) {
+ GstPluginFeature *feature;
+
+ feature = GST_PLUGIN_FEATURE (features->data);
+
+ if (GST_IS_ELEMENT_FACTORY (feature)) {
+ GstElementFactory *factory;
+ GstElement *element;
+
+ factory = GST_ELEMENT_FACTORY (feature);
+ if (strncmp (factory->details.klass, klass, strlen (klass)) == 0) {
+ g_print (" %s: %s (%d)\n", GST_PLUGIN_FEATURE_NAME (factory),
+ factory->details.longname, gst_plugin_feature_get_rank (feature));
+ element = gst_element_factory_create (factory, NULL);
+ print_pad_templates_info (element, factory, dir);
+ gst_object_unref (GST_OBJECT (element));
+ }
+ }
+
+ features = g_list_next (features);
+ }
+ }
+ g_print ("\n");
+}
+
+static void
+print_typefind_list (void)
+{
+ GList *plugins;
+
+ g_print ("Typefind list:\n");
+ for (plugins = gst_registry_pool_plugin_list (); plugins;
+ plugins = g_list_next (plugins)) {
+ GList *features;
+ GstPlugin *plugin;
+
+ plugin = (GstPlugin *) (plugins->data);
+
+ features = gst_plugin_get_feature_list (plugin);
+ while (features) {
+ GstPluginFeature *feature;
+
+ feature = GST_PLUGIN_FEATURE (features->data);
+
+ if (GST_IS_TYPE_FIND_FACTORY (feature)) {
+ GstTypeFindFactory *factory;
+ char *s;
+
+ gst_plugin_load_file (plugin->filename, NULL);
+
+ factory = GST_TYPE_FIND_FACTORY (feature);
+ g_print (" %s: (%d)\n", GST_PLUGIN_FEATURE_NAME (factory),
+ gst_plugin_feature_get_rank (feature));
+ s = gst_caps_to_string (gst_type_find_factory_get_caps (factory));
+ g_print (" %s\n", s);
+ g_free (s);
+ }
+
+ features = g_list_next (features);
+ }
+ }
+ g_print ("\n");
+}
+
+static int
+list_sort_func (gconstpointer a, gconstpointer b)
+{
+ return strcmp ((const char *) a, (const char *) b);
+}
+
+static GList *
+get_typefind_mime_list (void)
+{
+ GList *plugins;
+ GList *mime_list = NULL;
+
+ for (plugins = gst_registry_pool_plugin_list (); plugins;
+ plugins = g_list_next (plugins)) {
+ GList *features;
+ GstPlugin *plugin;
+
+ plugin = (GstPlugin *) (plugins->data);
+
+ features = gst_plugin_get_feature_list (plugin);
+ while (features) {
+ GstPluginFeature *feature;
+
+ feature = GST_PLUGIN_FEATURE (features->data);
+
+ if (GST_IS_TYPE_FIND_FACTORY (feature)) {
+ GstTypeFindFactory *factory;
+ char *s;
+ int i;
+ const GstCaps *caps;
+
+ factory = GST_TYPE_FIND_FACTORY (feature);
+ caps = gst_type_find_factory_get_caps (factory);
+
+ if (gst_plugin_feature_get_rank (feature) > 0 && caps != NULL) {
+ for (i = 0; i < gst_caps_get_size (caps); i++) {
+ const GstStructure *structure = gst_caps_get_structure (caps, i);
+
+ s = g_strdup (gst_structure_get_name (structure));
+ mime_list = g_list_prepend (mime_list, s);
+ }
+ }
+ }
+
+ features = g_list_next (features);
+ }
+ }
+
+ return mime_list;
+}
+
+GList *
+g_list_uniqify (GList * list)
+{
+ GList *item;
+
+ for (item = g_list_first (list); item; item = g_list_next (item)) {
+ GList *next_item = g_list_next (item);
+
+ while (next_item && strcmp (item->data, next_item->data) == 0) {
+ g_free (next_item->data);
+ list = g_list_delete_link (list, next_item);
+ next_item = g_list_next (item);
+ }
+ }
+
+ return list;
+}
+
+static GList *
+get_pad_templates_info (GstElement * element, GstElementFactory * factory,
+ GstPadDirection dir)
+{
+ GstElementClass *gstelement_class;
+ const GList *pads;
+ GstPadTemplate *padtemplate;
+ GList *mime_list = NULL;
+
+ if (!factory->numpadtemplates) {
+ return NULL;
+ }
+
+ gstelement_class = GST_ELEMENT_CLASS (G_OBJECT_GET_CLASS (element));
+
+ pads = factory->padtemplates;
+ while (pads) {
+ padtemplate = (GstPadTemplate *) (pads->data);
+ pads = g_list_next (pads);
+
+ if (padtemplate->direction == dir) {
+ if (padtemplate->caps) {
+ GstStructure *structure;
+ int i;
+
+ for (i = 0; i < gst_caps_get_size (padtemplate->caps); i++) {
+ structure = gst_caps_get_structure (padtemplate->caps, i);
+ mime_list = g_list_prepend (mime_list,
+ g_strdup (gst_structure_get_name (structure)));
+ }
+ }
+ }
+ }
+ return mime_list;
+}
+
+static GList *
+get_element_mime_list (const char *klass, GstPadDirection dir)
+{
+ GList *mime_list = NULL;
+ GList *plugins;
+
+ for (plugins = gst_registry_pool_plugin_list (); plugins;
+ plugins = g_list_next (plugins)) {
+ GList *features;
+ GstPlugin *plugin;
+
+ plugin = (GstPlugin *) (plugins->data);
+
+ features = gst_plugin_get_feature_list (plugin);
+ while (features) {
+ GstPluginFeature *feature;
+
+ feature = GST_PLUGIN_FEATURE (features->data);
+
+ if (GST_IS_ELEMENT_FACTORY (feature)) {
+ GstElementFactory *factory;
+ GstElement *element;
+
+ factory = GST_ELEMENT_FACTORY (feature);
+ if (strncmp (factory->details.klass, klass, strlen (klass)) == 0) {
+ if (gst_plugin_feature_get_rank (feature) > 0) {
+ GList *list;
+
+ element = gst_element_factory_create (factory, NULL);
+ list = get_pad_templates_info (element, factory, dir);
+ mime_list = g_list_concat (mime_list, list);
+ gst_object_unref (GST_OBJECT (element));
+ }
+ }
+ }
+
+ features = g_list_next (features);
+ }
+ }
+
+ return mime_list;
+}
+
+static void
+print_mime_list (void)
+{
+ GList *list;
+ GList *typefind_list;
+ GList *item;
+ GList *item2;
+
+ typefind_list = get_typefind_mime_list ();
+ typefind_list = g_list_sort (typefind_list, list_sort_func);
+ typefind_list = g_list_uniqify (typefind_list);
+
+ list = get_element_mime_list ("Codec/Demuxer", GST_PAD_SINK);
+ list = g_list_concat (list, get_element_mime_list ("Codec/Decoder",
+ GST_PAD_SINK));
+ list = g_list_sort (list, list_sort_func);
+ list = g_list_uniqify (list);
+
+ g_print ("MIME media type list:\n");
+ for (item = g_list_first (list); item; item = g_list_next (item)) {
+ for (item2 = g_list_first (typefind_list); item2;
+ item2 = g_list_next (item2)) {
+ if (strcmp ((char *) item->data, (char *) item2->data) == 0) {
+ g_print (" %s\n", (char *) item->data);
+ }
+ }
+ }
+}
+
+
+int
+main (int argc, char *argv[])
+{
+
+#ifdef GETTEXT_PACKAGE
+ bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
+ bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
+ textdomain (GETTEXT_PACKAGE);
+#endif
+
+ gst_init (&argc, &argv);
+
+ print_element_list ("Codec/Demuxer", GST_PAD_SINK);
+ print_element_list ("Codec/Decoder", GST_PAD_SINK);
+ print_element_list ("Codec/Muxer", GST_PAD_SRC);
+ print_element_list ("Codec/Encoder", GST_PAD_SRC);
+ print_typefind_list ();
+ print_mime_list ();
+
+ return 0;
+}
--- /dev/null
+include ../Rules
+
+tests_pass = gst-print-formats
+tests_fail =
+tests_ignore =
+
+
--- /dev/null
+/* GStreamer
+ * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
+ * 2000 Wim Taymans <wtay@chello.be>
+ * 2004 Thomas Vander Stichele <thomas@apestaart.org>
+ *
+ * gst-inspect.c: tool to inspect the GStreamer registry
+ *
+ * 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., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <gst/gst.h>
+
+#include "gst/gst-i18n-app.h"
+
+#include <string.h>
+#include <locale.h>
+#include <glib/gprintf.h>
+
+#define static
+
+static void
+print_pad_templates_info (GstElement * element, GstElementFactory * factory,
+ GstPadDirection dir)
+{
+ GstElementClass *gstelement_class;
+ const GList *pads;
+ GstPadTemplate *padtemplate;
+
+ if (!factory->numpadtemplates) {
+ return;
+ }
+
+ gstelement_class = GST_ELEMENT_CLASS (G_OBJECT_GET_CLASS (element));
+
+ pads = factory->padtemplates;
+ while (pads) {
+ padtemplate = (GstPadTemplate *) (pads->data);
+ pads = g_list_next (pads);
+
+ if (padtemplate->direction == dir) {
+ if (padtemplate->caps) {
+ GstStructure *structure;
+ int i;
+
+ for (i = 0; i < gst_caps_get_size (padtemplate->caps); i++) {
+ structure = gst_caps_get_structure (padtemplate->caps, i);
+ g_print (" %s\n", gst_structure_get_name (structure));
+ }
+ }
+ }
+ }
+}
+
+static void
+print_element_list (const char *klass, GstPadDirection dir)
+{
+ GList *plugins;
+
+ g_print ("Elements in %s:\n", klass);
+ for (plugins = gst_registry_pool_plugin_list (); plugins;
+ plugins = g_list_next (plugins)) {
+ GList *features;
+ GstPlugin *plugin;
+
+ plugin = (GstPlugin *) (plugins->data);
+
+ features = gst_plugin_get_feature_list (plugin);
+ while (features) {
+ GstPluginFeature *feature;
+
+ feature = GST_PLUGIN_FEATURE (features->data);
+
+ if (GST_IS_ELEMENT_FACTORY (feature)) {
+ GstElementFactory *factory;
+ GstElement *element;
+
+ factory = GST_ELEMENT_FACTORY (feature);
+ if (strncmp (factory->details.klass, klass, strlen (klass)) == 0) {
+ g_print (" %s: %s (%d)\n", GST_PLUGIN_FEATURE_NAME (factory),
+ factory->details.longname, gst_plugin_feature_get_rank (feature));
+ element = gst_element_factory_create (factory, NULL);
+ print_pad_templates_info (element, factory, dir);
+ gst_object_unref (GST_OBJECT (element));
+ }
+ }
+
+ features = g_list_next (features);
+ }
+ }
+ g_print ("\n");
+}
+
+static void
+print_typefind_list (void)
+{
+ GList *plugins;
+
+ g_print ("Typefind list:\n");
+ for (plugins = gst_registry_pool_plugin_list (); plugins;
+ plugins = g_list_next (plugins)) {
+ GList *features;
+ GstPlugin *plugin;
+
+ plugin = (GstPlugin *) (plugins->data);
+
+ features = gst_plugin_get_feature_list (plugin);
+ while (features) {
+ GstPluginFeature *feature;
+
+ feature = GST_PLUGIN_FEATURE (features->data);
+
+ if (GST_IS_TYPE_FIND_FACTORY (feature)) {
+ GstTypeFindFactory *factory;
+ char *s;
+
+ gst_plugin_load_file (plugin->filename, NULL);
+
+ factory = GST_TYPE_FIND_FACTORY (feature);
+ g_print (" %s: (%d)\n", GST_PLUGIN_FEATURE_NAME (factory),
+ gst_plugin_feature_get_rank (feature));
+ s = gst_caps_to_string (gst_type_find_factory_get_caps (factory));
+ g_print (" %s\n", s);
+ g_free (s);
+ }
+
+ features = g_list_next (features);
+ }
+ }
+ g_print ("\n");
+}
+
+static int
+list_sort_func (gconstpointer a, gconstpointer b)
+{
+ return strcmp ((const char *) a, (const char *) b);
+}
+
+static GList *
+get_typefind_mime_list (void)
+{
+ GList *plugins;
+ GList *mime_list = NULL;
+
+ for (plugins = gst_registry_pool_plugin_list (); plugins;
+ plugins = g_list_next (plugins)) {
+ GList *features;
+ GstPlugin *plugin;
+
+ plugin = (GstPlugin *) (plugins->data);
+
+ features = gst_plugin_get_feature_list (plugin);
+ while (features) {
+ GstPluginFeature *feature;
+
+ feature = GST_PLUGIN_FEATURE (features->data);
+
+ if (GST_IS_TYPE_FIND_FACTORY (feature)) {
+ GstTypeFindFactory *factory;
+ char *s;
+ int i;
+ const GstCaps *caps;
+
+ factory = GST_TYPE_FIND_FACTORY (feature);
+ caps = gst_type_find_factory_get_caps (factory);
+
+ if (gst_plugin_feature_get_rank (feature) > 0 && caps != NULL) {
+ for (i = 0; i < gst_caps_get_size (caps); i++) {
+ const GstStructure *structure = gst_caps_get_structure (caps, i);
+
+ s = g_strdup (gst_structure_get_name (structure));
+ mime_list = g_list_prepend (mime_list, s);
+ }
+ }
+ }
+
+ features = g_list_next (features);
+ }
+ }
+
+ return mime_list;
+}
+
+GList *
+g_list_uniqify (GList * list)
+{
+ GList *item;
+
+ for (item = g_list_first (list); item; item = g_list_next (item)) {
+ GList *next_item = g_list_next (item);
+
+ while (next_item && strcmp (item->data, next_item->data) == 0) {
+ g_free (next_item->data);
+ list = g_list_delete_link (list, next_item);
+ next_item = g_list_next (item);
+ }
+ }
+
+ return list;
+}
+
+static GList *
+get_pad_templates_info (GstElement * element, GstElementFactory * factory,
+ GstPadDirection dir)
+{
+ GstElementClass *gstelement_class;
+ const GList *pads;
+ GstPadTemplate *padtemplate;
+ GList *mime_list = NULL;
+
+ if (!factory->numpadtemplates) {
+ return NULL;
+ }
+
+ gstelement_class = GST_ELEMENT_CLASS (G_OBJECT_GET_CLASS (element));
+
+ pads = factory->padtemplates;
+ while (pads) {
+ padtemplate = (GstPadTemplate *) (pads->data);
+ pads = g_list_next (pads);
+
+ if (padtemplate->direction == dir) {
+ if (padtemplate->caps) {
+ GstStructure *structure;
+ int i;
+
+ for (i = 0; i < gst_caps_get_size (padtemplate->caps); i++) {
+ structure = gst_caps_get_structure (padtemplate->caps, i);
+ mime_list = g_list_prepend (mime_list,
+ g_strdup (gst_structure_get_name (structure)));
+ }
+ }
+ }
+ }
+ return mime_list;
+}
+
+static GList *
+get_element_mime_list (const char *klass, GstPadDirection dir)
+{
+ GList *mime_list = NULL;
+ GList *plugins;
+
+ for (plugins = gst_registry_pool_plugin_list (); plugins;
+ plugins = g_list_next (plugins)) {
+ GList *features;
+ GstPlugin *plugin;
+
+ plugin = (GstPlugin *) (plugins->data);
+
+ features = gst_plugin_get_feature_list (plugin);
+ while (features) {
+ GstPluginFeature *feature;
+
+ feature = GST_PLUGIN_FEATURE (features->data);
+
+ if (GST_IS_ELEMENT_FACTORY (feature)) {
+ GstElementFactory *factory;
+ GstElement *element;
+
+ factory = GST_ELEMENT_FACTORY (feature);
+ if (strncmp (factory->details.klass, klass, strlen (klass)) == 0) {
+ if (gst_plugin_feature_get_rank (feature) > 0) {
+ GList *list;
+
+ element = gst_element_factory_create (factory, NULL);
+ list = get_pad_templates_info (element, factory, dir);
+ mime_list = g_list_concat (mime_list, list);
+ gst_object_unref (GST_OBJECT (element));
+ }
+ }
+ }
+
+ features = g_list_next (features);
+ }
+ }
+
+ return mime_list;
+}
+
+static void
+print_mime_list (void)
+{
+ GList *list;
+ GList *typefind_list;
+ GList *item;
+ GList *item2;
+
+ typefind_list = get_typefind_mime_list ();
+ typefind_list = g_list_sort (typefind_list, list_sort_func);
+ typefind_list = g_list_uniqify (typefind_list);
+
+ list = get_element_mime_list ("Codec/Demuxer", GST_PAD_SINK);
+ list = g_list_concat (list, get_element_mime_list ("Codec/Decoder",
+ GST_PAD_SINK));
+ list = g_list_sort (list, list_sort_func);
+ list = g_list_uniqify (list);
+
+ g_print ("MIME media type list:\n");
+ for (item = g_list_first (list); item; item = g_list_next (item)) {
+ for (item2 = g_list_first (typefind_list); item2;
+ item2 = g_list_next (item2)) {
+ if (strcmp ((char *) item->data, (char *) item2->data) == 0) {
+ g_print (" %s\n", (char *) item->data);
+ }
+ }
+ }
+}
+
+
+int
+main (int argc, char *argv[])
+{
+
+#ifdef GETTEXT_PACKAGE
+ bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
+ bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
+ textdomain (GETTEXT_PACKAGE);
+#endif
+
+ gst_init (&argc, &argv);
+
+ print_element_list ("Codec/Demuxer", GST_PAD_SINK);
+ print_element_list ("Codec/Decoder", GST_PAD_SINK);
+ print_element_list ("Codec/Muxer", GST_PAD_SRC);
+ print_element_list ("Codec/Encoder", GST_PAD_SRC);
+ print_typefind_list ();
+ print_mime_list ();
+
+ return 0;
+}