From cfe59c285c411a246c8bf8b64e95118fc97a77fe Mon Sep 17 00:00:00 2001 From: Graham Leggett Date: Sun, 11 Jun 2017 15:15:13 +0000 Subject: [PATCH] Generate a gstreamer pipeline diagram on SIGHUP. Useful for debugging a pipeline that refuses to enter a given state. https://bugzilla.gnome.org/show_bug.cgi?id=783661 --- docs/gst/running.xml | 6 ++++++ tools/gst-launch-1.0.1 | 4 ++++ tools/gst-launch.c | 36 ++++++++++++++++++++++++++++++------ 3 files changed, 40 insertions(+), 6 deletions(-) diff --git a/docs/gst/running.xml b/docs/gst/running.xml index 6b6b117..9e4b3ef 100644 --- a/docs/gst/running.xml +++ b/docs/gst/running.xml @@ -357,6 +357,12 @@ strategic places (like when the pipeline state changes or an error occurs). gst-launch-&GST_API_VERSION; is one such application. +When gst-launch-&GST_API_VERSION; changes state through NULL to PLAYING +and back to NULL, a dot file is generated on each state change. To have +gst-launch-&GST_API_VERSION; write a snapshot of the pipeline state, send +a SIGHUP to the gst-launch-&GST_API_VERSION; process. + + These .dot files can then be turned into images using the 'dot' utility from the graphviz set of tools, like this: dot foo.dot -Tsvg -o foo.svg or diff --git a/tools/gst-launch-1.0.1 b/tools/gst-launch-1.0.1 index fe962ab..33a7d14 100644 --- a/tools/gst-launch-1.0.1 +++ b/tools/gst-launch-1.0.1 @@ -434,6 +434,10 @@ These can then later be converted into an image using the 'dot' utility from the graphviz set of tools, like this: dot foo.dot \-Tsvg \-o foo.svg (png or jpg are also possible as output format). There is also a utility called 'xdot' which allows you to view the .dot file directly without converting it first. +.br +When the pipeline changes state through NULL to PLAYING and back to NULL, a +dot file is generated on each state change. To write a snapshot of the +pipeline state, send a SIGHUP to the process. .TP \fBGST_REGISTRY\fR Path of the plugin registry file. Default is diff --git a/tools/gst-launch.c b/tools/gst-launch.c index e277f2e..98111db 100644 --- a/tools/gst-launch.c +++ b/tools/gst-launch.c @@ -467,7 +467,8 @@ print_toc_entry (gpointer data, gpointer user_data) } #if defined(G_OS_UNIX) || defined(G_OS_WIN32) -static guint signal_watch_id; +static guint signal_watch_intr_id; +static guint signal_watch_hup_id; #if defined(G_OS_WIN32) static GstElement *intr_pipeline; #endif @@ -490,8 +491,27 @@ intr_handler (gpointer user_data) "message", G_TYPE_STRING, "Pipeline interrupted", NULL))); /* remove signal handler */ - signal_watch_id = 0; - return FALSE; + signal_watch_intr_id = 0; + return G_SOURCE_REMOVE; +} + +static gboolean +hup_handler (gpointer user_data) +{ + GstElement *pipeline = (GstElement *) user_data; + + if (g_getenv ("GST_DEBUG_DUMP_DOT_DIR") != NULL) { + PRINT ("SIGHUP: dumping dot file snapshot ...\n"); + } else { + PRINT ("SIGHUP: not dumping dot file snapshot, GST_DEBUG_DUMP_DOT_DIR " + "environment variable not set.\n"); + } + + /* dump graph on hup */ + GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS (GST_BIN (pipeline), + GST_DEBUG_GRAPH_SHOW_ALL, "gst-launch.snapshot"); + + return G_SOURCE_CONTINUE; } #if defined(G_OS_WIN32) /* G_OS_UNIX */ @@ -521,8 +541,10 @@ event_loop (GstElement * pipeline, gboolean blocking, gboolean do_progress, bus = gst_element_get_bus (GST_ELEMENT (pipeline)); #ifdef G_OS_UNIX - signal_watch_id = + signal_watch_intr_id = g_unix_signal_add (SIGINT, (GSourceFunc) intr_handler, pipeline); + signal_watch_hup_id = + g_unix_signal_add (SIGHUP, (GSourceFunc) hup_handler, pipeline); #elif defined(G_OS_WIN32) intr_pipeline = NULL; if (SetConsoleCtrlHandler (w32_intr_handler, TRUE)) @@ -893,8 +915,10 @@ exit: gst_message_unref (message); gst_object_unref (bus); #ifdef G_OS_UNIX - if (signal_watch_id > 0) - g_source_remove (signal_watch_id); + if (signal_watch_intr_id > 0) + g_source_remove (signal_watch_intr_id); + if (signal_watch_hup_id > 0) + g_source_remove (signal_watch_hup_id); #elif defined(G_OS_WIN32) intr_pipeline = NULL; SetConsoleCtrlHandler (w32_intr_handler, FALSE); -- 2.7.4