gst: debug: Add information about active tracers in dot files

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/8820>
This commit is contained in:
Thibault Saunier 2025-04-10 17:32:19 -04:00 committed by GStreamer Marge Bot
parent 67cafe5999
commit 33f58f9da7

View File

@ -60,6 +60,7 @@
#include "gstobject.h" #include "gstobject.h"
#include "gstghostpad.h" #include "gstghostpad.h"
#include "gstpad.h" #include "gstpad.h"
#include "gsttracer.h"
#include "gstutils.h" #include "gstutils.h"
#include "gstvalue.h" #include "gstvalue.h"
#include "gstidstr-private.h" #include "gstidstr-private.h"
@ -109,7 +110,8 @@ debug_dump_get_element_state (GstElement * element)
static gchar * static gchar *
debug_dump_get_object_params (GObject * object, debug_dump_get_object_params (GObject * object,
GstDebugGraphDetails details, const char *const *ignored_propnames) GstDebugGraphDetails details, const char *const *ignored_propnames,
const gchar * prop_separator)
{ {
gchar *param_name = NULL; gchar *param_name = NULL;
GParamSpec **properties, *property; GParamSpec **properties, *property;
@ -215,12 +217,13 @@ debug_dump_get_object_params (GObject * object,
tmp = (char *) ""; tmp = (char *) "";
if (details & GST_DEBUG_GRAPH_SHOW_FULL_PARAMS) { if (details & GST_DEBUG_GRAPH_SHOW_FULL_PARAMS) {
param_name = g_strdup_printf ("%s\\n%s=%s", tmp, property->name, param_name =
g_strdup_printf ("%s%s%s=%s", tmp, prop_separator, property->name,
value_str); value_str);
} else { } else {
param_name = g_strdup_printf ("%s\\n%s=%." param_name = g_strdup_printf ("%s%s%s=%."
G_STRINGIFY (PARAM_MAX_LENGTH) "s%s", tmp, property->name, G_STRINGIFY (PARAM_MAX_LENGTH) "s%s", tmp, prop_separator,
value_str, ellipses); property->name, value_str, ellipses);
} }
if (tmp[0] != '\0') if (tmp[0] != '\0')
@ -264,7 +267,8 @@ debug_dump_pad (GstPad * pad, const gchar * color_name,
} }
param_name = param_name =
debug_dump_get_object_params (G_OBJECT (pad), details, ignore_propnames); debug_dump_get_object_params (G_OBJECT (pad), details, ignore_propnames,
"\n");
if (details & GST_DEBUG_GRAPH_SHOW_STATES) { if (details & GST_DEBUG_GRAPH_SHOW_STATES) {
gchar pad_flags[5]; gchar pad_flags[5];
const gchar *activation_mode = "-><"; const gchar *activation_mode = "-><";
@ -643,7 +647,7 @@ debug_dump_element (GstBin * bin, GstDebugGraphDetails details,
} }
if (details & GST_DEBUG_GRAPH_SHOW_NON_DEFAULT_PARAMS) { if (details & GST_DEBUG_GRAPH_SHOW_NON_DEFAULT_PARAMS) {
param_name = debug_dump_get_object_params (G_OBJECT (element), param_name = debug_dump_get_object_params (G_OBJECT (element),
details, ignore_propnames); details, ignore_propnames, "\n");
} }
/* elements */ /* elements */
g_string_append_printf (str, "%ssubgraph cluster_%s {\n", spc, g_string_append_printf (str, "%ssubgraph cluster_%s {\n", spc,
@ -759,17 +763,53 @@ debug_dump_element (GstBin * bin, GstDebugGraphDetails details,
gst_iterator_free (element_iter); gst_iterator_free (element_iter);
} }
static gchar *
debug_dump_get_tracers_info (GstDebugGraphDetails details)
{
GList *tracers, *tmp;
tracers = gst_tracing_get_active_tracers ();
if (!tracers)
return NULL;
GString *str = g_string_new ("Active Tracers:");
for (tmp = tracers; tmp; tmp = tmp->next) {
GObject *tracer = G_OBJECT (tmp->data);
gchar *props = NULL;
g_string_append_printf (str, "\\l - %s", G_OBJECT_TYPE_NAME (tracer));
if (details & GST_DEBUG_GRAPH_SHOW_NON_DEFAULT_PARAMS) {
props =
debug_dump_get_object_params (tracer, details, NULL, "\\l * ");
if (props) {
g_string_append_c (str, ':');
g_string_append_printf (str, " %s", props);
}
g_free (props);
}
/* Make sure each tracer line ends with \l even if it has no properties */
g_string_append (str, "\\l");
}
g_list_free (tracers);
return g_string_free (str, FALSE);
}
static void static void
debug_dump_header (GstBin * bin, GstDebugGraphDetails details, GString * str) debug_dump_header (GstBin * bin, GstDebugGraphDetails details, GString * str)
{ {
gchar *state_name = NULL; gchar *state_name = NULL;
gchar *param_name = NULL; gchar *param_name = NULL;
gchar *tracers_info = NULL;
if (details & GST_DEBUG_GRAPH_SHOW_STATES) { if (details & GST_DEBUG_GRAPH_SHOW_STATES) {
state_name = debug_dump_get_element_state (GST_ELEMENT (bin)); state_name = debug_dump_get_element_state (GST_ELEMENT (bin));
} }
if (details & GST_DEBUG_GRAPH_SHOW_NON_DEFAULT_PARAMS) { if (details & GST_DEBUG_GRAPH_SHOW_NON_DEFAULT_PARAMS) {
param_name = debug_dump_get_object_params (G_OBJECT (bin), details, NULL); param_name =
debug_dump_get_object_params (G_OBJECT (bin), details, NULL, "\n");
} }
/* write header */ /* write header */
@ -795,10 +835,23 @@ debug_dump_header (GstBin * bin, GstDebugGraphDetails details, GString * str)
(state_name ? state_name : ""), (param_name ? param_name : "") (state_name ? state_name : ""), (param_name ? param_name : "")
); );
tracers_info = debug_dump_get_tracers_info (details);
if (tracers_info) { /* More than just "Active Tracers:\l" */
g_string_append_printf (str,
" tracers [\n"
" pos=\"0,0!\",\n"
" margin=\"0.05,0.05\",\n"
" style=\"filled\",\n"
" fillcolor=\"#e0e0ff\",\n"
" label=\"%s\",\n" " ];\n" "\n", tracers_info);
}
if (state_name) if (state_name)
g_free (state_name); g_free (state_name);
if (param_name) if (param_name)
g_free (param_name); g_free (param_name);
if (tracers_info)
g_free (tracers_info);
} }
static void static void