/* GStreamer * Copyright (C) 1999,2000 Erik Walthinsen * 2000 Wim Taymans * 2004 Thomas Vander Stichele * * 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 #include "gst/gst-i18n-app.h" #include #include #include #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; }