2 * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
3 * 2000 Wim Taymans <wtay@chello.be>
4 * 2004 Thomas Vander Stichele <thomas@apestaart.org>
6 * gst-inspect.c: tool to inspect the GStreamer registry
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Library General Public
10 * License as published by the Free Software Foundation; either
11 * version 2 of the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Library General Public License for more details.
18 * You should have received a copy of the GNU Library General Public
19 * License along with this library; if not, write to the
20 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21 * Boston, MA 02111-1307, USA.
29 #include <gst/controller/gstcontroller.h>
31 #include "gst/gst-i18n-app.h"
35 #include <glib/gprintf.h>
39 static int print_element_info (GstElementFactory * factory,
40 gboolean print_names);
43 n_print (const char *format, ...)
51 va_start (args, format);
52 retval = g_vprintf (format, args);
57 print_field (GQuark field, const GValue * value, gpointer pfx)
59 gchar *str = gst_value_serialize (value);
61 n_print ("%s %15s: %s\n", (gchar *) pfx, g_quark_to_string (field), str);
67 print_caps (const GstCaps * caps, const gchar * pfx)
71 g_return_if_fail (caps != NULL);
73 if (gst_caps_is_any (caps)) {
74 n_print ("%sANY\n", pfx);
77 if (gst_caps_is_empty (caps)) {
78 n_print ("%sEMPTY\n", pfx);
82 for (i = 0; i < gst_caps_get_size (caps); i++) {
83 GstStructure *structure = gst_caps_get_structure (caps, i);
85 n_print ("%s%s\n", pfx, gst_structure_get_name (structure));
86 gst_structure_foreach (structure, print_field, (gpointer) pfx);
92 print_formats (const GstFormat * formats)
94 while (formats && *formats) {
95 const GstFormatDefinition *definition;
97 definition = gst_format_get_details (*formats);
99 n_print ("\t\t(%d):\t%s (%s)\n", *formats,
100 definition->nick, definition->description);
102 n_print ("\t\t(%d):\tUnknown format\n", *formats);
110 print_query_types (const GstQueryType * types)
112 while (types && *types) {
113 const GstQueryTypeDefinition *definition;
115 definition = gst_query_type_get_details (*types);
117 n_print ("\t\t(%d):\t%s (%s)\n", *types,
118 definition->nick, definition->description);
120 n_print ("\t\t(%d):\tUnknown query format\n", *types);
126 #ifndef GST_DISABLE_ENUMTYPES
129 print_event_masks (const GstEventMask * masks)
134 GFlagsClass *flags_class = NULL;
136 event_type = gst_event_type_get_type ();
137 klass = (GEnumClass *) g_type_class_ref (event_type);
139 while (masks && masks->type) {
141 gint flags = 0, index = 0;
143 switch (masks->type) {
145 flags = masks->flags;
146 event_flags = gst_seek_type_get_type ();
147 flags_class = (GFlagsClass *) g_type_class_ref (event_flags);
153 value = g_enum_get_value (klass, masks->type);
154 g_print ("\t\t%s ", value->value_nick);
160 value = g_flags_get_first_value (flags_class, 1 << index);
163 g_print ("| %s ", value->value_nick);
178 print_event_masks (const GstEventMask * masks)
184 get_rank_name (gint rank)
189 case GST_RANK_MARGINAL:
191 case GST_RANK_SECONDARY:
193 case GST_RANK_PRIMARY:
201 print_factory_details_info (GstElementFactory * factory)
203 n_print ("Factory Details:\n");
204 n_print (" Long name:\t%s\n", factory->details.longname);
205 n_print (" Class:\t%s\n", factory->details.klass);
206 n_print (" Description:\t%s\n", factory->details.description);
207 n_print (" Author(s):\t%s\n", factory->details.author);
208 n_print (" Rank:\t\t%s (%d)\n",
209 get_rank_name (GST_PLUGIN_FEATURE (factory)->rank),
210 GST_PLUGIN_FEATURE (factory)->rank);
215 print_hierarchy (GType type, gint level, gint * maxlevel)
220 parent = g_type_parent (type);
222 *maxlevel = *maxlevel + 1;
226 print_hierarchy (parent, level, maxlevel);
231 for (i = 1; i < *maxlevel - level; i++)
233 if (*maxlevel - level)
236 g_print ("%s\n", g_type_name (type));
243 print_interfaces (GType type)
246 GType *iface, *ifaces = g_type_interfaces (type, &n_ifaces);
250 g_print ("Implemented Interfaces:\n");
253 g_print (" %s\n", g_type_name (*iface));
263 print_element_properties_info (GstElement * element)
265 GParamSpec **property_specs;
266 guint num_properties, i;
270 property_specs = g_object_class_list_properties
271 (G_OBJECT_GET_CLASS (element), &num_properties);
273 n_print ("Element Properties:\n");
275 for (i = 0; i < num_properties; i++) {
276 GValue value = { 0, };
277 GParamSpec *param = property_specs[i];
281 g_value_init (&value, param->value_type);
283 n_print (" %-20s: %s\n", g_param_spec_get_name (param),
284 g_param_spec_get_blurb (param));
287 n_print ("%-23.23s flags: ", "");
288 if (param->flags & G_PARAM_READABLE) {
289 g_object_get_property (G_OBJECT (element), param->name, &value);
291 g_print ((first_flag ? "readable" : ", readable"));
294 if (param->flags & G_PARAM_WRITABLE) {
295 g_print ((first_flag ? "writable" : ", writable"));
298 if (param->flags & GST_PARAM_CONTROLLABLE) {
299 g_print ((first_flag ? "controllable" : ", controllable"));
304 switch (G_VALUE_TYPE (&value)) {
307 GParamSpecString *pstring = G_PARAM_SPEC_STRING (param);
309 n_print ("%-23.23s String. ", "");
310 g_print ("Default: \"%s\" ", pstring->default_value);
312 const char *string_val = g_value_get_string (&value);
314 if (string_val == NULL)
315 g_print ("Current: \"\"");
317 g_print ("Current: \"%s\"", string_val);
323 GParamSpecBoolean *pboolean = G_PARAM_SPEC_BOOLEAN (param);
325 n_print ("%-23.23s Boolean. ", "");
326 g_print ("Default: %s ", (pboolean->default_value ? "true" : "false"));
328 g_print ("Current: %s",
329 (g_value_get_boolean (&value) ? "true" : "false"));
334 GParamSpecULong *pulong = G_PARAM_SPEC_ULONG (param);
336 n_print ("%-23.23s Unsigned Long. ", "");
337 g_print ("Range: %lu - %lu Default: %lu ",
338 pulong->minimum, pulong->maximum, pulong->default_value);
340 g_print ("Current: %lu", g_value_get_ulong (&value));
345 GParamSpecLong *plong = G_PARAM_SPEC_LONG (param);
347 n_print ("%-23.23s Long. ", "");
348 g_print ("Range: %ld - %ld Default: %ld ",
349 plong->minimum, plong->maximum, plong->default_value);
351 g_print ("Current: %ld", g_value_get_long (&value));
356 GParamSpecUInt *puint = G_PARAM_SPEC_UINT (param);
358 n_print ("%-23.23s Unsigned Integer. ", "");
359 g_print ("Range: %u - %u Default: %u ",
360 puint->minimum, puint->maximum, puint->default_value);
362 g_print ("Current: %u", g_value_get_uint (&value));
367 GParamSpecInt *pint = G_PARAM_SPEC_INT (param);
369 n_print ("%-23.23s Integer. ", "");
370 g_print ("Range: %d - %d Default: %d ",
371 pint->minimum, pint->maximum, pint->default_value);
373 g_print ("Current: %d", g_value_get_int (&value));
378 GParamSpecUInt64 *puint64 = G_PARAM_SPEC_UINT64 (param);
380 n_print ("%-23.23s Unsigned Integer64. ", "");
381 g_print ("Range: %" G_GUINT64_FORMAT " - %" G_GUINT64_FORMAT
382 " Default: %" G_GUINT64_FORMAT " ",
383 puint64->minimum, puint64->maximum, puint64->default_value);
385 g_print ("Current: %" G_GUINT64_FORMAT, g_value_get_uint64 (&value));
390 GParamSpecInt64 *pint64 = G_PARAM_SPEC_INT64 (param);
392 n_print ("%-23.23s Integer64. ", "");
393 g_print ("Range: %" G_GINT64_FORMAT " - %" G_GINT64_FORMAT
394 " Default: %" G_GINT64_FORMAT " ",
395 pint64->minimum, pint64->maximum, pint64->default_value);
397 g_print ("Current: %" G_GINT64_FORMAT, g_value_get_int64 (&value));
402 GParamSpecFloat *pfloat = G_PARAM_SPEC_FLOAT (param);
404 n_print ("%-23.23s Float. ", "");
405 g_print ("Range: %15.7g - %15.7g Default: %15.7g ",
406 pfloat->minimum, pfloat->maximum, pfloat->default_value);
408 g_print ("Current: %15.7g\n", g_value_get_float (&value));
413 GParamSpecDouble *pdouble = G_PARAM_SPEC_DOUBLE (param);
415 n_print ("%-23.23s Double. ", "");
416 g_print ("Range: %15.7g - %15.7g Default: %15.7g ",
417 pdouble->minimum, pdouble->maximum, pdouble->default_value);
419 g_print ("Current: %15.7g\n", g_value_get_double (&value));
423 if (param->value_type == GST_TYPE_URI) {
424 n_print ("%-23.23s URI", "");
426 if (param->value_type == GST_TYPE_CAPS) {
427 const GstCaps *caps = gst_value_get_caps (&value);
430 n_print ("%-23.23s Caps (NULL)", "");
432 print_caps (caps, " ");
434 } else if (G_IS_PARAM_SPEC_ENUM (param)) {
439 values = G_ENUM_CLASS (g_type_class_ref (param->value_type))->values;
440 enum_value = g_value_get_enum (&value);
442 while (values[j].value_name) {
443 if (values[j].value == enum_value)
448 n_print ("%-23.23s Enum \"%s\" Current: %d, \"%s\"", "",
449 g_type_name (G_VALUE_TYPE (&value)),
450 enum_value, values[j].value_nick);
453 while (values[j].value_name) {
454 g_print ("\n%s%-23.23s (%d): \t%s", "",
455 _name, values[j].value, values[j].value_nick);
458 /* g_type_class_unref (ec); */
459 } else if (G_IS_PARAM_SPEC_FLAGS (param)) {
463 GString *flags = NULL;
465 values = G_FLAGS_CLASS (g_type_class_ref (param->value_type))->values;
466 flags_value = g_value_get_flags (&value);
468 while (values[j].value_name) {
469 if (values[j].value & flags_value) {
471 g_string_append_printf (flags, " | %s", values[j].value_nick);
473 flags = g_string_new (values[j].value_nick);
479 n_print ("%-23.23s Flags \"%s\" Current: %d, \"%s\"", "",
480 g_type_name (G_VALUE_TYPE (&value)),
481 flags_value, (flags ? flags->str : "(none)"));
484 while (values[j].value_name) {
485 g_print ("\n%s%-23.23s (%d): \t%s", "",
486 _name, values[j].value, values[j].value_nick);
491 g_string_free (flags, TRUE);
492 } else if (G_IS_PARAM_SPEC_OBJECT (param)) {
493 n_print ("%-23.23s Object of type \"%s\"", "",
494 g_type_name (param->value_type));
496 n_print ("%-23.23s Unknown type %ld \"%s\"", "", param->value_type,
497 g_type_name (param->value_type));
502 g_print (" Write only\n");
506 if (num_properties == 0)
509 g_free (property_specs);
513 print_pad_templates_info (GstElement * element, GstElementFactory * factory)
515 GstElementClass *gstelement_class;
517 GstStaticPadTemplate *padtemplate;
519 n_print ("Pad Templates:\n");
520 if (!factory->numpadtemplates) {
525 gstelement_class = GST_ELEMENT_CLASS (G_OBJECT_GET_CLASS (element));
527 pads = factory->staticpadtemplates;
529 padtemplate = (GstStaticPadTemplate *) (pads->data);
530 pads = g_list_next (pads);
532 if (padtemplate->direction == GST_PAD_SRC)
533 n_print (" SRC template: '%s'\n", padtemplate->name_template);
534 else if (padtemplate->direction == GST_PAD_SINK)
535 n_print (" SINK template: '%s'\n", padtemplate->name_template);
537 n_print (" UNKNOWN!!! template: '%s'\n", padtemplate->name_template);
539 if (padtemplate->presence == GST_PAD_ALWAYS)
540 n_print (" Availability: Always\n");
541 else if (padtemplate->presence == GST_PAD_SOMETIMES)
542 n_print (" Availability: Sometimes\n");
543 else if (padtemplate->presence == GST_PAD_REQUEST) {
544 n_print (" Availability: On request\n");
545 n_print (" Has request_new_pad() function: %s\n",
546 GST_DEBUG_FUNCPTR_NAME (gstelement_class->request_new_pad));
548 n_print (" Availability: UNKNOWN!!!\n");
550 if (padtemplate->static_caps.string) {
551 n_print (" Capabilities:\n");
552 print_caps (gst_static_caps_get (&padtemplate->static_caps), " ");
560 print_element_flag_info (GstElement * element)
562 gboolean have_flags = FALSE;
565 n_print ("Element Flags:\n");
568 n_print (" no flags set\n");
570 if (GST_IS_BIN (element)) {
572 n_print ("Bin Flags:\n");
574 n_print (" no flags set\n");
579 print_implementation_info (GstElement * element)
581 GstObjectClass *gstobject_class;
582 GstElementClass *gstelement_class;
584 gstobject_class = GST_OBJECT_CLASS (G_OBJECT_GET_CLASS (element));
585 gstelement_class = GST_ELEMENT_CLASS (G_OBJECT_GET_CLASS (element));
588 n_print ("Element Implementation:\n");
590 n_print (" No loopfunc(), must be chain-based or not configured yet\n");
592 n_print (" Has change_state() function: %s\n",
593 GST_DEBUG_FUNCPTR_NAME (gstelement_class->change_state));
594 #ifndef GST_DISABLE_LOADSAVE
595 n_print (" Has custom save_thyself() function: %s\n",
596 GST_DEBUG_FUNCPTR_NAME (gstobject_class->save_thyself));
597 n_print (" Has custom restore_thyself() function: %s\n",
598 GST_DEBUG_FUNCPTR_NAME (gstobject_class->restore_thyself));
603 print_clocking_info (GstElement * element)
605 if (!gst_element_requires_clock (element) &&
606 !(gst_element_provides_clock (element) &&
607 gst_element_get_clock (element))) {
609 n_print ("Element has no clocking capabilities.");
614 n_print ("Clocking Interaction:\n");
615 if (gst_element_requires_clock (element)) {
616 n_print (" element requires a clock\n");
619 if (gst_element_provides_clock (element)) {
622 clock = gst_element_get_clock (element);
624 n_print (" element provides a clock: %s\n", GST_OBJECT_NAME (clock));
626 n_print (" element is supposed to provide a clock but returned NULL\n");
630 #ifndef GST_DISABLE_INDEX
632 print_index_info (GstElement * element)
634 if (gst_element_is_indexable (element)) {
636 n_print ("Indexing capabilities:\n");
637 n_print (" element can do indexing\n");
640 n_print ("Element has no indexing capabilities.\n");
645 print_index_info (GstElement * element)
651 print_pad_info (GstElement * element)
659 if (!element->numpads) {
664 pads = element->pads;
666 pad = GST_PAD (pads->data);
667 pads = g_list_next (pads);
671 if (gst_pad_get_direction (pad) == GST_PAD_SRC)
672 g_print (" SRC: '%s'", gst_pad_get_name (pad));
673 else if (gst_pad_get_direction (pad) == GST_PAD_SINK)
674 g_print (" SINK: '%s'", gst_pad_get_name (pad));
676 g_print (" UNKNOWN!!!: '%s'", gst_pad_get_name (pad));
680 n_print (" Implementation:\n");
682 n_print (" Has chainfunc(): %s\n",
683 GST_DEBUG_FUNCPTR_NAME (pad->chainfunc));
684 if (pad->getrangefunc)
685 n_print (" Has getrangefunc(): %s\n",
686 GST_DEBUG_FUNCPTR_NAME (pad->getrangefunc));
687 if (pad->eventfunc != gst_pad_event_default)
688 n_print (" Has custom eventfunc(): %s\n",
689 GST_DEBUG_FUNCPTR_NAME (pad->eventfunc));
690 if (pad->queryfunc != gst_pad_query_default)
691 n_print (" Has custom queryfunc(): %s\n",
692 GST_DEBUG_FUNCPTR_NAME (pad->queryfunc));
693 if (pad->querytypefunc != gst_pad_get_query_types_default) {
694 n_print (" Provides query types:\n");
695 print_query_types (gst_pad_get_query_types (pad));
698 if (pad->intlinkfunc != gst_pad_get_internal_links_default)
699 n_print (" Has custom intconnfunc(): %s\n",
700 GST_DEBUG_FUNCPTR_NAME (pad->intlinkfunc));
702 if (pad->bufferallocfunc)
703 n_print (" Has bufferallocfunc(): %s\n",
704 GST_DEBUG_FUNCPTR_NAME (pad->bufferallocfunc));
706 if (pad->padtemplate)
707 n_print (" Pad Template: '%s'\n", pad->padtemplate->name_template);
710 n_print (" Capabilities:\n");
711 print_caps (pad->caps, " ");
718 compare_signal_names (GSignalQuery * a, GSignalQuery * b)
720 return strcmp (a->signal_name, b->signal_name);
725 print_signal_info (GstElement * element)
727 /* Signals/Actions Block */
731 GSignalQuery *query = NULL;
733 GSList *found_signals, *l;
735 for (k = 0; k < 2; k++) {
736 found_signals = NULL;
737 for (type = G_OBJECT_TYPE (element); type; type = g_type_parent (type)) {
738 if (type == GST_TYPE_ELEMENT || type == GST_TYPE_OBJECT)
741 if (type == GST_TYPE_BIN && G_OBJECT_TYPE (element) != GST_TYPE_BIN)
744 signals = g_signal_list_ids (type, &nsignals);
745 for (i = 0; i < nsignals; i++) {
746 query = g_new0 (GSignalQuery, 1);
747 g_signal_query (signals[i], query);
749 if ((k == 0 && !(query->signal_flags & G_SIGNAL_ACTION)) ||
750 (k == 1 && (query->signal_flags & G_SIGNAL_ACTION)))
751 found_signals = g_slist_append (found_signals, query);
758 n_print ("Element Signals:\n");
760 n_print ("Element Actions:\n");
765 for (l = found_signals; l; l = l->next) {
769 query = (GSignalQuery *) l->data;
770 indent_len = strlen (query->signal_name) +
771 strlen (g_type_name (query->return_type)) + 24;
773 indent = g_new0 (gchar, indent_len + 1);
774 memset (indent, ' ', indent_len);
776 n_print (" \"%s\" : %s user_function (%s* object",
778 g_type_name (query->return_type), g_type_name (type));
780 for (j = 0; j < query->n_params; j++) {
781 if (G_TYPE_IS_FUNDAMENTAL (query->param_types[j])) {
782 g_print (",\n%s%s%s arg%d", _name, indent,
783 g_type_name (query->param_types[j]), j);
785 g_print (",\n%s%s%s* arg%d", _name, indent,
786 g_type_name (query->param_types[j]), j);
791 g_print (",\n%s%sgpointer user_data);\n", _name, indent);
799 g_slist_foreach (found_signals, (GFunc) g_free, NULL);
800 g_slist_free (found_signals);
806 print_children_info (GstElement * element)
810 if (!GST_IS_BIN (element))
813 children = (GList *) GST_BIN (element)->children;
816 g_print ("Children:\n");
820 n_print (" %s\n", GST_ELEMENT_NAME (GST_ELEMENT (children->data)));
821 children = g_list_next (children);
826 print_element_list (gboolean print_all)
828 GList *plugins, *orig_plugins;
830 orig_plugins = plugins = gst_default_registry_get_plugin_list ();
832 GList *features, *orig_features;
835 plugin = (GstPlugin *) (plugins->data);
836 plugins = g_list_next (plugins);
838 orig_features = features =
839 gst_registry_get_feature_list_by_plugin (gst_registry_get_default (),
842 GstPluginFeature *feature;
844 feature = GST_PLUGIN_FEATURE (features->data);
846 if (GST_IS_ELEMENT_FACTORY (feature)) {
847 GstElementFactory *factory;
849 factory = GST_ELEMENT_FACTORY (feature);
851 print_element_info (factory, TRUE);
853 g_print ("%s: %s: %s\n", plugin->desc.name,
854 GST_PLUGIN_FEATURE_NAME (factory), factory->details.longname);
856 #ifndef GST_DISABLE_INDEX
857 else if (GST_IS_INDEX_FACTORY (feature)) {
858 GstIndexFactory *factory;
860 factory = GST_INDEX_FACTORY (feature);
862 g_print ("%s: %s: %s\n", plugin->desc.name,
863 GST_PLUGIN_FEATURE_NAME (factory), factory->longdesc);
866 else if (GST_IS_TYPE_FIND_FACTORY (feature)) {
867 GstTypeFindFactory *factory;
869 factory = GST_TYPE_FIND_FACTORY (feature);
871 g_print ("%s: %s: ", plugin->desc.name,
872 gst_plugin_feature_get_name (feature));
873 if (factory->extensions) {
876 while (factory->extensions[i]) {
878 g_print ("%s%s", i > 0 ? ", " : "", factory->extensions[i]);
885 g_print ("no extensions\n");
889 n_print ("%s: %s (%s)\n", plugin->desc.name,
890 GST_PLUGIN_FEATURE_NAME (feature),
891 g_type_name (G_OBJECT_TYPE (feature)));
894 features = g_list_next (features);
897 gst_plugin_feature_list_free (orig_features);
900 gst_plugin_list_free (plugins);
904 print_plugin_info (GstPlugin * plugin)
906 n_print ("Plugin Details:\n");
907 n_print (" Name:\t\t\t%s\n", plugin->desc.name);
908 n_print (" Description:\t\t%s\n", plugin->desc.description);
909 n_print (" Filename:\t\t%s\n",
910 plugin->filename ? plugin->filename : "(null)");
911 n_print (" Version:\t\t%s\n", plugin->desc.version);
912 n_print (" License:\t\t%s\n", plugin->desc.license);
913 n_print (" Source module:\t%s\n", plugin->desc.source);
914 n_print (" Binary package:\t%s\n", plugin->desc.package);
915 n_print (" Origin URL:\t\t%s\n", plugin->desc.origin);
920 print_plugin_features (GstPlugin * plugin)
923 gint num_features = 0;
924 gint num_elements = 0;
926 gint num_indexes = 0;
930 gst_registry_get_feature_list_by_plugin (gst_registry_get_default (),
934 GstPluginFeature *feature;
936 feature = GST_PLUGIN_FEATURE (features->data);
938 if (GST_IS_ELEMENT_FACTORY (feature)) {
939 GstElementFactory *factory;
941 factory = GST_ELEMENT_FACTORY (feature);
942 n_print (" %s: %s\n", GST_PLUGIN_FEATURE_NAME (factory),
943 factory->details.longname);
946 #ifndef GST_DISABLE_INDEX
947 else if (GST_IS_INDEX_FACTORY (feature)) {
948 GstIndexFactory *factory;
950 factory = GST_INDEX_FACTORY (feature);
951 n_print (" %s: %s\n", GST_OBJECT_NAME (factory), factory->longdesc);
955 else if (GST_IS_TYPE_FIND_FACTORY (feature)) {
956 GstTypeFindFactory *factory;
958 factory = GST_TYPE_FIND_FACTORY (feature);
959 if (factory->extensions) {
962 g_print ("%s type: ", plugin->desc.name);
963 while (factory->extensions[i]) {
964 g_print ("%s%s", i > 0 ? ", " : "", factory->extensions[i]);
969 g_print ("%s type: N/A\n", plugin->desc.name);
973 n_print (" %s (%s)\n", gst_object_get_name (GST_OBJECT (feature)),
974 g_type_name (G_OBJECT_TYPE (feature)));
978 features = g_list_next (features);
981 n_print (" %d features:\n", num_features);
982 if (num_elements > 0)
983 n_print (" +-- %d elements\n", num_elements);
985 n_print (" +-- %d types\n", num_types);
987 n_print (" +-- %d indexes\n", num_indexes);
989 n_print (" +-- %d other objects\n", num_other);
995 print_element_features (const gchar * element_name)
997 GstPluginFeature *feature;
999 /* FIXME implement other pretty print function for these */
1000 #ifndef GST_DISABLE_INDEX
1001 feature = gst_default_registry_find_feature (element_name,
1002 GST_TYPE_INDEX_FACTORY);
1004 n_print ("%s: an index\n", element_name);
1008 feature = gst_default_registry_find_feature (element_name,
1009 GST_TYPE_TYPE_FIND_FACTORY);
1011 n_print ("%s: a typefind function\n", element_name);
1014 #ifndef GST_DISABLE_URI
1015 feature = gst_default_registry_find_feature (element_name,
1016 GST_TYPE_URI_HANDLER);
1018 n_print ("%s: an uri handler\n", element_name);
1027 print_element_info (GstElementFactory * factory, gboolean print_names)
1029 GstElement *element;
1033 GST_ELEMENT_FACTORY (gst_plugin_feature_load (GST_PLUGIN_FEATURE
1036 element = gst_element_factory_create (factory, NULL);
1038 g_print ("couldn't construct element for some reason\n");
1043 _name = g_strdup_printf ("%s: ", GST_PLUGIN_FEATURE (factory)->name);
1047 print_factory_details_info (factory);
1048 if (GST_PLUGIN_FEATURE (factory)->plugin_name) {
1051 plugin = gst_registry_find_plugin (gst_registry_get_default (),
1052 GST_PLUGIN_FEATURE (factory)->plugin_name);
1054 print_plugin_info (plugin);
1058 print_hierarchy (G_OBJECT_TYPE (element), 0, &maxlevel);
1059 print_interfaces (G_OBJECT_TYPE (element));
1061 print_pad_templates_info (element, factory);
1062 print_element_flag_info (element);
1063 print_implementation_info (element);
1064 print_clocking_info (element);
1065 print_index_info (element);
1066 print_pad_info (element);
1067 print_element_properties_info (element);
1068 print_signal_info (element);
1069 print_children_info (element);
1071 gst_object_unref (factory);
1080 main (int argc, char *argv[])
1082 gboolean print_all = FALSE;
1083 struct poptOption options[] = {
1084 {"print-all", 'a', POPT_ARG_NONE | POPT_ARGFLAG_STRIP, &print_all, 0,
1085 N_("Print all elements"), NULL},
1089 #ifdef GETTEXT_PACKAGE
1090 bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
1091 bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
1092 textdomain (GETTEXT_PACKAGE);
1095 gst_init_with_popt_table (&argc, &argv, options);
1097 if (print_all && argc > 2) {
1098 g_print ("-a requires no extra arguments\n");
1102 /* if no arguments, print out list of elements */
1103 if (argc == 1 || print_all) {
1104 print_element_list (print_all);
1105 /* else we try to get a factory */
1107 GstElementFactory *factory;
1109 const char *arg = argv[argc - 1];
1112 factory = gst_element_factory_find (arg);
1113 /* if there's a factory, print out the info */
1115 retval = print_element_info (factory, print_all);
1117 retval = print_element_features (arg);
1120 /* otherwise check if it's a plugin */
1122 plugin = gst_default_registry_find_plugin (arg);
1124 /* if there is such a plugin, print out info */
1126 print_plugin_info (plugin);
1127 print_plugin_features (plugin);
1129 g_print ("No such element or plugin '%s'\n", arg);