[FFmpeg-devel] [PATCH v3 1/2] lavfi/vf_scale: use default swscale flags for simple and complex filter graph
Linjie Fu
linjie.justin.fu at gmail.com
Wed Aug 4 19:57:43 EEST 2021
On Wed, Aug 4, 2021 at 7:03 PM Nicolas George <george at nsup.org> wrote:
> Linjie Fu (12021-08-04):
> > From: Linjie Fu <linjie.justin.fu at gmail.com>
> >
> > Currently the default swscale flags for simple filter graph is bicubic,
> > however for complex filter graph it uses bilinear as decleared in scale
> > filter.
> >
> > $ffmpeg -v verbose -i input.mp4 -vf format=yuv420p,scale=800x600 -an -f
> null -
> > [Parsed_scale_1 @ 0x7f86d2c160c0] w:1920 h:1080 fmt:yuv420p sar:0/1 ->
> w:800 h:600 fmt:yuv420p sar:0/1 flags:0x4
> >
> > $ffmpeg -v verbose -i input.mp4 -filter_complex
> format=yuv420p,scale=800x600 -an -f null -
> > [Parsed_scale_1 @ 0x7f8779e046c0] w:1920 h:1080 fmt:yuv420p sar:0/1 ->
> w:800 h:600 fmt:yuv420p sar:0/1 flags:0x2
> >
> > Use default swscale flags (bicubic currently) for scale filter.
> > - Remove flags="bilinear" from vf_scale
> > - Remove setting defaults in ffmpeg/ffprobe/ffplay
> > - Update the FATE refs
> >
> > Signed-off-by: Linjie Fu <linjie.justin.fu at gmail.com>
> > ---
> > fftools/cmdutils.c | 8 --------
> > fftools/ffplay.c | 2 --
> > fftools/ffprobe.c | 1 -
> > libavfilter/vf_scale.c | 4 ++--
> > tests/ref/fate/filter-scale2ref_keep_aspect | 10 +++++-----
> > 5 files changed, 7 insertions(+), 18 deletions(-)
>
> Why are patches for fftools squashed with this patch? They should be
> separate, as they were.
>
You're right, splitted locally.
> >
> > diff --git a/fftools/cmdutils.c b/fftools/cmdutils.c
> > index 0b1ef03a25..912e881174 100644
> > --- a/fftools/cmdutils.c
> > +++ b/fftools/cmdutils.c
> > @@ -81,11 +81,6 @@ enum show_muxdemuxers {
> > SHOW_MUXERS,
> > };
> >
> > -void init_opts(void)
> > -{
> > - av_dict_set(&sws_dict, "flags", "bicubic", 0);
> > -}
> > -
> > void uninit_opts(void)
> > {
> > av_dict_free(&swr_opts);
> > @@ -670,7 +665,6 @@ static void finish_group(OptionParseContext *octx,
> int group_idx,
> > resample_opts = NULL;
> > sws_dict = NULL;
> > swr_opts = NULL;
> > - init_opts();
> >
> > memset(&octx->cur_group, 0, sizeof(octx->cur_group));
> > }
> > @@ -708,8 +702,6 @@ static void init_parse_context(OptionParseContext
> *octx,
> >
> > octx->global_opts.group_def = &global_group;
> > octx->global_opts.arg = "";
> > -
> > - init_opts();
> > }
> >
> > void uninit_parse_context(OptionParseContext *octx)
> > diff --git a/fftools/ffplay.c b/fftools/ffplay.c
> > index 6b19574eae..46758b9f55 100644
> > --- a/fftools/ffplay.c
> > +++ b/fftools/ffplay.c
> > @@ -3695,8 +3695,6 @@ int main(int argc, char **argv)
> > #endif
> > avformat_network_init();
> >
> > - init_opts();
> > -
> > signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
> > signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
> >
> > diff --git a/fftools/ffprobe.c b/fftools/ffprobe.c
> > index f411ba35b5..95263e1e6f 100644
> > --- a/fftools/ffprobe.c
> > +++ b/fftools/ffprobe.c
> > @@ -3721,7 +3721,6 @@ int main(int argc, char **argv)
> > options = real_options;
> > parse_loglevel(argc, argv, options);
> > avformat_network_init();
> > - init_opts();
> > #if CONFIG_AVDEVICE
> > avdevice_register_all();
> > #endif
> > diff --git a/libavfilter/vf_scale.c b/libavfilter/vf_scale.c
> > index f07e01bf90..683c4caa37 100644
> > --- a/libavfilter/vf_scale.c
> > +++ b/libavfilter/vf_scale.c
> > @@ -313,7 +313,7 @@ static av_cold int init_dict(AVFilterContext *ctx,
> AVDictionary **opts)
> >
> > scale->flags = 0;
> >
>
> > - if (scale->flags_str) {
> > + if (*scale->flags_str) {
>
> It could still be NULL, IIRC.
>
sws_flags doesn't have a candidate for "" (NULL) [1].
Hence NULL input for flags leads to a parsing issue:
$ffmpeg -v verbose -i input.mp4 -vf format=yuv420p,scale=800x600 -an
-vframes 10 -f md5 -
[Parsed_scale_1 @ 0x7fc03f44e6c0] w:800 h:600 flags:'' interl:0
[swscaler @ 0x7ffee24cb830] [Eval @ 0x7ffee24cb130] Undefined constant or
missing '(' in ''
[swscaler @ 0x7ffee24cb830] Unable to parse option value ""
[AVFilterGraph @ 0x7fc03f44e5c0] Error initializing filter 'scale' with
args '800x600'
Error reinitializing filters!
Failed to inject frame into filter network: Invalid argument
>
> > const AVClass *class = sws_get_class();
> > const AVOption *o = av_opt_find(&class, "sws_flags", NULL, 0,
> > AV_OPT_SEARCH_FAKE_OBJ);
> > @@ -900,7 +900,7 @@ static const AVOption scale_options[] = {
> > { "width", "Output video width", OFFSET(w_expr),
> AV_OPT_TYPE_STRING, .flags = TFLAGS },
> > { "h", "Output video height", OFFSET(h_expr),
> AV_OPT_TYPE_STRING, .flags = TFLAGS },
> > { "height","Output video height", OFFSET(h_expr),
> AV_OPT_TYPE_STRING, .flags = TFLAGS },
>
> > - { "flags", "Flags to pass to libswscale", OFFSET(flags_str),
> AV_OPT_TYPE_STRING, { .str = "bilinear" }, .flags = FLAGS },
> > + { "flags", "Flags to pass to libswscale", OFFSET(flags_str),
> AV_OPT_TYPE_STRING, { .str = "" }, .flags = FLAGS },
>
> This is now correct.
>
Thanks.
- linjie
[1] https://github.com/FFmpeg/FFmpeg/blob/master/libswscale/options.c#L37
More information about the ffmpeg-devel
mailing list