static void print_factory_details_info (GstElementFactory * factory) { gchar **keys, **k; GstRank rank; char s[20]; rank = gst_plugin_feature_get_rank (GST_PLUGIN_FEATURE (factory)); n_print ("Factory Details:\n"); n_print (" %-25s%s (%d)\n", "Rank", get_rank_name (s, rank), rank); keys = gst_element_factory_get_metadata_keys (factory); if (keys != NULL) { for (k = keys; *k != NULL; ++k) { const gchar *val; gchar *key = *k; val = gst_element_factory_get_metadata (factory, key); key[0] = g_ascii_toupper (key[0]); n_print (" %-25s%s\n", key, val); } g_strfreev (keys); } n_print ("\n"); }
static void print_implementation_info (GstElement * element) { n_print ("\n"); n_print ("Element Implementation:\n"); { GstElementClass *gstelement_class; gstelement_class = GST_ELEMENT_CLASS (G_OBJECT_GET_CLASS (element)); n_print (" Has change_state() function: %s\n", GST_DEBUG_FUNCPTR_NAME (gstelement_class->change_state)); } #ifndef GST_DISABLE_LOADSAVE { GstObjectClass *gstobject_class; gstobject_class = GST_OBJECT_CLASS (G_OBJECT_GET_CLASS (element)); n_print (" Has custom save_thyself() function: %s\n", GST_DEBUG_FUNCPTR_NAME (gstobject_class->save_thyself)); n_print (" Has custom restore_thyself() function: %s\n", GST_DEBUG_FUNCPTR_NAME (gstobject_class->restore_thyself)); } #endif }
static void print_caps (const GstCaps * caps, const gchar * pfx) { guint i; g_return_if_fail (caps != NULL); if (gst_caps_is_any (caps)) { n_print ("%sANY\n", pfx); return; } if (gst_caps_is_empty (caps)) { n_print ("%sEMPTY\n", pfx); return; } for (i = 0; i < gst_caps_get_size (caps); i++) { GstStructure *structure = gst_caps_get_structure (caps, i); GstCapsFeatures *features = gst_caps_get_features (caps, i); if (features && (gst_caps_features_is_any (features) || !gst_caps_features_is_equal (features, GST_CAPS_FEATURES_MEMORY_SYSTEM_MEMORY))) { gchar *features_string = gst_caps_features_to_string (features); n_print ("%s%s(%s)\n", pfx, gst_structure_get_name (structure), features_string); g_free (features_string); } else { n_print ("%s%s\n", pfx, gst_structure_get_name (structure)); } gst_structure_foreach (structure, print_field, (gpointer) pfx); } }
static void print_index_info (GstElement * element) { if (gst_element_is_indexable (element)) { n_print ("\n"); n_print ("Indexing capabilities:\n"); n_print (" element can do indexing\n"); } else { n_print ("\n"); n_print ("Element has no indexing capabilities.\n"); } }
static void print_implementation_info (GstElement * element) { GstElementClass *gstelement_class; gstelement_class = GST_ELEMENT_CLASS (G_OBJECT_GET_CLASS (element)); n_print ("\n"); n_print ("Element Implementation:\n"); n_print (" Has change_state() function: %s\n", GST_DEBUG_FUNCPTR_NAME (gstelement_class->change_state)); }
static void print_plugin_info (GstPlugin * plugin) { n_print ("Plugin Details:\n"); n_print (" Name:\t\t\t%s\n", plugin->desc.name); n_print (" Description:\t\t%s\n", plugin->desc.description); n_print (" Filename:\t\t%s\n", plugin->filename ? plugin->filename : "(null)"); n_print (" Version:\t\t%s\n", plugin->desc.version); n_print (" License:\t\t%s\n", plugin->desc.license); n_print (" Source module:\t%s\n", plugin->desc.source); n_print (" Binary package:\t%s\n", plugin->desc.package); n_print (" Origin URL:\t\t%s\n", plugin->desc.origin); n_print ("\n"); }
static void print_query_types (const GstQueryType * types) { while (types && *types) { const GstQueryTypeDefinition *definition; definition = gst_query_type_get_details (*types); if (definition) n_print ("\t\t(%d):\t%s (%s)\n", *types, definition->nick, definition->description); else n_print ("\t\t(%d):\tUnknown query format\n", *types); types++; } }
static void print_formats (const GstFormat * formats) { while (formats && *formats) { const GstFormatDefinition *definition; definition = gst_format_get_details (*formats); if (definition) n_print ("\t\t(%d):\t%s (%s)\n", *formats, definition->nick, definition->description); else n_print ("\t\t(%d):\tUnknown format\n", *formats); formats++; } }
static void print_hierarchy (GType type, gint level, gint * maxlevel) { GType parent; gint i; parent = g_type_parent (type); *maxlevel = *maxlevel + 1; level++; if (parent) print_hierarchy (parent, level, maxlevel); if (_name) g_print ("%s", _name); for (i = 1; i < *maxlevel - level; i++) g_print (" "); if (*maxlevel - level) g_print (" +----"); g_print ("%s\n", g_type_name (type)); if (level == 1) n_print ("\n"); }
static void print_clocking_info (GstElement * element) { if (!gst_element_requires_clock (element) && !(gst_element_provides_clock (element) && gst_element_get_clock (element))) { n_print ("\n"); n_print ("Element has no clocking capabilities."); return; } n_print ("\n"); n_print ("Clocking Interaction:\n"); if (gst_element_requires_clock (element)) { n_print (" element requires a clock\n"); } if (gst_element_provides_clock (element)) { GstClock *clock; clock = gst_element_get_clock (element); if (clock) n_print (" element provides a clock: %s\n", GST_OBJECT_NAME (clock)); else n_print (" element is supposed to provide a clock but returned NULL\n"); } }
static void print_clocking_info (GstElement * element) { gboolean requires_clock, provides_clock; requires_clock = GST_OBJECT_FLAG_IS_SET (element, GST_ELEMENT_FLAG_REQUIRE_CLOCK); provides_clock = GST_OBJECT_FLAG_IS_SET (element, GST_ELEMENT_FLAG_PROVIDE_CLOCK); if (!requires_clock && !provides_clock) { n_print ("\n"); n_print ("Element has no clocking capabilities.\n"); return; } n_print ("\n"); n_print ("Clocking Interaction:\n"); if (requires_clock) { n_print (" element requires a clock\n"); } if (provides_clock) { GstClock *clock; clock = gst_element_get_clock (element); if (clock) { n_print (" element provides a clock: %s\n", GST_OBJECT_NAME (clock)); gst_object_unref (clock); } else n_print (" element is supposed to provide a clock but returned NULL\n"); } }
static void print_uri_handler_info (GstElement * element) { if (GST_IS_URI_HANDLER (element)) { const gchar *const *uri_protocols; const gchar *uri_type; if (gst_uri_handler_get_uri_type (GST_URI_HANDLER (element)) == GST_URI_SRC) uri_type = "source"; else if (gst_uri_handler_get_uri_type (GST_URI_HANDLER (element)) == GST_URI_SINK) uri_type = "sink"; else uri_type = "unknown"; uri_protocols = gst_uri_handler_get_protocols (GST_URI_HANDLER (element)); n_print ("\n"); n_print ("URI handling capabilities:\n"); n_print (" Element can act as %s.\n", uri_type); if (uri_protocols && *uri_protocols) { n_print (" Supported URI protocols:\n"); for (; *uri_protocols != NULL; uri_protocols++) n_print (" %s\n", *uri_protocols); } else { n_print (" No supported URI protocols\n"); } } else { n_print ("Element has no URI handling capabilities.\n"); } }
static void print_preset_list (GstElement * element) { gchar **presets, **preset; if (!GST_IS_PRESET (element)) return; presets = gst_preset_get_preset_names (GST_PRESET (element)); if (presets && *presets) { n_print ("\n"); n_print ("Presets:\n"); for (preset = presets; *preset; preset++) { n_print (" \"%s\"\n", *preset); } g_strfreev (presets); } }
static gboolean print_field (GQuark field, const GValue * value, gpointer pfx) { gchar *str = gst_value_serialize (value); n_print ("%s %15s: %s\n", (gchar *) pfx, g_quark_to_string (field), str); g_free (str); return TRUE; }
static void print_children_info (GstElement * element) { GList *children; if (!GST_IS_BIN (element)) return; children = (GList *) GST_BIN (element)->children; if (children) { n_print ("\n"); n_print ("Children:\n"); } while (children) { n_print (" %s\n", GST_ELEMENT_NAME (GST_ELEMENT (children->data))); children = g_list_next (children); } }
static int print_element_features (const gchar * element_name) { GstPluginFeature *feature; /* FIXME implement other pretty print function for these */ feature = gst_default_registry_find_feature (element_name, GST_TYPE_INDEX_FACTORY); if (feature) { n_print ("%s: an index\n", element_name); return 0; } feature = gst_default_registry_find_feature (element_name, GST_TYPE_TYPE_FIND_FACTORY); if (feature) { n_print ("%s: a typefind function\n", element_name); return 0; } return -1; }
static int print_element_features (const gchar * element_name) { GstPluginFeature *feature; /* FIXME implement other pretty print function for these */ feature = gst_registry_find_feature (gst_registry_get (), element_name, GST_TYPE_TYPE_FIND_FACTORY); if (feature) { n_print ("%s: a typefind function\n", element_name); return 0; } feature = gst_registry_find_feature (gst_registry_get (), element_name, GST_TYPE_TRACER_FACTORY); if (feature) { n_print ("%s: a tracer module\n", element_name); return 0; } return -1; }
static gboolean print_factory_details_meta_data (GQuark field_id, const GValue * value, gpointer user_data) { gchar *val = g_strdup_value_contents (value); gchar *key = g_strdup (g_quark_to_string (field_id)); key[0] = g_ascii_toupper (key[0]); n_print (" %s:\t\t%s\n", key, val); g_free (val); g_free (key); return TRUE; }
static void print_caps (const GstCaps * caps, const gchar * pfx) { guint i; g_return_if_fail (caps != NULL); if (gst_caps_is_any (caps)) { n_print ("%sANY\n", pfx); return; } if (gst_caps_is_empty (caps)) { n_print ("%sEMPTY\n", pfx); return; } for (i = 0; i < gst_caps_get_size (caps); i++) { GstStructure *structure = gst_caps_get_structure (caps, i); n_print ("%s%s\n", pfx, gst_structure_get_name (structure)); gst_structure_foreach (structure, print_field, (gpointer) pfx); } }
static void print_factory_details_info (GstElementFactory * factory) { n_print ("Factory Details:\n"); n_print (" Long name:\t%s\n", factory->details.longname); n_print (" Class:\t%s\n", factory->details.klass); n_print (" Description:\t%s\n", factory->details.description); n_print (" Author(s):\t%s\n", factory->details.author); n_print (" Rank:\t\t%s (%d)\n", get_rank_name (GST_PLUGIN_FEATURE (factory)->rank), GST_PLUGIN_FEATURE (factory)->rank); n_print ("\n"); }
static void print_pad_info (GstElement * element) { const GList *pads; GstPad *pad; n_print ("\n"); n_print ("Pads:\n"); if (!element->numpads) { n_print (" none\n"); return; } pads = element->pads; while (pads) { gchar *name; GstCaps *caps; pad = GST_PAD (pads->data); pads = g_list_next (pads); name = gst_pad_get_name (pad); if (gst_pad_get_direction (pad) == GST_PAD_SRC) n_print (" SRC: '%s'\n", name); else if (gst_pad_get_direction (pad) == GST_PAD_SINK) n_print (" SINK: '%s'\n", name); else n_print (" UNKNOWN!!!: '%s'\n", name); g_free (name); if (pad->padtemplate) n_print (" Pad Template: '%s'\n", pad->padtemplate->name_template); caps = gst_pad_get_current_caps (pad); if (caps) { n_print (" Capabilities:\n"); print_caps (caps, " "); gst_caps_unref (caps); } } }
static void print_factory_details_info (GstElementFactory * factory) { char s[20]; n_print ("Factory Details:\n"); n_print (" Long name:\t%s\n", factory->details.longname); n_print (" Class:\t%s\n", factory->details.klass); n_print (" Description:\t%s\n", factory->details.description); n_print (" Author(s):\t%s\n", factory->details.author); n_print (" Rank:\t\t%s (%d)\n", get_rank_name (s, GST_PLUGIN_FEATURE (factory)->rank), GST_PLUGIN_FEATURE (factory)->rank); if (factory->meta_data != NULL) { gst_structure_foreach ((GstStructure *) factory->meta_data, print_factory_details_meta_data, NULL); } n_print ("\n"); }
static void print_element_flag_info (GstElement * element) { gboolean have_flags = FALSE; n_print ("\n"); n_print ("Element Flags:\n"); if (!have_flags) n_print (" no flags set\n"); if (GST_IS_BIN (element)) { n_print ("\n"); n_print ("Bin Flags:\n"); if (!have_flags) n_print (" no flags set\n"); } }
static void print_element_list (gboolean print_all) { int plugincount = 0, featurecount = 0, blacklistcount = 0; GList *plugins, *orig_plugins; orig_plugins = plugins = gst_registry_get_plugin_list (gst_registry_get ()); while (plugins) { GList *features, *orig_features; GstPlugin *plugin; plugin = (GstPlugin *) (plugins->data); plugins = g_list_next (plugins); plugincount++; if (GST_OBJECT_FLAG_IS_SET (plugin, GST_PLUGIN_FLAG_BLACKLISTED)) { blacklistcount++; continue; } orig_features = features = gst_registry_get_feature_list_by_plugin (gst_registry_get (), gst_plugin_get_name (plugin)); while (features) { GstPluginFeature *feature; if (G_UNLIKELY (features->data == NULL)) goto next; feature = GST_PLUGIN_FEATURE (features->data); featurecount++; if (GST_IS_ELEMENT_FACTORY (feature)) { GstElementFactory *factory; factory = GST_ELEMENT_FACTORY (feature); if (print_all) print_element_info (factory, TRUE); else g_print ("%s: %s: %s\n", gst_plugin_get_name (plugin), GST_OBJECT_NAME (factory), gst_element_factory_get_metadata (factory, GST_ELEMENT_METADATA_LONGNAME)); } else if (GST_IS_TYPE_FIND_FACTORY (feature)) { GstTypeFindFactory *factory; const gchar *const *extensions; factory = GST_TYPE_FIND_FACTORY (feature); if (!print_all) g_print ("%s: %s: ", gst_plugin_get_name (plugin), gst_plugin_feature_get_name (feature)); extensions = gst_type_find_factory_get_extensions (factory); if (extensions != NULL) { guint i = 0; while (extensions[i]) { if (!print_all) g_print ("%s%s", i > 0 ? ", " : "", extensions[i]); i++; } if (!print_all) g_print ("\n"); } else { if (!print_all) g_print ("no extensions\n"); } } else { if (!print_all) n_print ("%s: %s (%s)\n", gst_plugin_get_name (plugin), GST_OBJECT_NAME (feature), g_type_name (G_OBJECT_TYPE (feature))); } next: features = g_list_next (features); } gst_plugin_feature_list_free (orig_features); } gst_plugin_list_free (orig_plugins); g_print ("\n"); g_print (_("Total count: ")); g_print (ngettext ("%d plugin", "%d plugins", plugincount), plugincount); if (blacklistcount) { g_print (" ("); g_print (ngettext ("%d blacklist entry", "%d blacklist entries", blacklistcount), blacklistcount); g_print (" not shown)"); } g_print (", "); g_print (ngettext ("%d feature", "%d features", featurecount), featurecount); g_print ("\n"); }
static void print_element_list (gboolean print_all) { int plugincount = 0, featurecount = 0; GList *plugins, *orig_plugins; orig_plugins = plugins = gst_default_registry_get_plugin_list (); while (plugins) { GList *features, *orig_features; GstPlugin *plugin; plugin = (GstPlugin *) (plugins->data); plugins = g_list_next (plugins); plugincount++; orig_features = features = gst_registry_get_feature_list_by_plugin (gst_registry_get_default (), plugin->desc.name); while (features) { GstPluginFeature *feature; feature = GST_PLUGIN_FEATURE (features->data); featurecount++; if (GST_IS_ELEMENT_FACTORY (feature)) { GstElementFactory *factory; factory = GST_ELEMENT_FACTORY (feature); if (print_all) print_element_info (factory, TRUE); else g_print ("%s: %s: %s\n", plugin->desc.name, GST_PLUGIN_FEATURE_NAME (factory), gst_element_factory_get_longname (factory)); } else if (GST_IS_INDEX_FACTORY (feature)) { GstIndexFactory *factory; factory = GST_INDEX_FACTORY (feature); if (!print_all) g_print ("%s: %s: %s\n", plugin->desc.name, GST_PLUGIN_FEATURE_NAME (factory), factory->longdesc); } else if (GST_IS_TYPE_FIND_FACTORY (feature)) { GstTypeFindFactory *factory; factory = GST_TYPE_FIND_FACTORY (feature); if (!print_all) g_print ("%s: %s: ", plugin->desc.name, gst_plugin_feature_get_name (feature)); if (factory->extensions) { guint i = 0; while (factory->extensions[i]) { if (!print_all) g_print ("%s%s", i > 0 ? ", " : "", factory->extensions[i]); i++; } if (!print_all) g_print ("\n"); } else { if (!print_all) g_print ("no extensions\n"); } } else { if (!print_all) n_print ("%s: %s (%s)\n", plugin->desc.name, GST_PLUGIN_FEATURE_NAME (feature), g_type_name (G_OBJECT_TYPE (feature))); } features = g_list_next (features); } gst_plugin_feature_list_free (orig_features); } gst_plugin_list_free (orig_plugins); g_print ("\n"); g_print (_("Total count: ")); g_print (ngettext ("%d plugin", "%d plugins", plugincount), plugincount); g_print (", "); g_print (ngettext ("%d feature", "%d features", featurecount), featurecount); g_print ("\n"); }
static void print_plugin_info (GstPlugin * plugin) { const gchar *release_date = gst_plugin_get_release_date_string (plugin); const gchar *filename = gst_plugin_get_filename (plugin); n_print ("Plugin Details:\n"); n_print (" %-25s%s\n", "Name", gst_plugin_get_name (plugin)); n_print (" %-25s%s\n", "Description", gst_plugin_get_description (plugin)); n_print (" %-25s%s\n", "Filename", (filename != NULL) ? filename : "(null)"); n_print (" %-25s%s\n", "Version", gst_plugin_get_version (plugin)); n_print (" %-25s%s\n", "License", gst_plugin_get_license (plugin)); n_print (" %-25s%s\n", "Source module", gst_plugin_get_source (plugin)); if (release_date != NULL) { const gchar *tz = "(UTC)"; gchar *str, *sep; /* may be: YYYY-MM-DD or YYYY-MM-DDTHH:MMZ */ /* YYYY-MM-DDTHH:MMZ => YYYY-MM-DD HH:MM (UTC) */ str = g_strdup (release_date); sep = strstr (str, "T"); if (sep != NULL) { *sep = ' '; sep = strstr (sep + 1, "Z"); if (sep != NULL) *sep = ' '; } else { tz = ""; } n_print (" %-25s%s%s\n", "Source release date", str, tz); g_free (str); } n_print (" %-25s%s\n", "Binary package", gst_plugin_get_package (plugin)); n_print (" %-25s%s\n", "Origin URL", gst_plugin_get_origin (plugin)); n_print ("\n"); }
static void print_signal_info (GstElement * element) { /* Signals/Actions Block */ guint *signals; guint nsignals; gint i = 0, j, k; GSignalQuery *query = NULL; GType type; GSList *found_signals, *l; for (k = 0; k < 2; k++) { found_signals = NULL; /* For elements that have sometimes pads, also list a few useful GstElement * signals. Put these first, so element-specific ones come later. */ if (k == 0 && has_sometimes_template (element)) { query = g_new0 (GSignalQuery, 1); g_signal_query (g_signal_lookup ("pad-added", GST_TYPE_ELEMENT), query); found_signals = g_slist_append (found_signals, query); query = g_new0 (GSignalQuery, 1); g_signal_query (g_signal_lookup ("pad-removed", GST_TYPE_ELEMENT), query); found_signals = g_slist_append (found_signals, query); query = g_new0 (GSignalQuery, 1); g_signal_query (g_signal_lookup ("no-more-pads", GST_TYPE_ELEMENT), query); found_signals = g_slist_append (found_signals, query); } for (type = G_OBJECT_TYPE (element); type; type = g_type_parent (type)) { if (type == GST_TYPE_ELEMENT || type == GST_TYPE_OBJECT) break; if (type == GST_TYPE_BIN && G_OBJECT_TYPE (element) != GST_TYPE_BIN) continue; signals = g_signal_list_ids (type, &nsignals); for (i = 0; i < nsignals; i++) { query = g_new0 (GSignalQuery, 1); g_signal_query (signals[i], query); if ((k == 0 && !(query->signal_flags & G_SIGNAL_ACTION)) || (k == 1 && (query->signal_flags & G_SIGNAL_ACTION))) found_signals = g_slist_append (found_signals, query); else g_free (query); } g_free (signals); signals = NULL; } if (found_signals) { n_print ("\n"); if (k == 0) n_print ("Element Signals:\n"); else n_print ("Element Actions:\n"); } else { continue; } for (l = found_signals; l; l = l->next) { gchar *indent; const gchar *pmark; int indent_len; query = (GSignalQuery *) l->data; indent_len = strlen (query->signal_name) + strlen (g_type_name (query->return_type)) + 24; if (query->return_type == G_TYPE_POINTER) { pmark = ""; } else if (G_TYPE_FUNDAMENTAL (query->return_type) == G_TYPE_POINTER || G_TYPE_IS_BOXED (query->return_type) || G_TYPE_IS_OBJECT (query->return_type)) { pmark = "* "; indent_len += 2; } else { pmark = ""; } indent = g_new0 (gchar, indent_len + 1); memset (indent, ' ', indent_len); n_print (" \"%s\" : %s %suser_function (%s* object", query->signal_name, g_type_name (query->return_type), pmark, g_type_name (type)); for (j = 0; j < query->n_params; j++) { g_print (",\n"); if (G_TYPE_IS_FUNDAMENTAL (query->param_types[j])) { n_print ("%s%s arg%d", indent, g_type_name (query->param_types[j]), j); } else if (G_TYPE_IS_ENUM (query->param_types[j])) { n_print ("%s%s arg%d", indent, g_type_name (query->param_types[j]), j); } else { n_print ("%s%s* arg%d", indent, g_type_name (query->param_types[j]), j); } } if (k == 0) { g_print (",\n"); n_print ("%sgpointer user_data);\n", indent); } else g_print (");\n"); g_free (indent); } if (found_signals) { g_slist_foreach (found_signals, (GFunc) g_free, NULL); g_slist_free (found_signals); } } }
static void print_plugin_features (GstPlugin * plugin) { GList *features, *origlist; gint num_features = 0; gint num_elements = 0; gint num_tracers = 0; gint num_typefinders = 0; gint num_devproviders = 0; gint num_other = 0; origlist = features = gst_registry_get_feature_list_by_plugin (gst_registry_get (), gst_plugin_get_name (plugin)); while (features) { GstPluginFeature *feature; feature = GST_PLUGIN_FEATURE (features->data); if (GST_IS_ELEMENT_FACTORY (feature)) { GstElementFactory *factory; factory = GST_ELEMENT_FACTORY (feature); n_print (" %s: %s\n", GST_OBJECT_NAME (factory), gst_element_factory_get_metadata (factory, GST_ELEMENT_METADATA_LONGNAME)); num_elements++; } else if (GST_IS_TYPE_FIND_FACTORY (feature)) { GstTypeFindFactory *factory; const gchar *const *extensions; factory = GST_TYPE_FIND_FACTORY (feature); extensions = gst_type_find_factory_get_extensions (factory); if (extensions) { guint i = 0; g_print (" %s: %s: ", gst_plugin_get_name (plugin), gst_plugin_feature_get_name (feature)); while (extensions[i]) { g_print ("%s%s", i > 0 ? ", " : "", extensions[i]); i++; } g_print ("\n"); } else g_print (" %s: %s: no extensions\n", gst_plugin_get_name (plugin), gst_plugin_feature_get_name (feature)); num_typefinders++; } else if (GST_IS_DEVICE_PROVIDER_FACTORY (feature)) { GstDeviceProviderFactory *factory; factory = GST_DEVICE_PROVIDER_FACTORY (feature); n_print (" %s: %s\n", GST_OBJECT_NAME (factory), gst_device_provider_factory_get_metadata (factory, GST_ELEMENT_METADATA_LONGNAME)); num_devproviders++; } else if (GST_IS_TRACER_FACTORY (feature)) { n_print (" %s (%s)\n", gst_object_get_name (GST_OBJECT (feature)), g_type_name (G_OBJECT_TYPE (feature))); num_tracers++; } else if (feature) { n_print (" %s (%s)\n", gst_object_get_name (GST_OBJECT (feature)), g_type_name (G_OBJECT_TYPE (feature))); num_other++; } num_features++; features = g_list_next (features); } gst_plugin_feature_list_free (origlist); n_print ("\n"); n_print (" %d features:\n", num_features); if (num_elements > 0) n_print (" +-- %d elements\n", num_elements); if (num_typefinders > 0) n_print (" +-- %d typefinders\n", num_typefinders); if (num_devproviders > 0) n_print (" +-- %d device providers\n", num_devproviders); if (num_tracers > 0) n_print (" +-- %d tracers\n", num_tracers); if (num_other > 0) n_print (" +-- %d other objects\n", num_other); n_print ("\n"); }
static void print_element_properties_info (GstElement * element) { GParamSpec **property_specs; guint num_properties, i; gboolean readable; gboolean first_flag; property_specs = g_object_class_list_properties (G_OBJECT_GET_CLASS (element), &num_properties); n_print ("\n"); n_print ("Element Properties:\n"); for (i = 0; i < num_properties; i++) { GValue value = { 0, }; GParamSpec *param = property_specs[i]; readable = FALSE; g_value_init (&value, param->value_type); n_print (" %-20s: %s\n", g_param_spec_get_name (param), g_param_spec_get_blurb (param)); first_flag = TRUE; n_print ("%-23.23s flags: ", ""); if (param->flags & G_PARAM_READABLE) { g_object_get_property (G_OBJECT (element), param->name, &value); readable = TRUE; g_print ("%s%s", (first_flag) ? "" : ", ", _("readable")); first_flag = FALSE; } else { /* if we can't read the property value, assume it's set to the default * (which might not be entirely true for sub-classes, but that's an * unlikely corner-case anyway) */ g_param_value_set_default (param, &value); } if (param->flags & G_PARAM_WRITABLE) { g_print ("%s%s", (first_flag) ? "" : ", ", _("writable")); first_flag = FALSE; } if (param->flags & G_PARAM_DEPRECATED) { g_print ("%s%s", (first_flag) ? "" : ", ", _("deprecated")); first_flag = FALSE; } if (param->flags & GST_PARAM_CONTROLLABLE) { g_print (", %s", _("controllable")); first_flag = FALSE; } if (param->flags & GST_PARAM_MUTABLE_PLAYING) { g_print (", %s", _("changeable in NULL, READY, PAUSED or PLAYING state")); } else if (param->flags & GST_PARAM_MUTABLE_PAUSED) { g_print (", %s", _("changeable only in NULL, READY or PAUSED state")); } else if (param->flags & GST_PARAM_MUTABLE_READY) { g_print (", %s", _("changeable only in NULL or READY state")); } if (param->flags & ~KNOWN_PARAM_FLAGS) { g_print ("%s0x%0x", (first_flag) ? "" : ", ", param->flags & ~KNOWN_PARAM_FLAGS); } n_print ("\n"); switch (G_VALUE_TYPE (&value)) { case G_TYPE_STRING: { const char *string_val = g_value_get_string (&value); n_print ("%-23.23s String. ", ""); if (string_val == NULL) g_print ("Default: null"); else g_print ("Default: \"%s\"", string_val); break; } case G_TYPE_BOOLEAN: { gboolean bool_val = g_value_get_boolean (&value); n_print ("%-23.23s Boolean. ", ""); g_print ("Default: %s", bool_val ? "true" : "false"); break; } case G_TYPE_ULONG: { GParamSpecULong *pulong = G_PARAM_SPEC_ULONG (param); n_print ("%-23.23s Unsigned Long. ", ""); g_print ("Range: %lu - %lu Default: %lu ", pulong->minimum, pulong->maximum, g_value_get_ulong (&value)); GST_ERROR ("%s: property '%s' of type ulong: consider changing to " "uint/uint64", GST_OBJECT_NAME (element), g_param_spec_get_name (param)); break; } case G_TYPE_LONG: { GParamSpecLong *plong = G_PARAM_SPEC_LONG (param); n_print ("%-23.23s Long. ", ""); g_print ("Range: %ld - %ld Default: %ld ", plong->minimum, plong->maximum, g_value_get_long (&value)); GST_ERROR ("%s: property '%s' of type long: consider changing to " "int/int64", GST_OBJECT_NAME (element), g_param_spec_get_name (param)); break; } case G_TYPE_UINT: { GParamSpecUInt *puint = G_PARAM_SPEC_UINT (param); n_print ("%-23.23s Unsigned Integer. ", ""); g_print ("Range: %u - %u Default: %u ", puint->minimum, puint->maximum, g_value_get_uint (&value)); break; } case G_TYPE_INT: { GParamSpecInt *pint = G_PARAM_SPEC_INT (param); n_print ("%-23.23s Integer. ", ""); g_print ("Range: %d - %d Default: %d ", pint->minimum, pint->maximum, g_value_get_int (&value)); break; } case G_TYPE_UINT64: { GParamSpecUInt64 *puint64 = G_PARAM_SPEC_UINT64 (param); n_print ("%-23.23s Unsigned Integer64. ", ""); g_print ("Range: %" G_GUINT64_FORMAT " - %" G_GUINT64_FORMAT " Default: %" G_GUINT64_FORMAT " ", puint64->minimum, puint64->maximum, g_value_get_uint64 (&value)); break; } case G_TYPE_INT64: { GParamSpecInt64 *pint64 = G_PARAM_SPEC_INT64 (param); n_print ("%-23.23s Integer64. ", ""); g_print ("Range: %" G_GINT64_FORMAT " - %" G_GINT64_FORMAT " Default: %" G_GINT64_FORMAT " ", pint64->minimum, pint64->maximum, g_value_get_int64 (&value)); break; } case G_TYPE_FLOAT: { GParamSpecFloat *pfloat = G_PARAM_SPEC_FLOAT (param); n_print ("%-23.23s Float. ", ""); g_print ("Range: %15.7g - %15.7g Default: %15.7g ", pfloat->minimum, pfloat->maximum, g_value_get_float (&value)); break; } case G_TYPE_DOUBLE: { GParamSpecDouble *pdouble = G_PARAM_SPEC_DOUBLE (param); n_print ("%-23.23s Double. ", ""); g_print ("Range: %15.7g - %15.7g Default: %15.7g ", pdouble->minimum, pdouble->maximum, g_value_get_double (&value)); break; } case G_TYPE_CHAR: case G_TYPE_UCHAR: GST_ERROR ("%s: property '%s' of type char: consider changing to " "int/string", GST_OBJECT_NAME (element), g_param_spec_get_name (param)); /* fall through */ default: if (param->value_type == GST_TYPE_CAPS) { const GstCaps *caps = gst_value_get_caps (&value); if (!caps) n_print ("%-23.23s Caps (NULL)", ""); else { print_caps (caps, " "); } } else if (G_IS_PARAM_SPEC_ENUM (param)) { GEnumValue *values; guint j = 0; gint enum_value; const gchar *value_nick = ""; values = G_ENUM_CLASS (g_type_class_ref (param->value_type))->values; enum_value = g_value_get_enum (&value); while (values[j].value_name) { if (values[j].value == enum_value) value_nick = values[j].value_nick; j++; } n_print ("%-23.23s Enum \"%s\" Default: %d, \"%s\"", "", g_type_name (G_VALUE_TYPE (&value)), enum_value, value_nick); j = 0; while (values[j].value_name) { g_print ("\n"); if (_name) g_print ("%s", _name); g_print ("%-23.23s (%d): %-16s - %s", "", values[j].value, values[j].value_nick, values[j].value_name); j++; } /* g_type_class_unref (ec); */ } else if (G_IS_PARAM_SPEC_FLAGS (param)) { GParamSpecFlags *pflags = G_PARAM_SPEC_FLAGS (param); GFlagsValue *vals; gchar *cur; vals = pflags->flags_class->values; cur = flags_to_string (vals, g_value_get_flags (&value)); n_print ("%-23.23s Flags \"%s\" Default: 0x%08x, \"%s\"", "", g_type_name (G_VALUE_TYPE (&value)), g_value_get_flags (&value), cur); while (vals[0].value_name) { g_print ("\n"); if (_name) g_print ("%s", _name); g_print ("%-23.23s (0x%08x): %-16s - %s", "", vals[0].value, vals[0].value_nick, vals[0].value_name); ++vals; } g_free (cur); } else if (G_IS_PARAM_SPEC_OBJECT (param)) { n_print ("%-23.23s Object of type \"%s\"", "", g_type_name (param->value_type)); } else if (G_IS_PARAM_SPEC_BOXED (param)) { n_print ("%-23.23s Boxed pointer of type \"%s\"", "", g_type_name (param->value_type)); if (param->value_type == GST_TYPE_STRUCTURE) { const GstStructure *s = gst_value_get_structure (&value); if (s) gst_structure_foreach (s, print_field, (gpointer) " "); } } else if (G_IS_PARAM_SPEC_POINTER (param)) { if (param->value_type != G_TYPE_POINTER) { n_print ("%-23.23s Pointer of type \"%s\".", "", g_type_name (param->value_type)); } else { n_print ("%-23.23s Pointer.", ""); } } else if (param->value_type == G_TYPE_VALUE_ARRAY) { GParamSpecValueArray *pvarray = G_PARAM_SPEC_VALUE_ARRAY (param); if (pvarray->element_spec) { n_print ("%-23.23s Array of GValues of type \"%s\"", "", g_type_name (pvarray->element_spec->value_type)); } else { n_print ("%-23.23s Array of GValues", ""); } } else if (GST_IS_PARAM_SPEC_FRACTION (param)) { GstParamSpecFraction *pfraction = GST_PARAM_SPEC_FRACTION (param); n_print ("%-23.23s Fraction. ", ""); g_print ("Range: %d/%d - %d/%d Default: %d/%d ", pfraction->min_num, pfraction->min_den, pfraction->max_num, pfraction->max_den, gst_value_get_fraction_numerator (&value), gst_value_get_fraction_denominator (&value)); } else { n_print ("%-23.23s Unknown type %ld \"%s\"", "", (glong) param->value_type, g_type_name (param->value_type)); } break; } if (!readable) g_print (" Write only\n"); else g_print ("\n"); g_value_reset (&value); } if (num_properties == 0) n_print (" none\n"); g_free (property_specs); }
static void print_pad_templates_info (GstElement * element, GstElementFactory * factory) { GstElementClass *gstelement_class; const GList *pads; GstStaticPadTemplate *padtemplate; n_print ("Pad Templates:\n"); if (gst_element_factory_get_num_pad_templates (factory) == 0) { n_print (" none\n"); return; } gstelement_class = GST_ELEMENT_CLASS (G_OBJECT_GET_CLASS (element)); pads = gst_element_factory_get_static_pad_templates (factory); while (pads) { padtemplate = (GstStaticPadTemplate *) (pads->data); pads = g_list_next (pads); if (padtemplate->direction == GST_PAD_SRC) n_print (" SRC template: '%s'\n", padtemplate->name_template); else if (padtemplate->direction == GST_PAD_SINK) n_print (" SINK template: '%s'\n", padtemplate->name_template); else n_print (" UNKNOWN!!! template: '%s'\n", padtemplate->name_template); if (padtemplate->presence == GST_PAD_ALWAYS) n_print (" Availability: Always\n"); else if (padtemplate->presence == GST_PAD_SOMETIMES) n_print (" Availability: Sometimes\n"); else if (padtemplate->presence == GST_PAD_REQUEST) { n_print (" Availability: On request\n"); n_print (" Has request_new_pad() function: %s\n", GST_DEBUG_FUNCPTR_NAME (gstelement_class->request_new_pad)); } else n_print (" Availability: UNKNOWN!!!\n"); if (padtemplate->static_caps.string) { n_print (" Capabilities:\n"); print_caps (gst_static_caps_get (&padtemplate->static_caps), " "); } n_print ("\n"); } }