fftools/ffmpeg_filter: simplify choose_pix_fmts

The only meaningful difference between choose_pix_fmts and the default
code was the inclusion of an extra branch for `keep_pix_fmt` being true.

However, in this case, we either:
1. Force the specific `ofp->format` that we inherited from
   ofilter_bind_ost, or if no format was set:
2. Print an empty format list

Both of these goals can be accomplished by simply moving the decision
logic to ofilter_bind_ost, to avoid setting any format list when
keep_pix_fmt is enabled. This is arguably cleaner as it moves format
selection logic to a single function. In the case of branch 1, nothing
else needs to be done as we already force the format provided in
ofp->format, if any is set. Add an assertion to verify this assumption
just in case.

(Side note: The "choose_*" family of functions are arguably misnomers,
as they should really be called "print_*" - their current behavior is to
print the relevant format lists to the `vf/af_format` filter arguments)

Signed-off-by: Anton Khirnov <anton@khirnov.net>
Signed-off-by: Niklas Haas <git@haasn.dev>
release/7.1
Niklas Haas 1 year ago
parent 7b0eca1e51
commit 7d6cd13ccb
  1. 49
      fftools/ffmpeg_filter.c

@ -364,35 +364,6 @@ static void sub2video_update(InputFilterPriv *ifp, int64_t heartbeat_pts,
ifp->sub2video.initialize = 0; ifp->sub2video.initialize = 0;
} }
/* *dst may return be set to NULL (no pixel format found), a static string or a
* string backed by the bprint. Nothing has been written to the AVBPrint in case
* NULL is returned. The AVBPrint provided should be clean. */
static int choose_pix_fmts(OutputFilter *ofilter, AVBPrint *bprint,
const char **dst)
{
OutputFilterPriv *ofp = ofp_from_ofilter(ofilter);
*dst = NULL;
if (ofp->flags & OFILTER_FLAG_DISABLE_CONVERT || ofp->format != AV_PIX_FMT_NONE) {
*dst = ofp->format == AV_PIX_FMT_NONE ? NULL :
av_get_pix_fmt_name(ofp->format);
} else if (ofp->formats) {
const enum AVPixelFormat *p = ofp->formats;
for (; *p != AV_PIX_FMT_NONE; p++) {
const char *name = av_get_pix_fmt_name(*p);
av_bprintf(bprint, "%s%c", name, p[1] == AV_PIX_FMT_NONE ? '\0' : '|');
}
if (!av_bprint_is_complete(bprint))
return AVERROR(ENOMEM);
*dst = bprint->str;
}
return 0;
}
/* Define a function for appending a list of allowed formats /* Define a function for appending a list of allowed formats
* to an AVBPrint. If nonempty, the list will have a header. */ * to an AVBPrint. If nonempty, the list will have a header. */
#define DEF_CHOOSE_FORMAT(name, type, var, supported_list, none, printf_format, get_name) \ #define DEF_CHOOSE_FORMAT(name, type, var, supported_list, none, printf_format, get_name) \
@ -415,8 +386,8 @@ static void choose_ ## name (OutputFilterPriv *ofp, AVBPrint *bprint) \
av_bprint_chars(bprint, ':', 1); \ av_bprint_chars(bprint, ':', 1); \
} }
//DEF_CHOOSE_FORMAT(pix_fmts, enum AVPixelFormat, format, formats, AV_PIX_FMT_NONE, DEF_CHOOSE_FORMAT(pix_fmts, enum AVPixelFormat, format, formats,
// av_get_pix_fmt_name) AV_PIX_FMT_NONE, "%s", av_get_pix_fmt_name)
DEF_CHOOSE_FORMAT(sample_fmts, enum AVSampleFormat, format, formats, DEF_CHOOSE_FORMAT(sample_fmts, enum AVSampleFormat, format, formats,
AV_SAMPLE_FMT_NONE, "%s", av_get_sample_fmt_name) AV_SAMPLE_FMT_NONE, "%s", av_get_sample_fmt_name)
@ -850,7 +821,8 @@ int ofilter_bind_ost(OutputFilter *ofilter, OutputStream *ost,
ofp->format = opts->format; ofp->format = opts->format;
} else if (opts->pix_fmts) } else if (opts->pix_fmts)
ofp->formats = opts->pix_fmts; ofp->formats = opts->pix_fmts;
else if (opts->enc) else if (opts->enc &&
!(ofp->flags & OFILTER_FLAG_DISABLE_CONVERT))
ofp->formats = opts->enc->pix_fmts; ofp->formats = opts->enc->pix_fmts;
fgp->disable_conversions |= !!(ofp->flags & OFILTER_FLAG_DISABLE_CONVERT); fgp->disable_conversions |= !!(ofp->flags & OFILTER_FLAG_DISABLE_CONVERT);
@ -1481,7 +1453,6 @@ static int configure_output_video_filter(FilterGraph *fg, AVFilterGraph *graph,
AVBPrint bprint; AVBPrint bprint;
int pad_idx = out->pad_idx; int pad_idx = out->pad_idx;
int ret; int ret;
const char *pix_fmts;
char name[255]; char name[255];
snprintf(name, sizeof(name), "out_%s", ofp->name); snprintf(name, sizeof(name), "out_%s", ofp->name);
@ -1515,17 +1486,19 @@ static int configure_output_video_filter(FilterGraph *fg, AVFilterGraph *graph,
pad_idx = 0; pad_idx = 0;
} }
av_assert0(!(ofp->flags & OFILTER_FLAG_DISABLE_CONVERT) ||
ofp->format != AV_PIX_FMT_NONE || !ofp->formats);
av_bprint_init(&bprint, 0, AV_BPRINT_SIZE_UNLIMITED); av_bprint_init(&bprint, 0, AV_BPRINT_SIZE_UNLIMITED);
ret = choose_pix_fmts(ofilter, &bprint, &pix_fmts); choose_pix_fmts(ofp, &bprint);
if (ret < 0) if (!av_bprint_is_complete(&bprint))
return ret; return AVERROR(ENOMEM);
if (pix_fmts) { if (bprint.len) {
AVFilterContext *filter; AVFilterContext *filter;
ret = avfilter_graph_create_filter(&filter, ret = avfilter_graph_create_filter(&filter,
avfilter_get_by_name("format"), avfilter_get_by_name("format"),
"format", pix_fmts, NULL, graph); "format", bprint.str, NULL, graph);
av_bprint_finalize(&bprint, NULL); av_bprint_finalize(&bprint, NULL);
if (ret < 0) if (ret < 0)
return ret; return ret;

Loading…
Cancel
Save