blob: 8f40118e88e4b4c6cbab429b7b856b890c40dcb5 [file] [log] [blame]
/* 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 (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 (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;
}