[FFmpeg-devel] [PATCH] avfiltergraph: display more info when auto-insert filter

zhushiqshi hiccupzhu at gmail.com
Thu Dec 5 05:23:26 EET 2024


---
 libavfilter/avfiltergraph.c | 64 +++++++++++++++++++++++++++++++++++++
 1 file changed, 64 insertions(+)

diff --git a/libavfilter/avfiltergraph.c b/libavfilter/avfiltergraph.c
index c6472876bf..24d8201f9c 100644
--- a/libavfilter/avfiltergraph.c
+++ b/libavfilter/avfiltergraph.c
@@ -437,6 +437,69 @@ static int formats_declared(AVFilterContext *f)
     return 1;
 }
 
+static void display_channel_layouts(AVBPrint *buf, const char *name,
+    AVFilterChannelLayouts *chs)
+{
+    char layout[128];
+    int i;
+
+    av_bprintf(buf, "%32s   chs:", name);
+    if (chs->all_layouts)
+        av_bprintf(buf, " all-layouts");
+    if (chs->all_counts)
+        av_bprintf(buf, " all-counts");
+    for (i = 0; i < chs->nb_channel_layouts; i++) {
+        av_channel_layout_describe(&chs->channel_layouts[i], layout, sizeof(layout));
+        av_bprintf(buf, " %s", layout);
+    }
+    av_bprintf(buf, "\n");
+}
+
+static void display_samplerates(AVBPrint *buf, const char *name,
+    AVFilterFormats *rates)
+{
+    int i;
+
+    av_bprintf(buf, "%32s rates:", name);
+    for (i = 0; i < rates->nb_formats; i++)
+        av_bprintf(buf, " %d", rates->formats[i]);
+    av_bprintf(buf, "\n");
+}
+
+static void display_formats(AVBPrint *buf, const char *name,
+    AVFilterFormats *fmts, int media_type)
+{
+    int i;
+
+    av_bprintf(buf, "%32s  fmts:", name);
+    for (i = 0; i < fmts->nb_formats; i++)
+        av_bprintf(buf, " %s",
+            media_type == AVMEDIA_TYPE_AUDIO ? av_get_sample_fmt_name(fmts->formats[i]) : av_get_pix_fmt_name(fmts->formats[i]));
+    av_bprintf(buf, "\n");
+}
+
+static void display_link_formats(AVFilterLink *link)
+{
+    AVBPrint buf;
+
+    av_bprint_init(&buf, 0, AV_BPRINT_SIZE_AUTOMATIC);
+
+    switch (link->type) {
+    case AVMEDIA_TYPE_AUDIO:
+        display_channel_layouts(&buf, link->src->name, link->incfg.channel_layouts);
+        display_channel_layouts(&buf, link->dst->name, link->outcfg.channel_layouts);
+        display_samplerates(&buf, link->src->name, link->incfg.samplerates);
+        display_samplerates(&buf, link->dst->name, link->outcfg.samplerates);
+    case AVMEDIA_TYPE_VIDEO: /* fallthrough */
+        display_formats(&buf, link->src->name, link->incfg.formats, link->type);
+        display_formats(&buf, link->dst->name, link->outcfg.formats, link->type);
+        break;
+    }
+
+    av_log(NULL, AV_LOG_INFO, "\n%s", buf.str);
+    av_bprint_finalize(&buf, NULL);
+}
+
 /**
  * Perform one round of query_formats() and merging formats lists on the
  * filter graph.
@@ -516,6 +579,7 @@ static int query_formats(AVFilterGraph *graph, void *log_ctx)
                 char inst_name[30];
                 const char *opts;
 
+                display_link_formats(link);
                 if (fffiltergraph(graph)->disable_auto_convert) {
                     av_log(log_ctx, AV_LOG_ERROR,
                            "The filters '%s' and '%s' do not have a common format "
-- 
2.34.1



More information about the ffmpeg-devel mailing list