Commit 2cf16838 authored by Zeeshan Ali's avatar Zeeshan Ali
Browse files

gst-inspect: Colored output

Let's make the output a bit pretty to read. The colored output can be
disabled with `--no-colors` option or by setting `GST_INSPECT_NO_COLORS'
env (to any value).

The chosen colors are based on the popular Solarized theme, which is
targeted for both dark and light backgrounds.

Note:

* We only support true colors. If the terminal doesn't signal support for
  that via 'COLORTERM' env, we disable colored output.

* We don't add colors to --print-plugin-auto-install-info output, as
  that's meant for machines, not humans. Not only machines don't care
  about beauty, the existing ones will likely not expect colors and choke
  on it and we'll get angry mob at our doors.

[1] https://ethanschoonover.com/solarized
parent d3811ca5
Pipeline #9570 passed with stages
in 3 minutes and 11 seconds
......@@ -57,6 +57,10 @@ is at least the version specified
.B \-u, \-\-uri\-handlers
Print supported URI schemes, with the elements that implement them
.TP 8
.B \-u, \-\-no\-colors
Disable colors in output. You can also achieve the same by setting
\'GST_INSPECT_NO_COLORS\' environment variable to any value.
.TP 8
.B \-\-print\-plugin\-auto\-install\-info
Print a machine-parsable list of features the specified plugin provides.
Useful in connection with external automatic plugin installation mechanisms.
......
......@@ -2,6 +2,7 @@
* Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
* 2000 Wim Taymans <wtay@chello.be>
* 2004 Thomas Vander Stichele <thomas@apestaart.org>
* 2018 Collabora Ltd.
*
* gst-inspect.c: tool to inspect the GStreamer registry
*
......@@ -42,6 +43,54 @@
#define DEFAULT_PAGER "less -F -X"
gboolean colored_output = TRUE;
/* Console colors (true-color) */
/* Escape values for various colors */
#define BLUE "\033[38;2;38;139;210m"
#define BRBLUE "\033[38;2;131;148;150m"
#define BRGREEN "\033[38;2;88;110;117m"
#define BRRED "\033[38;2;203;75;22m"
#define BRMAGENTA "\033[38;2;108;113;196m" /* VIOLET */
#define CYAN "\033[38;2;42;161;152m"
#define GREEN "\033[38;2;133;153;0m"
#define MAGENTA "\033[38;2;211;54;130m"
#define YELLOW "\033[38;2;176;130;26m"
/* General colors */
#define RESET_COLOR (colored_output? "\033[0m": "")
#define HEADING_COLOR (colored_output? YELLOW : "")
#define PROP_NAME_COLOR (colored_output? BLUE: "")
#define PROP_VALUE_COLOR (colored_output? CYAN : "")
#define PROP_ATTR_NAME_COLOR (colored_output? BRRED : "")
#define PROP_ATTR_VALUE_COLOR (colored_output? BRGREEN : "")
/* FIXME: find a good color that works on both dark & light bg. */
#define DESC_COLOR (colored_output? RESET_COLOR: "")
/* Datatype-related colors */
#define DATATYPE_COLOR (colored_output? MAGENTA : "")
#define CHILD_LINK_COLOR (colored_output? BRMAGENTA : "")
/* Caps colors */
#define FIELD_NAME_COLOR (colored_output? BLUE : "")
#define FIELD_VALUE_COLOR (colored_output? BRGREEN : "")
#define CAPS_TYPE_COLOR (colored_output? YELLOW : "")
#define STRUCT_NAME_COLOR (colored_output? YELLOW : "")
#define CAPS_FEATURE_COLOR (colored_output? GREEN : "")
/* Plugin listing colors */
#define PLUGIN_NAME_COLOR (colored_output? BRMAGENTA : "")
#define ELEMENT_NAME_COLOR (colored_output? GREEN: "")
#define ELEMENT_DETAIL_COLOR (colored_output? BRBLUE: "")
#define PLUGIN_FEATURE_COLOR (colored_output? BRBLUE: "")
/* Feature listing colors */
#define FEATURE_NAME_COLOR (colored_output? GREEN : "")
#define FEATURE_DIR_COLOR (colored_output? BRMAGENTA : "")
#define FEATURE_RANK_COLOR (colored_output? CYAN : "")
#define FEATURE_PROTO_COLOR (colored_output? BRRED : "")
static char *_name = NULL;
static int indent = 0;
......@@ -88,7 +137,9 @@ 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);
n_print ("%s %s%15s%s: %s%s%s\n",
(gchar *) pfx, FIELD_NAME_COLOR, g_quark_to_string (field), RESET_COLOR,
FIELD_VALUE_COLOR, str, RESET_COLOR);
g_free (str);
return TRUE;
}
......@@ -101,11 +152,11 @@ print_caps (const GstCaps * caps, const gchar * pfx)
g_return_if_fail (caps != NULL);
if (gst_caps_is_any (caps)) {
n_print ("%sANY\n", pfx);
n_print ("%s%sANY%s\n", CAPS_TYPE_COLOR, pfx, RESET_COLOR);
return;
}
if (gst_caps_is_empty (caps)) {
n_print ("%sEMPTY\n", pfx);
n_print ("%s%sEMPTY%s\n", CAPS_TYPE_COLOR, pfx, RESET_COLOR);
return;
}
......@@ -118,11 +169,13 @@ print_caps (const GstCaps * caps, const gchar * pfx)
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);
n_print ("%s%s%s%s(%s%s%s)\n", pfx, STRUCT_NAME_COLOR,
gst_structure_get_name (structure), RESET_COLOR,
CAPS_FEATURE_COLOR, features_string, RESET_COLOR);
g_free (features_string);
} else {
n_print ("%s%s\n", pfx, gst_structure_get_name (structure));
n_print ("%s%s%s%s\n", pfx, STRUCT_NAME_COLOR,
gst_structure_get_name (structure), RESET_COLOR);
}
gst_structure_foreach (structure, print_field, (gpointer) pfx);
}
......@@ -163,10 +216,11 @@ print_factory_details_info (GstElementFactory * factory)
char s[20];
rank = gst_plugin_feature_get_rank (GST_PLUGIN_FEATURE (factory));
n_print ("Factory Details:\n");
n_print ("%sFactory Details:%s\n", HEADING_COLOR, RESET_COLOR);
push_indent ();
n_print ("%-25s%s (%d)\n", "Rank", get_rank_name (s, rank), rank);
n_print ("%s%-25s%s%s (%d)%s\n", PROP_NAME_COLOR, "Rank", PROP_VALUE_COLOR,
get_rank_name (s, rank), rank, RESET_COLOR);
keys = gst_element_factory_get_metadata_keys (factory);
if (keys != NULL) {
......@@ -176,7 +230,8 @@ print_factory_details_info (GstElementFactory * factory)
val = gst_element_factory_get_metadata (factory, key);
key[0] = g_ascii_toupper (key[0]);
n_print ("%-25s%s\n", key, val);
n_print ("%s%-25s%s%s%s\n", PROP_NAME_COLOR, key, PROP_VALUE_COLOR, val,
RESET_COLOR);
}
g_strfreev (keys);
}
......@@ -199,14 +254,14 @@ print_hierarchy (GType type, gint level, gint * maxlevel)
print_hierarchy (parent, level, maxlevel);
if (_name)
g_print ("%s", _name);
g_print ("%s%s%s", DATATYPE_COLOR, _name, RESET_COLOR);
for (i = 1; i < *maxlevel - level; i++)
g_print (" ");
if (*maxlevel - level)
g_print (" +----");
g_print (" %s+----%s", CHILD_LINK_COLOR, RESET_COLOR);
g_print ("%s\n", g_type_name (type));
g_print ("%s%s%s\n", DATATYPE_COLOR, g_type_name (type), RESET_COLOR);
if (level == 1)
n_print ("\n");
......@@ -220,11 +275,11 @@ print_interfaces (GType type)
if (ifaces) {
if (n_ifaces) {
n_print (_("Implemented Interfaces:\n"));
n_print (_("%sImplemented Interfaces%s:\n"), HEADING_COLOR, RESET_COLOR);
push_indent ();
iface = ifaces;
while (*iface) {
n_print ("%s\n", g_type_name (*iface));
n_print ("%s%s%s\n", DATATYPE_COLOR, g_type_name (*iface), RESET_COLOR);
iface++;
}
pop_indent ();
......@@ -295,7 +350,7 @@ print_object_properties_info (GObject * obj, GObjectClass * obj_class,
g_qsort_with_data (property_specs, num_properties, sizeof (gpointer),
(GCompareDataFunc) sort_gparamspecs, NULL);
n_print ("%s:\n", desc);
n_print ("%s%s%s:\n", HEADING_COLOR, desc, RESET_COLOR);
push_indent ();
......@@ -313,13 +368,14 @@ print_object_properties_info (GObject * obj, GObjectClass * obj_class,
g_value_init (&value, param->value_type);
n_print ("%-20s: %s\n", g_param_spec_get_name (param),
g_param_spec_get_blurb (param));
n_print ("%s%-20s%s: %s%s%s\n", PROP_NAME_COLOR,
g_param_spec_get_name (param), RESET_COLOR, PROP_VALUE_COLOR,
g_param_spec_get_blurb (param), RESET_COLOR);
push_indent_n (11);
first_flag = TRUE;
n_print ("flags: ");
n_print ("%sflags%s: ", PROP_ATTR_NAME_COLOR, RESET_COLOR);
readable = ! !(param->flags & G_PARAM_READABLE);
if (readable && obj != NULL) {
g_object_get_property (obj, param->name, &value);
......@@ -330,31 +386,38 @@ print_object_properties_info (GObject * obj, GObjectClass * obj_class,
g_param_value_set_default (param, &value);
}
if (readable) {
g_print ("%s%s", (first_flag) ? "" : ", ", _("readable"));
g_print ("%s%s%s%s", (first_flag) ? "" : ", ", PROP_ATTR_VALUE_COLOR,
_("readable"), RESET_COLOR);
first_flag = FALSE;
}
if (param->flags & G_PARAM_WRITABLE) {
g_print ("%s%s", (first_flag) ? "" : ", ", _("writable"));
g_print ("%s%s%s%s", (first_flag) ? "" : ", ", PROP_ATTR_VALUE_COLOR,
_("writable"), RESET_COLOR);
first_flag = FALSE;
}
if (param->flags & G_PARAM_DEPRECATED) {
g_print ("%s%s", (first_flag) ? "" : ", ", _("deprecated"));
g_print ("%s%s%s%s", (first_flag) ? "" : ", ", PROP_ATTR_VALUE_COLOR,
_("deprecated"), RESET_COLOR);
first_flag = FALSE;
}
if (param->flags & GST_PARAM_CONTROLLABLE) {
g_print (", %s", _("controllable"));
g_print (", %s%s%s", PROP_ATTR_VALUE_COLOR, _("controllable"),
RESET_COLOR);
first_flag = FALSE;
}
if (param->flags & GST_PARAM_MUTABLE_PLAYING) {
g_print (", %s", _("changeable in NULL, READY, PAUSED or PLAYING state"));
g_print (", %s%s%s", PROP_ATTR_VALUE_COLOR,
_("changeable in NULL, READY, PAUSED or PLAYING state"), RESET_COLOR);
} else if (param->flags & GST_PARAM_MUTABLE_PAUSED) {
g_print (", %s", _("changeable only in NULL, READY or PAUSED state"));
g_print (", %s%s%s", PROP_ATTR_VALUE_COLOR,
_("changeable only in NULL, READY or PAUSED state"), RESET_COLOR);
} else if (param->flags & GST_PARAM_MUTABLE_READY) {
g_print (", %s", _("changeable only in NULL or READY state"));
g_print (", %s%s%s", PROP_ATTR_VALUE_COLOR,
_("changeable only in NULL or READY state"), RESET_COLOR);
}
if (param->flags & ~KNOWN_PARAM_FLAGS) {
g_print ("%s0x%0x", (first_flag) ? "" : ", ",
param->flags & ~KNOWN_PARAM_FLAGS);
g_print ("%s0x%s%0x%s", (first_flag) ? "" : ", ", PROP_ATTR_VALUE_COLOR,
param->flags & ~KNOWN_PARAM_FLAGS, RESET_COLOR);
}
g_print ("\n");
......@@ -363,27 +426,35 @@ print_object_properties_info (GObject * obj, GObjectClass * obj_class,
{
const char *string_val = g_value_get_string (&value);
n_print ("String. ");
n_print ("%sString%s. ", DATATYPE_COLOR, RESET_COLOR);
if (string_val == NULL)
g_print ("Default: null");
g_print ("%sDefault%s: %snull%s", PROP_ATTR_NAME_COLOR, RESET_COLOR,
PROP_ATTR_VALUE_COLOR, RESET_COLOR);
else
g_print ("Default: \"%s\"", string_val);
g_print ("%sDefault%s: %s\"%s\"%s", PROP_ATTR_NAME_COLOR, RESET_COLOR,
PROP_ATTR_VALUE_COLOR, string_val, RESET_COLOR);
break;
}
case G_TYPE_BOOLEAN:
{
gboolean bool_val = g_value_get_boolean (&value);
n_print ("Boolean. Default: %s", bool_val ? "true" : "false");
n_print ("%sBoolean%s. %sDefault%s: %s%s%s", DATATYPE_COLOR,
RESET_COLOR, PROP_ATTR_NAME_COLOR, RESET_COLOR,
PROP_ATTR_VALUE_COLOR, bool_val ? "true" : "false", RESET_COLOR);
break;
}
case G_TYPE_ULONG:
{
GParamSpecULong *pulong = G_PARAM_SPEC_ULONG (param);
n_print ("Unsigned Long. Range: %lu - %lu Default: %lu ",
pulong->minimum, pulong->maximum, g_value_get_ulong (&value));
n_print
("%sUnsigned Long%s. %sRange%s: %s%lu - %lu%s %sDefault%s: %s%lu%s ",
DATATYPE_COLOR, RESET_COLOR, PROP_ATTR_NAME_COLOR, RESET_COLOR,
PROP_ATTR_VALUE_COLOR, pulong->minimum, pulong->maximum,
RESET_COLOR, PROP_ATTR_NAME_COLOR, RESET_COLOR,
PROP_ATTR_VALUE_COLOR, g_value_get_ulong (&value), RESET_COLOR);
GST_ERROR ("%s: property '%s' of type ulong: consider changing to "
"uint/uint64", G_OBJECT_CLASS_NAME (obj_class),
......@@ -394,8 +465,11 @@ print_object_properties_info (GObject * obj, GObjectClass * obj_class,
{
GParamSpecLong *plong = G_PARAM_SPEC_LONG (param);
n_print ("Long. Range: %ld - %ld Default: %ld ",
plong->minimum, plong->maximum, g_value_get_long (&value));
n_print ("%sLong%s. %sRange%s: %s%ld - %ld%s %sDefault%s: %s%ld%s ",
DATATYPE_COLOR, RESET_COLOR, PROP_ATTR_NAME_COLOR, RESET_COLOR,
PROP_ATTR_VALUE_COLOR, plong->minimum, plong->maximum, RESET_COLOR,
PROP_ATTR_NAME_COLOR, RESET_COLOR, PROP_ATTR_VALUE_COLOR,
g_value_get_long (&value), RESET_COLOR);
GST_ERROR ("%s: property '%s' of type long: consider changing to "
"int/int64", G_OBJECT_CLASS_NAME (obj_class),
......@@ -406,50 +480,71 @@ print_object_properties_info (GObject * obj, GObjectClass * obj_class,
{
GParamSpecUInt *puint = G_PARAM_SPEC_UINT (param);
n_print ("Unsigned Integer. Range: %u - %u Default: %u ",
puint->minimum, puint->maximum, g_value_get_uint (&value));
n_print
("%sUnsigned Integer%s. %sRange%s: %s%u - %u%s %sDefault%s: %s%u%s ",
DATATYPE_COLOR, RESET_COLOR, PROP_ATTR_NAME_COLOR, RESET_COLOR,
PROP_ATTR_VALUE_COLOR, puint->minimum, puint->maximum, RESET_COLOR,
PROP_ATTR_NAME_COLOR, RESET_COLOR, PROP_ATTR_VALUE_COLOR,
g_value_get_uint (&value), RESET_COLOR);
break;
}
case G_TYPE_INT:
{
GParamSpecInt *pint = G_PARAM_SPEC_INT (param);
n_print ("Integer. Range: %d - %d Default: %d ",
pint->minimum, pint->maximum, g_value_get_int (&value));
n_print ("%sInteger%s. %sRange%s: %s%d - %d%s %sDefault%s: %s%d%s ",
DATATYPE_COLOR, RESET_COLOR, PROP_ATTR_NAME_COLOR, RESET_COLOR,
PROP_ATTR_VALUE_COLOR, pint->minimum, pint->maximum, RESET_COLOR,
PROP_ATTR_NAME_COLOR, RESET_COLOR, PROP_ATTR_VALUE_COLOR,
g_value_get_int (&value), RESET_COLOR);
break;
}
case G_TYPE_UINT64:
{
GParamSpecUInt64 *puint64 = G_PARAM_SPEC_UINT64 (param);
n_print ("Unsigned Integer64. Range: %" G_GUINT64_FORMAT " - "
"%" G_GUINT64_FORMAT " Default: %" G_GUINT64_FORMAT " ",
puint64->minimum, puint64->maximum, g_value_get_uint64 (&value));
n_print ("%sUnsigned Integer64%s. %sRange%s: %s%" G_GUINT64_FORMAT " - "
"%" G_GUINT64_FORMAT "%s %sDefault%s: %s%" G_GUINT64_FORMAT "%s ",
DATATYPE_COLOR, RESET_COLOR, PROP_ATTR_NAME_COLOR, RESET_COLOR,
PROP_ATTR_VALUE_COLOR, puint64->minimum, puint64->maximum,
RESET_COLOR, PROP_ATTR_NAME_COLOR, RESET_COLOR,
PROP_ATTR_VALUE_COLOR, g_value_get_uint64 (&value), RESET_COLOR);
break;
}
case G_TYPE_INT64:
{
GParamSpecInt64 *pint64 = G_PARAM_SPEC_INT64 (param);
n_print ("Integer64. Range: %" G_GINT64_FORMAT " - %" G_GINT64_FORMAT
" Default: %" G_GINT64_FORMAT " ",
pint64->minimum, pint64->maximum, g_value_get_int64 (&value));
n_print ("%sInteger64%s. %sRange%s: %s%" G_GINT64_FORMAT " - %"
G_GINT64_FORMAT "%s %sDefault%s: %s%" G_GINT64_FORMAT "%s ",
DATATYPE_COLOR, RESET_COLOR, PROP_ATTR_NAME_COLOR, RESET_COLOR,
PROP_ATTR_VALUE_COLOR, pint64->minimum, pint64->maximum,
RESET_COLOR, PROP_ATTR_NAME_COLOR, RESET_COLOR,
PROP_ATTR_VALUE_COLOR, g_value_get_int64 (&value), RESET_COLOR);
break;
}
case G_TYPE_FLOAT:
{
GParamSpecFloat *pfloat = G_PARAM_SPEC_FLOAT (param);
n_print ("Float. Range: %15.7g - %15.7g Default: %15.7g ",
pfloat->minimum, pfloat->maximum, g_value_get_float (&value));
n_print ("%sFloat%s. %sRange%s: %s%15.7g - %15.7g%s "
"%sDefault%s: %s%15.7g%s ", DATATYPE_COLOR, RESET_COLOR,
PROP_ATTR_NAME_COLOR, RESET_COLOR, PROP_ATTR_VALUE_COLOR,
pfloat->minimum, pfloat->maximum, RESET_COLOR, PROP_ATTR_NAME_COLOR,
RESET_COLOR, PROP_ATTR_VALUE_COLOR, g_value_get_float (&value),
RESET_COLOR);
break;
}
case G_TYPE_DOUBLE:
{
GParamSpecDouble *pdouble = G_PARAM_SPEC_DOUBLE (param);
n_print ("Double. Range: %15.7g - %15.7g Default: %15.7g ",
pdouble->minimum, pdouble->maximum, g_value_get_double (&value));
n_print ("%sDouble%s. %sRange%s: %s%15.7g - %15.7g%s "
"%sDefault%s: %s%15.7g%s ", DATATYPE_COLOR, RESET_COLOR,
PROP_ATTR_NAME_COLOR, RESET_COLOR, PROP_ATTR_VALUE_COLOR,
pdouble->minimum, pdouble->maximum, RESET_COLOR,
PROP_ATTR_NAME_COLOR, RESET_COLOR, PROP_ATTR_VALUE_COLOR,
g_value_get_double (&value), RESET_COLOR);
break;
}
case G_TYPE_CHAR:
......@@ -463,7 +558,7 @@ print_object_properties_info (GObject * obj, GObjectClass * obj_class,
const GstCaps *caps = gst_value_get_caps (&value);
if (!caps)
n_print ("Caps (NULL)");
n_print ("%sCaps%s (NULL)", DATATYPE_COLOR, RESET_COLOR);
else {
print_caps (caps, " ");
}
......@@ -482,14 +577,18 @@ print_object_properties_info (GObject * obj, GObjectClass * obj_class,
j++;
}
n_print ("Enum \"%s\" Default: %d, \"%s\"",
g_type_name (G_VALUE_TYPE (&value)), enum_value, value_nick);
n_print ("%sEnum \"%s\"%s %sDefault%s: %s%d, \"%s\"%s",
DATATYPE_COLOR, g_type_name (G_VALUE_TYPE (&value)), RESET_COLOR,
PROP_ATTR_NAME_COLOR, RESET_COLOR, PROP_ATTR_VALUE_COLOR,
enum_value, value_nick, RESET_COLOR);
j = 0;
while (values[j].value_name) {
g_print ("\n");
n_print (" (%d): %-16s - %s",
values[j].value, values[j].value_nick, values[j].value_name);
n_print (" %s(%d)%s: %s%-16s%s - %s%s%s",
PROP_ATTR_NAME_COLOR, values[j].value, RESET_COLOR,
PROP_ATTR_VALUE_COLOR, values[j].value_nick, RESET_COLOR,
DESC_COLOR, values[j].value_name, RESET_COLOR);
j++;
}
/* g_type_class_unref (ec); */
......@@ -502,23 +601,29 @@ print_object_properties_info (GObject * obj, GObjectClass * obj_class,
cur = flags_to_string (vals, g_value_get_flags (&value));
n_print ("Flags \"%s\" Default: 0x%08x, \"%s\"",
g_type_name (G_VALUE_TYPE (&value)),
g_value_get_flags (&value), cur);
n_print ("%sFlags \"%s\"%s %sDefault%s: %s0x%08x, \"%s\"%s",
DATATYPE_COLOR, g_type_name (G_VALUE_TYPE (&value)), RESET_COLOR,
PROP_ATTR_NAME_COLOR, RESET_COLOR, PROP_ATTR_VALUE_COLOR,
g_value_get_flags (&value), cur, RESET_COLOR);
while (vals[0].value_name) {
g_print ("\n");
n_print (" (0x%08x): %-16s - %s",
vals[0].value, vals[0].value_nick, vals[0].value_name);
n_print (" %s(0x%08x)%s: %s%-16s%s - %s%s%s",
PROP_ATTR_NAME_COLOR, vals[0].value, RESET_COLOR,
PROP_ATTR_VALUE_COLOR, vals[0].value_nick, RESET_COLOR,
DESC_COLOR, vals[0].value_name, RESET_COLOR);
++vals;
}
g_free (cur);
} else if (G_IS_PARAM_SPEC_OBJECT (param)) {
n_print ("Object of type \"%s\"", g_type_name (param->value_type));
n_print ("%sObject of type%s %s\"%s\"%s", PROP_VALUE_COLOR,
RESET_COLOR, DATATYPE_COLOR,
g_type_name (param->value_type), RESET_COLOR);
} else if (G_IS_PARAM_SPEC_BOXED (param)) {
n_print ("Boxed pointer of type \"%s\"",
g_type_name (param->value_type));
n_print ("%sBoxed pointer of type%s %s\"%s\"%s", PROP_VALUE_COLOR,
RESET_COLOR, DATATYPE_COLOR,
g_type_name (param->value_type), RESET_COLOR);
if (param->value_type == GST_TYPE_STRUCTURE) {
const GstStructure *s = gst_value_get_structure (&value);
if (s)
......@@ -527,45 +632,53 @@ print_object_properties_info (GObject * obj, GObjectClass * obj_class,
}
} else if (G_IS_PARAM_SPEC_POINTER (param)) {
if (param->value_type != G_TYPE_POINTER) {
n_print ("Pointer of type \"%s\".",
g_type_name (param->value_type));
n_print ("%sPointer of type%s %s\"%s\"%s.", PROP_VALUE_COLOR,
RESET_COLOR, DATATYPE_COLOR, g_type_name (param->value_type),
RESET_COLOR);
} else {
n_print ("Pointer.");
n_print ("%sPointer.%s", PROP_VALUE_COLOR, RESET_COLOR);
}
} else if (param->value_type == G_TYPE_VALUE_ARRAY) {
GParamSpecValueArray *pvarray = G_PARAM_SPEC_VALUE_ARRAY (param);
if (pvarray->element_spec) {
n_print ("Array of GValues of type \"%s\"",
g_type_name (pvarray->element_spec->value_type));
n_print ("%sArray of GValues of type%s %s\"%s\"%s",
PROP_VALUE_COLOR, RESET_COLOR, DATATYPE_COLOR,
g_type_name (pvarray->element_spec->value_type), RESET_COLOR);
} else {
n_print ("Array of GValues");
n_print ("%sArray of GValues%s", PROP_VALUE_COLOR, RESET_COLOR);
}
} else if (GST_IS_PARAM_SPEC_FRACTION (param)) {
GstParamSpecFraction *pfraction = GST_PARAM_SPEC_FRACTION (param);
n_print ("Fraction. Range: %d/%d - %d/%d Default: %d/%d ",
pfraction->min_num, pfraction->min_den,
pfraction->max_num, pfraction->max_den,
n_print ("%sFraction%s. %sRange%s: %s%d/%d - %d/%d%s "
"%sDefault%s: %s%d/%d%s ", DATATYPE_COLOR, RESET_COLOR,
PROP_ATTR_NAME_COLOR, RESET_COLOR, PROP_ATTR_VALUE_COLOR,
pfraction->min_num, pfraction->min_den, pfraction->max_num,
pfraction->max_den, RESET_COLOR, PROP_ATTR_NAME_COLOR,
RESET_COLOR, PROP_ATTR_VALUE_COLOR,
gst_value_get_fraction_numerator (&value),
gst_value_get_fraction_denominator (&value));
gst_value_get_fraction_denominator (&value), RESET_COLOR);
} else if (param->value_type == GST_TYPE_ARRAY) {
GstParamSpecArray *parray = GST_PARAM_SPEC_ARRAY_LIST (param);
if (parray->element_spec) {
n_print ("GstValueArray of GValues of type \"%s\"",
g_type_name (parray->element_spec->value_type));
n_print ("%sGstValueArray of GValues of type%s %s\"%s\"%s",
PROP_VALUE_COLOR, RESET_COLOR, DATATYPE_COLOR,
g_type_name (parray->element_spec->value_type), RESET_COLOR);
} else {
n_print ("GstValueArray of GValues");
n_print ("%sGstValueArray of GValues%s", PROP_VALUE_COLOR,
RESET_COLOR);
}
} else {
n_print ("Unknown type %ld \"%s\"",
(glong) param->value_type, g_type_name (param->value_type));
n_print ("%sUnknown type %ld%s %s\"%s\"%s", PROP_VALUE_COLOR,
(glong) param->value_type, RESET_COLOR, DATATYPE_COLOR,
g_type_name (param->value_type), RESET_COLOR);
}
break;
}
if (!readable)
g_print (" Write only\n");
g_print (" %sWrite only%s\n", PROP_VALUE_COLOR, RESET_COLOR);
else
g_print ("\n");
......@@ -574,7 +687,7 @@ print_object_properties_info (GObject * obj, GObjectClass * obj_class,
g_value_reset (&value);
}
if (num_properties == 0)
n_print ("none\n");
n_print ("%snone%s\n", PROP_VALUE_COLOR, RESET_COLOR);
pop_indent ();
......@@ -596,12 +709,12 @@ print_pad_templates_info (GstElement * element, GstElementFactory * factory)
GstStaticPadTemplate *padtemplate;
GstPadTemplate *tmpl;
n_print ("Pad Templates:\n");
n_print ("%sPad Templates%s:\n", HEADING_COLOR, RESET_COLOR);
push_indent ();
if (gst_element_factory_get_num_pad_templates (factory) == 0) {
n_print ("none\n");
n_print ("%snone%s\n", PROP_VALUE_COLOR, RESET_COLOR);
goto done;
}
......@@ -611,27 +724,34 @@ print_pad_templates_info (GstElement * element, GstElementFactory * factory)
pads = g_list_next (pads);
if (padtemplate->direction == GST_PAD_SRC)
n_print ("SRC template: '%s'\n", padtemplate->name_template);
n_print ("%sSRC template%s: %s'%s'%s\n", PROP_NAME_COLOR, RESET_COLOR,
PROP_VALUE_COLOR, padtemplate->name_template, RESET_COLOR);
else if (padtemplate->direction == GST_PAD_SINK)
n_print ("SINK template: '%s'\n", padtemplate->name_template);
n_print ("%sSINK template%s: %s'%s'%s\n", PROP_NAME_COLOR, RESET_COLOR,
PROP_VALUE_COLOR, padtemplate->name_template, RESET_COLOR);
else
n_print ("UNKNOWN template: '%s'\n", padtemplate->name_template);
n_print ("%sUNKNOWN template%s: %s'%s'%s\n", PROP_NAME_COLOR, RESET_COLOR,
PROP_VALUE_COLOR, padtemplate->name_template, RESET_COLOR);
push_indent ();
if (padtemplate->presence == GST_PAD_ALWAYS)
n_print ("Availability: Always\n");
n_print ("%sAvailability%s: %sAlways%s\n", PROP_NAME_COLOR, RESET_COLOR,
PROP_VALUE_COLOR, RESET_COLOR);
else if (padtemplate->presence == GST_PAD_SOMETIMES)
n_print ("Availability: Sometimes\n");
n_print ("%sAvailability%s: %sSometimes%s\n", PROP_NAME_COLOR,
RESET_COLOR, PROP_VALUE_COLOR, RESET_COLOR);
else if (padtemplate->presence == GST_PAD_REQUEST) {
n_print ("Availability: On request\n");
n_print ("%sAvailability%s: %sOn request%s\n", PROP_NAME_COLOR,
RESET_COLOR, PROP_VALUE_COLOR, RESET_COLOR);
} else
n_print ("Availability: UNKNOWN\n");
n_print ("%sAvailability%s: %sUNKNOWN%s\n", PROP_NAME_COLOR, RESET_COLOR,
PROP_VALUE_COLOR, RESET_COLOR);
if (padtemplate->static_caps.string) {
GstCaps *caps = gst_static_caps_get (&padtemplate->static_caps);
n_print ("Capabilities:\n");
n_print ("%sCapabilities%s:\n", PROP_NAME_COLOR, RESET_COLOR);
push_indent ();
print_caps (caps, ""); // FIXME
......@@ -649,7 +769,8 @@ print_pad_templates_info (GstElement * element, GstElementFactory * factory)
gpointer pad_klass;
pad_klass = g_type_class_ref (pad_type);
n_print ("Type: %s\n", g_type_name (pad_type));
n_print ("%sType%s: %s%s%s\n", PROP_NAME_COLOR, RESET_COLOR,
DATATYPE_COLOR, g_type_name (pad_type), RESET_COLOR);
print_object_properties_info (NULL, pad_klass, "Pad Properties");
g_type_class_unref (pad_klass);
}
......@@ -677,17 +798,18 @@ print_clocking_info (GstElement * element)
if (!requires_clock && !provides_clock) {
n_print ("\n");
n_print ("Element has no clocking capabilities.\n");
n_print ("%sElement has no clocking capabilities.%s\n", DESC_COLOR,
RESET_COLOR);
return;
}
n_print ("\n");
n_print ("Clocking Interaction:\n");
n_print ("%sClocking Interaction%s:\n", PROP_NAME_COLOR, RESET_COLOR);
push_indent ();
if (requires_clock) {
n_print ("element requires a clock\n");
n_print ("%selement requires a clock%s\n", PROP_VALUE_COLOR, RESET_COLOR);