1 From 642d0d6fef226fb89eaecf0016f8e5e333b9023e Mon Sep 17 00:00:00 2001
2 From: Wim Taymans <wtaymans@redhat.com>
3 Date: Tue, 23 Jun 2015 10:28:29 +0200
4 Subject: [PATCH] gst-inspect: add mode to output RPM requires format
7 tools/gst-inspect.c | 279 +++++++++++++++++++++++++++++++++++++++++---
8 1 file changed, 263 insertions(+), 16 deletions(-)
10 diff --git a/tools/gst-inspect.c b/tools/gst-inspect.c
11 index 8da042946..a057cba09 100644
12 --- a/tools/gst-inspect.c
13 +++ b/tools/gst-inspect.c
14 @@ -394,7 +394,7 @@ print_object_properties_info (GObject * obj, GObjectClass * obj_class,
17 n_print ("%sflags%s: ", PROP_ATTR_NAME_COLOR, RESET_COLOR);
18 - readable = ! !(param->flags & G_PARAM_READABLE);
19 + readable = !!(param->flags & G_PARAM_READABLE);
20 if (readable && obj != NULL) {
21 g_object_get_property (obj, param->name, &value);
23 @@ -1739,11 +1739,228 @@ print_tracer_info (GstPluginFeature * feature, gboolean print_names)
28 +print_gst_structure_append_field (GList * strings, const char *field)
32 + //g_message ("adding '%s' to the string", field);
34 + for (s = strings; s != NULL; s = s->next) {
35 + g_string_append (s->data, field);
40 +print_gst_structure_append_field_index (GList * strings, const char *field,
41 + guint num_items, guint offset)
46 + //g_message ("adding '%s' to the string (num: %d offset: %d)", field, num_items, offset);
48 + for (s = strings, i = 0; s != NULL; s = s->next, i++) {
50 + //g_message ("adding '%s' at '%d'", field, i);
51 + g_string_append (s->data, field);
60 +print_gst_structure_dup_fields (GList * strings, guint num_items)
67 + //g_message ("creating %d new items", num_items);
69 + new_items = g_list_length (strings) * (num_items - 1);
70 + for (i = 0; i < new_items; i++) {
73 + first = strings->data;
74 + s = g_string_new_len (first->str, first->len);
75 + strings = g_list_prepend (strings, s);
90 +field_get_type (const char *field_name)
92 + if (strstr (field_name, "version") != NULL)
93 + return FIELD_VERSION;
94 + if (strcmp (field_name, "layer") == 0)
96 + if (strcmp (field_name, "systemstream") == 0)
97 + return FIELD_SYSTEMSTREAM;
98 + if (strcmp (field_name, "variant") == 0)
99 + return FIELD_VARIANT;
105 +fields_type_compare (const char *a, const char *b)
107 + gint a_type, b_type;
109 + a_type = field_get_type (a);
110 + b_type = field_get_type (b);
111 + if (a_type < b_type)
113 + if (b_type < a_type)
119 +print_gst_structure_for_rpm (const char *type_name, GstStructure * s)
121 + guint i, num_fields;
123 + GList *fields, *l, *strings;
126 + name = gst_structure_get_name (s);
128 + num_fields = gst_structure_n_fields (s);
131 + for (i = 0; i < num_fields; i++) {
132 + const char *field_name;
134 + field_name = gst_structure_nth_field_name (s, i);
135 + if (field_get_type (field_name) < 0) {
136 + //g_message ("ignoring field named %s", field_name);
141 + g_list_insert_sorted (fields, g_strdup (field_name),
142 + (GCompareFunc) fields_type_compare);
146 + * gstreamer1(decoder-video/mpeg)(mpegversion=1)()(64bit) */
147 + string = g_string_new ("gstreamer1");
148 + g_string_append_c (string, '(');
149 + g_string_append (string, type_name);
150 + g_string_append_c (string, '-');
151 + g_string_append (string, name);
152 + g_string_append_c (string, ')');
154 + strings = g_list_append (strings, string);
156 + for (l = fields; l != NULL; l = l->next) {
160 + field_name = l->data;
162 + type = gst_structure_get_field_type (s, field_name);
163 + //g_message ("field is: %s, type: %s", field_name, g_type_name (type));
165 + if (type == G_TYPE_INT) {
169 + gst_structure_get_int (s, field_name, &value);
170 + field = g_strdup_printf ("(%s=%d)", field_name, value);
171 + print_gst_structure_append_field (strings, field);
173 + } else if (type == G_TYPE_BOOLEAN) {
177 + gst_structure_get_boolean (s, field_name, &value);
178 + field = g_strdup_printf ("(%s=%s)", field_name, value ? "true" : "false");
179 + print_gst_structure_append_field (strings, field);
181 + } else if (type == GST_TYPE_INT_RANGE) {
182 + const GValue *value;
185 + value = gst_structure_get_value (s, field_name);
186 + min = gst_value_get_int_range_min (value);
187 + max = gst_value_get_int_range_max (value);
189 + strings = print_gst_structure_dup_fields (strings, max - min + 1);
191 + for (i = min; i <= max; i++) {
194 + field = g_strdup_printf ("(%s=%d)", field_name, i);
195 + print_gst_structure_append_field_index (strings, field, max - min + 1,
199 + } else if (type == GST_TYPE_LIST) {
200 + const GValue *value;
203 + value = gst_structure_get_value (s, field_name);
204 + num_items = gst_value_list_get_size (value);
206 + strings = print_gst_structure_dup_fields (strings, num_items);
208 + for (i = 0; i < num_items; i++) {
210 + const GValue *item_value;
212 + item_value = gst_value_list_get_value (value, i);
213 + field = g_strdup_printf ("(%s=%d)", field_name,
214 + g_value_get_int (item_value));
215 + print_gst_structure_append_field_index (strings, field, num_items, i);
218 + } else if (type == G_TYPE_STRING) {
222 + value = gst_structure_get_string (s, field_name);
223 + field = g_strdup_printf ("(%s=%s)", field_name, value);
224 + print_gst_structure_append_field (strings, field);
227 + g_warning ("unhandled type! %s", g_type_name (type));
230 + g_free (field_name);
233 + g_list_free (fields);
235 + for (l = strings; l != NULL; l = l->next) {
237 + g_print ("%s\n", string->str);
238 + g_string_free (string, TRUE);
240 + g_list_free (strings);
243 /* NOTE: Not coloring output from automatic install functions, as their output
244 * is meant for machines, not humans.
247 -print_plugin_automatic_install_info_codecs (GstElementFactory * factory)
248 +print_plugin_automatic_install_info_codecs (GstElementFactory * factory,
249 + gboolean rpm_format)
251 GstPadDirection direction;
252 const gchar *type_name;
253 @@ -1769,6 +1986,13 @@ print_plugin_automatic_install_info_codecs (GstElementFactory * factory)
258 + /* Ignore NONE ranked plugins */
259 + if ((gst_plugin_feature_get_rank (GST_PLUGIN_FEATURE (factory))) ==
264 /* decoder/demuxer sink pads should always be static and there should only
265 * be one, the same applies to encoders/muxers and source pads */
266 static_templates = gst_element_factory_get_static_pad_templates (factory);
267 @@ -1805,15 +2029,20 @@ print_plugin_automatic_install_info_codecs (GstElementFactory * factory)
268 gst_structure_remove_field (s, "rate");
269 gst_structure_remove_field (s, "depth");
270 gst_structure_remove_field (s, "clock-rate");
271 - s_str = gst_structure_to_string (s);
272 - g_print ("%s-%s\n", type_name, s_str);
275 + s_str = gst_structure_to_string (s);
276 + g_print ("%s-%s\n", type_name, s_str);
279 + print_gst_structure_for_rpm (type_name, s);
282 gst_caps_unref (caps);
286 -print_plugin_automatic_install_info_protocols (GstElementFactory * factory)
287 +print_plugin_automatic_install_info_protocols (GstElementFactory * factory,
288 + gboolean rpm_format)
290 const gchar *const *protocols;
292 @@ -1822,13 +2051,19 @@ print_plugin_automatic_install_info_protocols (GstElementFactory * factory)
293 switch (gst_element_factory_get_uri_type (factory)) {
295 while (*protocols != NULL) {
296 - g_print ("urisink-%s\n", *protocols);
298 + g_print ("urisink-%s\n", *protocols);
300 + g_print ("gstreamer1(urisink-%s)\n", *protocols);
305 while (*protocols != NULL) {
306 - g_print ("urisource-%s\n", *protocols);
308 + g_print ("urisource-%s\n", *protocols);
310 + g_print ("gstreamer1(urisource-%s)\n", *protocols);
314 @@ -1839,7 +2074,7 @@ print_plugin_automatic_install_info_protocols (GstElementFactory * factory)
318 -print_plugin_automatic_install_info (GstPlugin * plugin)
319 +print_plugin_automatic_install_info (GstPlugin * plugin, gboolean rpm_format)
323 @@ -1858,11 +2093,15 @@ print_plugin_automatic_install_info (GstPlugin * plugin)
324 if (feature_plugin == plugin) {
325 GstElementFactory *factory;
327 - g_print ("element-%s\n", gst_plugin_feature_get_name (feature));
329 + g_print ("element-%s\n", gst_plugin_feature_get_name (feature));
331 + g_print ("gstreamer1(element-%s)\n",
332 + gst_plugin_feature_get_name (feature));
334 factory = GST_ELEMENT_FACTORY (feature);
335 - print_plugin_automatic_install_info_protocols (factory);
336 - print_plugin_automatic_install_info_codecs (factory);
337 + print_plugin_automatic_install_info_protocols (factory, rpm_format);
338 + print_plugin_automatic_install_info_codecs (factory, rpm_format);
341 gst_object_unref (feature_plugin);
342 @@ -1884,7 +2123,7 @@ print_all_plugin_automatic_install_info (void)
343 plugin = (GstPlugin *) (plugins->data);
344 plugins = g_list_next (plugins);
346 - print_plugin_automatic_install_info (plugin);
347 + print_plugin_automatic_install_info (plugin, FALSE);
349 gst_plugin_list_free (orig_plugins);
351 @@ -1951,6 +2190,7 @@ main (int argc, char *argv[])
352 gboolean do_print_blacklist = FALSE;
353 gboolean plugin_name = FALSE;
354 gboolean print_aii = FALSE;
355 + gboolean print_aii_rpm = FALSE;
356 gboolean uri_handlers = FALSE;
357 gboolean check_exists = FALSE;
358 gboolean color_always = FALSE;
359 @@ -1972,6 +2212,9 @@ main (int argc, char *argv[])
360 "or all plugins provide.\n "
361 "Useful in connection with external automatic plugin "
362 "installation mechanisms"), NULL},
363 + {"rpm", '\0', 0, G_OPTION_ARG_NONE, &print_aii_rpm,
364 + N_("Print the machine-parsable list of features of a plugin in RPM "
365 + "Provides compatible-format"), NULL},
366 {"plugin", '\0', 0, G_OPTION_ARG_NONE, &plugin_name,
367 N_("List the plugin contents"), NULL},
368 {"types", 't', 0, G_OPTION_ARG_STRING, &types,
369 @@ -2135,7 +2378,7 @@ main (int argc, char *argv[])
370 /* if there is such a plugin, print out info */
373 - print_plugin_automatic_install_info (plugin);
374 + print_plugin_automatic_install_info (plugin, print_aii_rpm);
376 print_plugin_info (plugin);
377 print_plugin_features (plugin);
378 @@ -2148,13 +2391,17 @@ main (int argc, char *argv[])
382 - print_plugin_automatic_install_info (plugin);
383 + print_plugin_automatic_install_info (plugin, print_aii_rpm);
385 print_plugin_info (plugin);
386 print_plugin_features (plugin);
389 - g_printerr (_("Could not load plugin file: %s\n"), error->message);
390 + if (!print_aii_rpm)
391 + g_print (_("Could not load plugin file: %s\n"), error->message);
393 + g_printerr (_("Could not load plugin file: %s\n"),
395 g_clear_error (&error);