SOURCES: gstreamer-inspect-rpm-format.patch (NEW) - add rpm provides output...

patrys patrys at pld-linux.org
Sun Dec 7 15:36:55 CET 2008


Author: patrys                       Date: Sun Dec  7 14:36:55 2008 GMT
Module: SOURCES                       Tag: HEAD
---- Log message:
- add rpm provides output format to gst-inspect
- patch from http://cvs.fedoraproject.org/viewvc/devel/gstreamer/gstreamer-inspect-rpm-format.patch

---- Files affected:
SOURCES:
   gstreamer-inspect-rpm-format.patch (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: SOURCES/gstreamer-inspect-rpm-format.patch
diff -u /dev/null SOURCES/gstreamer-inspect-rpm-format.patch:1.1
--- /dev/null	Sun Dec  7 15:36:56 2008
+++ SOURCES/gstreamer-inspect-rpm-format.patch	Sun Dec  7 15:36:49 2008
@@ -0,0 +1,339 @@
+diff -u -p -r1.142 tools/gst-inspect.c
+--- tools/gst-inspect.c	31 Jul 2008 15:20:31 -0000	1.142
++++ tools/gst-inspect.c	11 Sep 2008 23:47:16 -0000
+@@ -1188,9 +1188,219 @@ print_element_info (GstElementFactory * 
+   return 0;
+ }
+ 
++static void
++print_gst_structure_append_field (GList *strings, const char *field)
++{
++	GList *s;
++
++	//g_message ("adding '%s' to the string", field);
++
++	for (s = strings; s != NULL; s = s->next) {
++		g_string_append (s->data, field);
++	}
++}
++
++static void
++print_gst_structure_append_field_index (GList *strings, const char *field, guint num_items, guint offset)
++{
++	GList *s;
++	guint i;
++
++	//g_message ("adding '%s' to the string (num: %d offset: %d)", field, num_items, offset);
++
++	for (s = strings, i = 0; s != NULL; s = s->next, i++) {
++		if (i == offset) {
++			//g_message ("adding '%s' at '%d'", field, i);
++			g_string_append (s->data, field);
++		}
++		if (i == num_items)
++			i = 0;
++	}
++
++}
++
++static GList *
++print_gst_structure_dup_fields (GList *strings, guint num_items)
++{
++	guint new_items, i;
++
++	if (num_items == 1)
++		return strings;
++
++	//g_message ("creating %d new items", num_items);
++
++	new_items = g_list_length (strings) * (num_items - 1);
++	for (i = 0; i < new_items; i++) {
++		GString *s, *first;
++
++		first = strings->data;
++		s = g_string_new_len (first->str, first->len);
++		strings = g_list_prepend (strings, s);
++	}
++
++	return strings;
++}
++
++enum {
++	FIELD_VERSION = 0,
++	FIELD_LAYER,
++	FIELD_VARIANT,
++	FIELD_SYSTEMSTREAM
++};
++
++static int
++field_get_type (const char *field_name)
++{
++	if (strstr (field_name, "version") != NULL)
++		return FIELD_VERSION;
++	if (strcmp (field_name, "layer") == 0)
++		return FIELD_LAYER;
++	if (strcmp (field_name, "systemstream") == 0)
++		return FIELD_SYSTEMSTREAM;
++	if (strcmp (field_name, "variant") == 0)
++		return FIELD_VARIANT;
++
++	return -1;
++}
++
++static gint
++fields_type_compare (const char *a, const char *b)
++{
++	gint a_type, b_type;
++
++	a_type = field_get_type (a);
++	b_type = field_get_type (b);
++	if (a_type < b_type)
++		return -1;
++	if (b_type < a_type)
++		return 1;
++	return 0;
++}
++
++static void
++print_gst_structure_for_rpm (const char *type_name, GstStructure *s)
++{
++  guint i, num_fields;
++  const char *name;
++  GList *fields, *l, *strings;
++  GString *string;
++
++  name = gst_structure_get_name (s);
++  strings = NULL;
++  num_fields = gst_structure_n_fields (s);
++  fields = NULL;
++
++  for (i = 0; i < num_fields; i++) {
++    const char *field_name;
++
++    field_name = gst_structure_nth_field_name (s, i);
++    if (field_get_type (field_name) < 0) {
++    	//g_message ("ignoring field named %s", field_name);
++    	continue;
++    }
++
++    fields = g_list_insert_sorted (fields, g_strdup (field_name), (GCompareFunc) fields_type_compare);
++  }
++
++  /* Example:
++   * gstreamer0.10(decoder-video/mpeg)(mpegversion=1)()(64bit) */
++  string = g_string_new ("gstreamer0.10");
++  g_string_append_c (string, '(');
++  g_string_append (string, type_name);
++  g_string_append_c (string, '-');
++  g_string_append (string, name);
++  g_string_append_c (string, ')');
++
++  strings = g_list_append (strings, string);
++
++  for (l = fields; l != NULL; l = l->next) {
++    char *field_name;
++    GType type;
++
++    field_name = l->data;
++
++    type = gst_structure_get_field_type (s, field_name);
++    //g_message ("field is: %s, type: %s", field_name, g_type_name (type));
++
++    if (type == G_TYPE_INT) {
++      char *field;
++      int value;
++
++      gst_structure_get_int (s, field_name, &value);
++      field = g_strdup_printf ("(%s=%d)", field_name, value);
++      print_gst_structure_append_field (strings, field);
++      g_free (field);
++    } else if (type == G_TYPE_BOOLEAN) {
++      char *field;
++      int value;
++
++      gst_structure_get_boolean (s, field_name, &value);
++      field = g_strdup_printf ("(%s=%s)", field_name, value ? "true" : "false");
++      print_gst_structure_append_field (strings, field);
++      g_free (field);
++    } else if (type == GST_TYPE_INT_RANGE) {
++      const GValue *value;
++      int min, max;
++
++      value = gst_structure_get_value (s, field_name);
++      min = gst_value_get_int_range_min (value);
++      max = gst_value_get_int_range_max (value);
++
++      strings = print_gst_structure_dup_fields (strings, max - min + 1);
++
++      for (i = min; i <= max; i++) {
++        char *field;
++
++        field = g_strdup_printf ("(%s=%d)", field_name, i);
++        print_gst_structure_append_field_index (strings, field, max - min + 1, i - min);
++        g_free (field);
++      }
++    } else if (type == GST_TYPE_LIST) {
++      const GValue *value;
++      int num_items;
++
++      value = gst_structure_get_value (s, field_name);
++      num_items = gst_value_list_get_size (value);
++
++      strings = print_gst_structure_dup_fields (strings, num_items);
++
++      for (i = 0; i < num_items; i++) {
++        char *field;
++        const GValue *item_value;
++
++	item_value = gst_value_list_get_value (value, i);
++        field = g_strdup_printf ("(%s=%d)", field_name,
++        			 g_value_get_int (item_value));
++        print_gst_structure_append_field_index (strings, field, num_items, i);
++        g_free (field);
++      }
++    } else if (type == G_TYPE_STRING) {
++      char *field;
++      const char *value;
++
++      value = gst_structure_get_string (s, field_name);
++      field = g_strdup_printf ("(%s=%s)", field_name, value);
++      print_gst_structure_append_field (strings, field);
++      g_free (field);
++    } else {
++      g_warning ("unhandled type! %s", g_type_name (type));
++    }
++
++    g_free (field_name);
++  }
++
++  g_list_free (fields);
++
++  for (l = strings; l != NULL; l = l->next) {
++    string = l->data;
++    g_print ("%s\n", string->str);
++    g_string_free (string, TRUE);
++  }
++  g_list_free (strings);
++}
+ 
+ static void
+-print_plugin_automatic_install_info_codecs (GstElementFactory * factory)
++print_plugin_automatic_install_info_codecs (GstElementFactory * factory, gboolean rpm_format)
+ {
+   GstPadDirection direction;
+   const gchar *type_name;
+@@ -1251,15 +1461,19 @@ print_plugin_automatic_install_info_code
+     gst_structure_remove_field (s, "rate");
+     gst_structure_remove_field (s, "depth");
+     gst_structure_remove_field (s, "clock-rate");
+-    s_str = gst_structure_to_string (s);
+-    g_print ("%s-%s\n", type_name, s_str);
+-    g_free (s_str);
++    if (!rpm_format) {
++      s_str = gst_structure_to_string (s);
++      g_print ("%s-%s\n", type_name, s_str);
++      g_free (s_str);
++    } else {
++      print_gst_structure_for_rpm (type_name, s);
++    }
+   }
+   gst_caps_unref (caps);
+ }
+ 
+ static void
+-print_plugin_automatic_install_info_protocols (GstElementFactory * factory)
++print_plugin_automatic_install_info_protocols (GstElementFactory * factory, gboolean rpm_format)
+ {
+   gchar **protocols, **p;
+ 
+@@ -1268,11 +1482,17 @@ print_plugin_automatic_install_info_prot
+     switch (gst_element_factory_get_uri_type (factory)) {
+       case GST_URI_SINK:
+         for (p = protocols; *p != NULL; ++p)
+-          g_print ("urisink-%s\n", *p);
++          if (!rpm_format)
++            g_print ("urisink-%s\n", *p);
++          else
++            g_print ("gstreamer0.10(urisink-%s)\n", *p);
+         break;
+       case GST_URI_SRC:
+         for (p = protocols; *p != NULL; ++p)
+-          g_print ("urisource-%s\n", *p);
++          if (!rpm_format)
++            g_print ("urisource-%s\n", *p);
++          else
++            g_print ("gstreamer0.10(urisource-%s)\n", *p);
+         break;
+       default:
+         break;
+@@ -1282,7 +1502,7 @@ print_plugin_automatic_install_info_prot
+ }
+ 
+ static void
+-print_plugin_automatic_install_info (GstPlugin * plugin)
++print_plugin_automatic_install_info (GstPlugin * plugin, gboolean rpm_format)
+ {
+   const gchar *plugin_name;
+   GList *features, *l;
+@@ -1302,11 +1522,12 @@ print_plugin_automatic_install_info (Gst
+     if (g_str_equal (plugin_name, feature->plugin_name)) {
+       GstElementFactory *factory;
+ 
+-      g_print ("element-%s\n", gst_plugin_feature_get_name (feature));
++      if (!rpm_format)
++        g_print ("element-%s\n", gst_plugin_feature_get_name (feature));
+ 
+       factory = GST_ELEMENT_FACTORY (feature);
+-      print_plugin_automatic_install_info_protocols (factory);
+-      print_plugin_automatic_install_info_codecs (factory);
++      print_plugin_automatic_install_info_protocols (factory, rpm_format);
++      print_plugin_automatic_install_info_codecs (factory, rpm_format);
+     }
+   }
+ 
+@@ -1319,6 +1540,7 @@ main (int argc, char *argv[])
+ {
+   gboolean print_all = FALSE;
+   gboolean print_aii = FALSE;
++  gboolean print_aii_rpm = FALSE;
+   GOptionEntry options[] = {
+     {"print-all", 'a', 0, G_OPTION_ARG_NONE, &print_all,
+         N_("Print all elements"), NULL},
+@@ -1327,6 +1549,9 @@ main (int argc, char *argv[])
+               "provides.\n                                       "
+               "Useful in connection with external automatic plugin "
+               "installation mechanisms"), NULL},
++    {"rpm", '\0', 0, G_OPTION_ARG_NONE, &print_aii_rpm,
++       N_("Print the machine-parsable list of features of a plugin in RPM "
++       	  "Provides compatible-format"), NULL},
+     GST_TOOLS_GOPTION_VERSION,
+     {NULL}
+   };
+@@ -1384,7 +1609,7 @@ main (int argc, char *argv[])
+       /* if there is such a plugin, print out info */
+       if (plugin) {
+         if (print_aii) {
+-          print_plugin_automatic_install_info (plugin);
++          print_plugin_automatic_install_info (plugin, print_aii_rpm);
+         } else {
+           print_plugin_info (plugin);
+           print_plugin_features (plugin);
+@@ -1397,13 +1622,16 @@ main (int argc, char *argv[])
+ 
+           if (plugin) {
+             if (print_aii) {
+-              print_plugin_automatic_install_info (plugin);
++              print_plugin_automatic_install_info (plugin, print_aii_rpm);
+             } else {
+               print_plugin_info (plugin);
+               print_plugin_features (plugin);
+             }
+           } else {
+-            g_print (_("Could not load plugin file: %s\n"), error->message);
++            if (!print_aii_rpm)
++              g_print (_("Could not load plugin file: %s\n"), error->message);
++	    else
++              g_printerr (_("Could not load plugin file: %s\n"), error->message);
+             g_error_free (error);
+             return -1;
+           }
================================================================


More information about the pld-cvs-commit mailing list