[FFmpeg-devel] [PATCH v4 2/2] avdevice/lavf: add more options to dump filter graph

lance.lmwang at gmail.com lance.lmwang at gmail.com
Sat May 23 02:54:33 EEST 2020


From: Limin Wang <lance.lmwang at gmail.com>

Signed-off-by: Limin Wang <lance.lmwang at gmail.com>
---
 doc/indevs.texi     | 16 ++++++++++++++--
 libavdevice/lavfi.c | 19 +++++++++++++------
 2 files changed, 27 insertions(+), 8 deletions(-)

diff --git a/doc/indevs.texi b/doc/indevs.texi
index 6f5afaf..a1bd9e1 100644
--- a/doc/indevs.texi
+++ b/doc/indevs.texi
@@ -973,8 +973,20 @@ Set the filename of the filtergraph to be read and sent to the other
 filters. Syntax of the filtergraph is the same as the one specified by
 the option @var{graph}.
 
- at item dumpgraph
-Dump graph to stderr.
+ at item dumpgraph @var{filename}
+Set the filename of filtergraph for dump.
+
+It is "ASCII" format by default. for Graphviz DOT output format,
+you can convert it to png by GraphViz tool:
+ at example
+dot -Tpng dump_fg_filename -o dump_graph.png
+ at end example
+
+ at item dumpgraph_format @var{format}
+Set the output format of filtergraph for dump. Support format: "DOT", "ASCII".
+
+DOT is the text file format of the suite GraphViz, ASCII is the text file format
+of ASCII style.
 
 @end table
 
diff --git a/libavdevice/lavfi.c b/libavdevice/lavfi.c
index c949ff7..18b5f07 100644
--- a/libavdevice/lavfi.c
+++ b/libavdevice/lavfi.c
@@ -47,7 +47,8 @@ typedef struct {
     AVClass *class;          ///< class for private options
     char          *graph_str;
     char          *graph_filename;
-    char          *dump_graph;
+    char          *dump_fg_filename;
+    char          *dump_fg_format;
     AVFilterGraph *graph;
     AVFilterContext **sinks;
     int *sink_stream_map;
@@ -300,11 +301,16 @@ av_cold static int lavfi_read_header(AVFormatContext *avctx)
     if ((ret = avfilter_graph_config(lavfi->graph, avctx)) < 0)
         goto end;
 
-    if (lavfi->dump_graph) {
-        char *dump = avfilter_graph_dump(lavfi->graph, lavfi->dump_graph);
+    if (lavfi->dump_fg_filename) {
+        char *dump = avfilter_graph_dump(lavfi->graph, lavfi->dump_fg_format);
+        FILE *fg_file = fopen(lavfi->dump_fg_filename, "w");
+
+        if (!fg_file)
+            FAIL(AVERROR(ENOMEM));
         if (dump != NULL) {
-            fputs(dump, stderr);
-            fflush(stderr);
+            fputs(dump, fg_file);
+            fflush(fg_file);
+            fclose(fg_file);
             av_free(dump);
         } else {
             FAIL(AVERROR(ENOMEM));
@@ -493,7 +499,8 @@ static int lavfi_read_packet(AVFormatContext *avctx, AVPacket *pkt)
 static const AVOption options[] = {
     { "graph",     "set libavfilter graph", OFFSET(graph_str),  AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, DEC },
     { "graph_file","set libavfilter graph filename", OFFSET(graph_filename), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, DEC},
-    { "dumpgraph", "dump graph to stderr",  OFFSET(dump_graph), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, DEC },
+    { "dumpgraph", "set dump graph filename",  OFFSET(dump_fg_filename), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, DEC },
+    { "dumpgraph_format", "set dump graph format, DOT or ASCII",  OFFSET(dump_fg_format), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, DEC },
     { NULL },
 };
 
-- 
2.6.4



More information about the ffmpeg-devel mailing list