[gst-cvs] gstreamer: dump2dot: improve caps logging
Stefan Kost
ensonic at kemper.freedesktop.org
Sat Mar 7 14:33:41 PST 2009
Module: gstreamer
Branch: master
Commit: fd0b4ff60b31ca06feccd2c70e93938bbc4e5756
URL: http://cgit.freedesktop.org/gstreamer/gstreamer/commit/?id=fd0b4ff60b31ca06feccd2c70e93938bbc4e5756
Author: Stefan Kost <ensonic at users.sf.net>
Date: Sun Mar 8 00:27:26 2009 +0200
dump2dot: improve caps logging
Factor out code to describe caps. Improve formating (no \n in caps fields).
Check peer caps too and show both if they differ.
---
gst/gstdebugutils.c | 94 ++++++++++++++++++++++++++++++++++++++++++--------
1 files changed, 79 insertions(+), 15 deletions(-)
diff --git a/gst/gstdebugutils.c b/gst/gstdebugutils.c
index c115a10..888deb4 100644
--- a/gst/gstdebugutils.c
+++ b/gst/gstdebugutils.c
@@ -204,15 +204,65 @@ debug_dump_element_pad (GstPad * pad, GstElement * element,
g_free (spc);
}
+static gchar *
+debug_dump_describe_caps (GstCaps * caps, GstDebugGraphDetails details,
+ gboolean * need_free)
+{
+ gchar *media = NULL;
+
+ if (details & GST_DEBUG_GRAPH_SHOW_CAPS_DETAILS) {
+ gchar *tmp = gst_caps_to_string (caps);
+ gboolean in_bracket = FALSE;
+ gint i, sl = strlen (tmp);
+
+ for (i = 0; i < sl; i++) {
+ switch (tmp[i]) {
+ case ';':
+ if (i < (sl - 1))
+ tmp[i] = '\n';
+ else
+ tmp[i] = '\0';
+ break;
+ case ',':
+ if (!in_bracket)
+ tmp[i] = '\n';
+ break;
+ case '(':
+ case '{':
+ case '[':
+ in_bracket = TRUE;
+ break;
+ case ')':
+ case '}':
+ case ']':
+ in_bracket = FALSE;
+ break;
+ }
+ }
+
+ media = g_strescape (tmp, NULL);
+ *need_free = TRUE;
+ g_free (tmp);
+
+ } else {
+ if (GST_CAPS_IS_SIMPLE (caps))
+ media =
+ (gchar *) gst_structure_get_name (gst_caps_get_structure (caps, 0));
+ else
+ media = "*";
+ *need_free = FALSE;
+ }
+ return media;
+}
+
static void
debug_dump_element_pad_link (GstPad * pad, GstElement * element,
GstDebugGraphDetails details, FILE * out, const gint indent)
{
GstElement *peer_element, *target_element;
GstPad *peer_pad, *target_pad, *tmp_pad;
- GstCaps *caps;
- GstStructure *structure;
- gboolean free_caps, free_media;
+ GstCaps *caps, *peer_caps;
+ gboolean free_caps, free_peer_caps, free_media;
gchar *media = NULL;
gchar *pad_name, *element_name;
gchar *peer_pad_name, *peer_element_name;
@@ -238,25 +288,39 @@ debug_dump_element_pad_link (GstPad * pad, GstElement * element,
media = "?";
}
}
+ if ((peer_caps = gst_pad_get_negotiated_caps (peer_pad))) {
+ free_peer_caps = TRUE;
+ } else {
+ free_peer_caps = FALSE;
+ peer_caps = (GstCaps *) gst_pad_get_pad_template_caps (peer_pad);
+ }
if (caps) {
- if (details & GST_DEBUG_GRAPH_SHOW_CAPS_DETAILS) {
- gchar *tmp = g_strdelimit (gst_caps_to_string (caps), ",",
- '\n');
-
- media = g_strescape (tmp, NULL);
+ media = debug_dump_describe_caps (caps, details, &free_media);
+ /* check if peer caps are different */
+ if (peer_caps && !gst_caps_is_equal (caps, peer_caps)) {
+ gchar *old_media = media;
+ gchar *tmp;
+ gboolean free_tmp;
+
+ tmp = debug_dump_describe_caps (peer_caps, details, &free_tmp);
+ if (gst_pad_get_direction (pad) == GST_PAD_SRC) {
+ media = g_strdup_printf ("%s\\n---\\n%s", media, tmp);
+ } else {
+ media = g_strdup_printf ("%s\\n---\\n%s", tmp, media);
+ }
+ if (free_media)
+ g_free (old_media);
+ if (free_tmp)
+ g_free (tmp);
free_media = TRUE;
- g_free (tmp);
- } else {
- if (GST_CAPS_IS_SIMPLE (caps)) {
- structure = gst_caps_get_structure (caps, 0);
- media = (gchar *) gst_structure_get_name (structure);
- } else
- media = "*";
}
if (free_caps) {
gst_caps_unref (caps);
}
}
+ if (free_peer_caps && peer_caps) {
+ gst_caps_unref (peer_caps);
+ }
}
pad_name = debug_dump_make_object_name (GST_OBJECT (pad));
More information about the Gstreamer-commits
mailing list