[FFmpeg-devel] [PATCH v9 00/15] Execution Graph Printing
ffmpegagent
ffmpegagent at gmail.com
Sat May 3 11:22:30 EEST 2025
Shortest cover letter for my longest-running FFmpeg patchset:
* Apply
* Build
* Add the "-sg" switch to any FFmpeg command line
* Press 'q' when you don't want to wait
SG = Show Graph
Documentation and examples can be found here:
https://github.com/softworkz/ffmpeg_output_apis/wiki
Version Updates
===============
V2
==
* Rebased on top of Andreas' improvements
* Applied changes from review (thanks, Andreas)
V3
==
* Fixed all "new warnings"
* Fixed out-of-tree building (thanks, Michael)
V4
==
* Resolved merge conflict
* Fixed build on MinGW (missing include due to WIN32_LEAN_AND_MEAN being
defined) (thanks, Michael)
V5
==
* Applied changes as per review from Stefano (thanks!)
* Introduced AVTextFormatOptions struct for options in
avtext_context_open()
V6
==
* Fix "new warning" in 2nd last commit
* Squash patches 04 and 05 (they weren't truely independent)
* Applied changes as per review from Stefano (thanks!)
V7
==
* Bitten by OOT builds once again (thanks, Michael)
V8
==
* New commit Remove void (*print_rational) from AVTextFormatter (unused)
* New commit fftools/textformat: Rename name param to key for API
consistency
* print_int Extend existing function instead of adding print_int_flags
* Fix registered_formatters[] array size
* avtextwriters.h: Remove unused includes
* graphprint.c: Make BPrint inits consistent
* tf_json: Check nesting level for value printing
* And other review suggestions by Stefano (thanks!)
V9
==
* Handle cases where no zlib is available (thanks, Michael)
and provide configure switch (--disable-resource-compression)
.
softworkz (15):
fftools/textformat: Formatting and whitespace changes
fftools/textformat: Apply quality improvements
fftools/textformat: Remove unused print_rational() pointer from
AVTextFormatter
fftools/textformat: Rename name param to key for API consistency
fftools/avtextformat: Re-use BPrint in loop
fftools/textformat: Introduce AVTextFormatOptions for
avtext_context_open()
fftools/textformat: Introduce common header and deduplicate code
fftools/tf_internal: Use av_default_item_name
fftools/textformat: Add flags param to function avtext_print_integer()
fftools/ffmpeg_filter: Move some declaration to new header file
avfilter/avfilter: Add avfilter_link_get_hw_frames_ctx()
fftools/resources: Add resource manager files with build-time
compression
fftools/ffmpeg_mux: Make ms_from_ost() inline
fftools/graphprint: Add execution graph printing
fftools/graphprint: Now, make it a Killer-Feature!
configure | 5 +
doc/APIchanges | 3 +
doc/ffmpeg.texi | 14 +
ffbuild/common.mak | 43 +-
fftools/Makefile | 22 +-
fftools/ffmpeg.c | 4 +
fftools/ffmpeg.h | 4 +
fftools/ffmpeg_filter.c | 195 +----
fftools/ffmpeg_filter.h | 234 ++++++
fftools/ffmpeg_mux.h | 2 +-
fftools/ffmpeg_opt.c | 17 +
fftools/ffprobe.c | 15 +-
fftools/graph/filelauncher.c | 205 +++++
fftools/graph/graphprint.c | 1148 ++++++++++++++++++++++++++++
fftools/graph/graphprint.h | 62 ++
fftools/resources/.gitignore | 4 +
fftools/resources/Makefile | 13 +
fftools/resources/graph.css | 353 +++++++++
fftools/resources/graph.html | 86 +++
fftools/resources/resman.c | 232 ++++++
fftools/resources/resman.h | 50 ++
fftools/textformat/avtextformat.c | 242 +++---
fftools/textformat/avtextformat.h | 78 +-
fftools/textformat/avtextwriters.h | 16 +-
fftools/textformat/tf_compact.c | 121 +--
fftools/textformat/tf_default.c | 55 +-
fftools/textformat/tf_flat.c | 51 +-
fftools/textformat/tf_ini.c | 62 +-
fftools/textformat/tf_internal.h | 81 ++
fftools/textformat/tf_json.c | 64 +-
fftools/textformat/tf_mermaid.c | 658 ++++++++++++++++
fftools/textformat/tf_mermaid.h | 41 +
fftools/textformat/tf_xml.c | 68 +-
fftools/textformat/tw_avio.c | 18 +-
fftools/textformat/tw_buffer.c | 9 +-
fftools/textformat/tw_stdout.c | 10 +-
libavfilter/avfilter.c | 9 +
libavfilter/avfilter.h | 12 +
38 files changed, 3725 insertions(+), 581 deletions(-)
create mode 100644 fftools/ffmpeg_filter.h
create mode 100644 fftools/graph/filelauncher.c
create mode 100644 fftools/graph/graphprint.c
create mode 100644 fftools/graph/graphprint.h
create mode 100644 fftools/resources/.gitignore
create mode 100644 fftools/resources/Makefile
create mode 100644 fftools/resources/graph.css
create mode 100644 fftools/resources/graph.html
create mode 100644 fftools/resources/resman.c
create mode 100644 fftools/resources/resman.h
create mode 100644 fftools/textformat/tf_internal.h
create mode 100644 fftools/textformat/tf_mermaid.c
create mode 100644 fftools/textformat/tf_mermaid.h
base-commit: 33d0d1c672e8d21f625eeea42444a018dbc616bb
Published-As: https://github.com/ffstaging/FFmpeg/releases/tag/pr-ffstaging-66%2Fsoftworkz%2Fsubmit_print_execution_graph-v9
Fetch-It-Via: git fetch https://github.com/ffstaging/FFmpeg pr-ffstaging-66/softworkz/submit_print_execution_graph-v9
Pull-Request: https://github.com/ffstaging/FFmpeg/pull/66
Range-diff vs v8:
1: ad156d4853 = 1: 7e8fddd1b8 fftools/textformat: Formatting and whitespace changes
2: fd59be673d = 2: 86ea1c4df5 fftools/textformat: Apply quality improvements
3: 4727f424d3 = 3: 455c13c6ff fftools/textformat: Remove unused print_rational() pointer from AVTextFormatter
4: 43d00310c4 = 4: 624ac50f29 fftools/textformat: Rename name param to key for API consistency
5: 606fa7866a = 5: 26af65e6f2 fftools/avtextformat: Re-use BPrint in loop
6: 95ef1f0919 = 6: 3aa16bc39f fftools/textformat: Introduce AVTextFormatOptions for avtext_context_open()
7: dafd10253d = 7: 10c5e71cd1 fftools/textformat: Introduce common header and deduplicate code
8: a4b1fb9cc0 = 8: 4c1471f65c fftools/tf_internal: Use av_default_item_name
9: a18ccba001 = 9: 7d28b0f03c fftools/textformat: Add flags param to function avtext_print_integer()
10: 456423f436 = 10: a0d38f429a fftools/ffmpeg_filter: Move some declaration to new header file
11: 07c0d5b09b = 11: 53db985728 avfilter/avfilter: Add avfilter_link_get_hw_frames_ctx()
12: 249899886e ! 12: abc273dd0a fftools/resources: Add resource manager files
@@ Metadata
Author: softworkz <softworkz at hotmail.com>
## Commit message ##
- fftools/resources: Add resource manager files
+ fftools/resources: Add resource manager files with build-time compression
+
+ Compression requires zlib to be available, otherwise resources will
+ be included uncompressed - in either case via BIN2C.
+
+ It can also be disabled via
+
+ ./configure --disable-resource-compression
+
+ Size figures:
+
+ graph.css 7752
+ graph.css.min 6655 (css is always minified)
+ graph.html 2153
+
+ No Compression
+
+ graph.css.c 40026
+ graph.css.o 9344 (6688)
+ graph.html.c 13016
+ graph.html.o 4848 (2186)
+
+ With Compression
+
+ graph.css.c 10206
+ graph.css.o 4368 (1718)
+ graph.html.c 5725
+ graph.html.o 3632 (971)
+
+ Numbers in brackets: .rodata size from 'size -Ax -d *.o'
Signed-off-by: softworkz <softworkz at hotmail.com>
+ ## configure ##
+@@ configure: Developer options (useful when working on FFmpeg itself):
+ --enable-macos-kperf enable macOS kperf (private) API
+ --disable-large-tests disable tests that use a large amount of memory
+ --disable-ptx-compression don't compress CUDA PTX code even when possible
++ --disable-resource-compression don't compress resources even when possible
+ --disable-version-tracking don't include the git/release version in the build
+
+ NOTE: Object files are built at the place where configure is launched.
+@@ configure: CONFIG_LIST="
+ ossfuzz
+ pic
+ ptx_compression
++ resource_compression
+ thumb
+ valgrind_backtrace
+ xmm_clobber_test
+@@ configure: enable iamf
+ enable large_tests
+ enable optimizations
+ enable ptx_compression
++enable resource_compression
+ enable runtime_cpudetect
+ enable safe_bitstream_reader
+ enable static
+@@ configure: EOF
+
+ enabled zlib_gzip && enabled gzip || disable ptx_compression
+
++enabled zlib_gzip && enabled gzip || disable resource_compression
++
+ # On some systems dynamic loading requires no extra linker flags
+ check_lib libdl dlfcn.h "dlopen dlsym" || check_lib libdl dlfcn.h "dlopen dlsym" -ldl
+
+
## ffbuild/common.mak ##
@@ ffbuild/common.mak: else
$(BIN2C) $(patsubst $(SRC_PATH)/%,$(SRC_LINK)/%,$<) $@ $(subst .,_,$(basename $(notdir $@)))
@@ ffbuild/common.mak: else
+ | sed 's/^ //; s/ $$//' \
+ > $@
+
++ifdef CONFIG_RESOURCE_COMPRESSION
++
+# 2) Gzip the minified CSS
+%.css.min.gz: %.css.min
-+ $(M)gzip -nc9 $(patsubst $(SRC_PATH)/%,$(SRC_LINK)/%,$<) >$@
++ $(M)gzip -nc9 $< > $@
+
+# 3) Convert the gzipped CSS to a .c array
+%.css.c: %.css.min.gz $(BIN2CEXE)
-+ $(BIN2C) $(patsubst $(SRC_PATH)/%,$(SRC_LINK)/%,$<) $@ $(subst .,_,$(basename $(notdir $@)))
++ $(BIN2C) $< $@ $(subst .,_,$(basename $(notdir $@)))
+
+# 4) Gzip the HTML file (no minification needed)
-+%.html.gz: TAG = GZIP
+%.html.gz: %.html
-+ $(M)gzip -nc9 $(patsubst $(SRC_PATH)/%,$(SRC_LINK)/%,$<) > $@
++ $(M)gzip -nc9 $< > $@
+
+# 5) Convert the gzipped HTML to a .c array
+%.html.c: %.html.gz $(BIN2CEXE)
-+ $(BIN2C) $(patsubst $(SRC_PATH)/%,$(SRC_LINK)/%,$<) $@ $(subst .,_,$(basename $(notdir $@)))
++ $(BIN2C) $< $@ $(subst .,_,$(basename $(notdir $@)))
++
++else # NO COMPRESSION
++
++# 2) Convert the minified CSS to a .c array
++%.css.c: %.css.min $(BIN2CEXE)
++ $(BIN2C) $< $@ $(subst .,_,$(basename $(notdir $@)))
++
++# 3) Convert the plain HTML to a .c array
++%.html.c: %.html $(BIN2CEXE)
++ $(BIN2C) $< $@ $(subst .,_,$(basename $(notdir $@)))
++endif
+
clean::
$(RM) $(BIN2CEXE) $(CLEANSUFFIXES:%=ffbuild/%)
+@@ ffbuild/common.mak: SKIPHEADERS += $(ARCH_HEADERS:%=$(ARCH)/%) $(SKIPHEADERS-)
+ SKIPHEADERS := $(SKIPHEADERS:%=$(SUBDIR)%)
+ HOBJS = $(filter-out $(SKIPHEADERS:.h=.h.o),$(ALLHEADERS:.h=.h.o))
+ PTXOBJS = $(filter %.ptx.o,$(OBJS))
++RESOURCEOBJS = $(filter %.css.o %.html.o,$(OBJS))
+ $(HOBJS): CCFLAGS += $(CFLAGS_HEADERS)
+ checkheaders: $(HOBJS)
+-.SECONDARY: $(HOBJS:.o=.c) $(PTXOBJS:.o=.c) $(PTXOBJS:.o=.gz) $(PTXOBJS:.o=)
++.SECONDARY: $(HOBJS:.o=.c) $(PTXOBJS:.o=.c) $(PTXOBJS:.o=.gz) $(PTXOBJS:.o=) $(RESOURCEOBJS:.o=.c) $(RESOURCEOBJS:%.css.o=%.css.min) $(RESOURCEOBJS:%.css.o=%.css.min.gz) $(RESOURCEOBJS:%.html.o=%.html.gz) $(RESOURCEOBJS:.o=)
+
+ alltools: $(TOOLS)
+
@@ ffbuild/common.mak: $(TOOLOBJS): | tools
OUTDIRS := $(OUTDIRS) $(dir $(OBJS) $(HOBJS) $(HOSTOBJS) $(SLIBOBJS) $(SHLIBOBJS) $(STLIBOBJS) $(TESTOBJS))
@@ fftools/resources/Makefile (new)
+clean::
+ $(RM) $(CLEANSUFFIXES:%=fftools/resources/%)
+
++vpath %.html $(SRC_PATH)
++vpath %.css $(SRC_PATH)
+
-+HTML_RESOURCES := $(SRC_PATH)/fftools/resources/graph.html \
-+
-+# .html => (gzip) .html.gz => (bin2c) .html.c => (cc) .o
-+HTML_RESOURCES_GZ := $(HTML_RESOURCES:.html=.html.gz)
-+HTML_RESOURCES_C := $(HTML_RESOURCES_GZ:.html.gz=.html.c)
-+HTML_RESOURCES_OBJS := $(HTML_RESOURCES_C:.c=.o)
-+
-+CSS_RESOURCES := $(SRC_PATH)/fftools/resources/graph.css \
-+
-+# .css => (sh) .css.min => (gzip) .css.min.gz => (bin2c) .css.c => (cc) .o
-+CSS_RESOURCES_MIN := $(CSS_RESOURCES:.css=.css.min)
-+CSS_RESOURCES_GZ := $(CSS_RESOURCES_MIN:.css.min=.css.min.gz)
-+CSS_RESOURCES_C := $(CSS_RESOURCES_GZ:.css.min.gz=.css.c)
-+CSS_RESOURCES_OBJS := $(CSS_RESOURCES_C:.c=.o)
-+
-+# Uncomment to prevent deletion
++# Uncomment to prevent deletion during build
+#.PRECIOUS: %.css.c %.css.min %.css.gz %.css.min.gz %.html.gz %.html.c
+
-+OBJS-resman += \
-+ fftools/resources/resman.o \
-+ $(HTML_RESOURCES_OBJS) \
-+ $(CSS_RESOURCES_OBJS) \
-+
++OBJS-resman += \
++ fftools/resources/resman.o \
++ fftools/resources/graph.html.o \
++ fftools/resources/graph.css.o \
## fftools/resources/graph.css (new) ##
@@
@@ fftools/resources/resman.c (new)
+#include "config.h"
+
+#include <string.h>
++
++#if CONFIG_RESOURCE_COMPRESSION
+#include <zlib.h>
++#endif
++
+#include "resman.h"
+#include <libavformat/url.h>
+#include "fftools/ffmpeg_filter.h"
@@ fftools/resources/resman.c (new)
+ResourceManagerContext *resman_ctx = NULL;
+
+
++#if CONFIG_RESOURCE_COMPRESSION
++
+static int decompress_gzip(ResourceManagerContext *ctx, uint8_t *in, unsigned in_len, char **out, size_t *out_len)
+{
+ z_stream strm;
@@ fftools/resources/resman.c (new)
+ *out = (char *)buf;
+ return Z_OK;
+}
++#endif
+
+static ResourceManagerContext *get_resman_context(void)
+{
@@ fftools/resources/resman.c (new)
+ dic_entry = av_dict_get(ctx->resource_dic, resource_definition.name, NULL, 0);
+
+ if (!dic_entry) {
++ int dict_ret;
++
++#if CONFIG_RESOURCE_COMPRESSION
++
+ char *out = NULL;
+ size_t out_len;
-+ int dict_ret;
+
+ int ret = decompress_gzip(ctx, (uint8_t *)resource_definition.data, *resource_definition.data_len, &out, &out_len);
+
@@ fftools/resources/resman.c (new)
+ }
+
+ av_freep(&out);
++#else
++
++ dict_ret = av_dict_set(&ctx->resource_dic, resource_definition.name, (const char *)resource_definition.data, 0);
++ if (dict_ret < 0) {
++ av_log(NULL, AV_LOG_ERROR, "Failed to store resource in dictionary: %d\n", dict_ret);
++ goto end;
++ }
++
++#endif
+ dic_entry = av_dict_get(ctx->resource_dic, resource_definition.name, NULL, 0);
+
+ if (!dic_entry) {
13: 58c7b1c142 = 13: 690752591e fftools/ffmpeg_mux: Make ms_from_ost() inline
14: 3a090c9e60 = 14: adbf4840ef fftools/graphprint: Add execution graph printing
15: 578373f8c2 = 15: b4ca4db8fd fftools/graphprint: Now, make it a Killer-Feature!
--
ffmpeg-codebot
More information about the ffmpeg-devel
mailing list