+static void
+debug_dump_header (GstBin * bin, GstDebugGraphDetails details, GString * str)
+{
+ gchar *state_name = NULL;
+ gchar *param_name = NULL;
+
+ if (details & GST_DEBUG_GRAPH_SHOW_STATES) {
+ state_name = debug_dump_get_element_state (GST_ELEMENT (bin));
+ }
+ if (details & GST_DEBUG_GRAPH_SHOW_NON_DEFAULT_PARAMS) {
+ param_name = debug_dump_get_element_params (GST_ELEMENT (bin), details);
+ }
+
+ /* write header */
+ g_string_append_printf (str,
+ "digraph pipeline {\n"
+ " rankdir=LR;\n"
+ " fontname=\"sans\";\n"
+ " fontsize=\"10\";\n"
+ " labelloc=t;\n"
+ " nodesep=.1;\n"
+ " ranksep=.2;\n"
+ " label=\"<%s>\\n%s%s%s\";\n"
+ " node [style=filled, shape=box, fontsize=\"9\", fontname=\"sans\", margin=\"0.0,0.0\"];\n"
+ " edge [labelfontsize=\"6\", fontsize=\"9\", fontname=\"monospace\"];\n"
+ " \n"
+ " legend [\n"
+ " pos=\"0,0!\",\n"
+ " margin=\"0.05,0.05\",\n"
+ " label=\"Legend\\lElement-States: [~] void-pending, [0] null, [-] ready, [=] paused, [>] playing\\lPad-Activation: [-] none, [>] push, [<] pull\\lPad-Flags: [b]locked, [f]lushing, [b]locking; upper-case is set\\lPad-Task: [T] has started task, [t] has paused task\\l\"\n,"
+ " ];"
+ "\n", G_OBJECT_TYPE_NAME (bin), GST_OBJECT_NAME (bin),
+ (state_name ? state_name : ""), (param_name ? param_name : "")
+ );
+
+ if (state_name)
+ g_free (state_name);
+ if (param_name)
+ g_free (param_name);
+}
+
+static void
+debug_dump_footer (GString * str)
+{
+ g_string_append_printf (str, "}\n");
+}
+
+/*
+ * gst_debug_bin_to_dot_data:
+ * @bin: the top-level pipeline that should be analyzed
+ *
+ * To aid debugging applications one can use this method to obtain the whole
+ * network of gstreamer elements that form the pipeline into an dot file.
+ * This data can be processed with graphviz to get an image.
+ *
+ * Returns: (transfer full): a string containing the pipeline in graphviz
+ * dot format.
+ */
+gchar *
+gst_debug_bin_to_dot_data (GstBin * bin, GstDebugGraphDetails details)
+{
+ GString *str;
+
+ g_return_val_if_fail (GST_IS_BIN (bin), NULL);
+
+ str = g_string_new (NULL);
+
+ debug_dump_header (bin, details, str);
+ debug_dump_element (bin, details, str, 1);
+ debug_dump_footer (str);
+
+ return g_string_free (str, FALSE);
+}
+