[FFmpeg-devel] [PATCH] fftools/ffmpeg_filter: add -autoscale to disable/enable the default scale

Fu, Linjie linjie.fu at intel.com
Mon Feb 17 20:26:40 EET 2020


> -----Original Message-----
> From: ffmpeg-devel <ffmpeg-devel-bounces at ffmpeg.org> On Behalf Of
> Gyan Doshi
> Sent: Tuesday, February 18, 2020 02:10
> To: ffmpeg-devel at ffmpeg.org
> Subject: Re: [FFmpeg-devel] [PATCH] fftools/ffmpeg_filter: add -autoscale
> to disable/enable the default scale
> 
> 
> 
> On 17-02-2020 11:29 pm, Fu, Linjie wrote:
> >> -----Original Message-----
> >> From: ffmpeg-devel <ffmpeg-devel-bounces at ffmpeg.org> On Behalf Of
> >> Gyan Doshi
> >> Sent: Tuesday, February 18, 2020 01:44
> >> To: ffmpeg-devel at ffmpeg.org
> >> Subject: Re: [FFmpeg-devel] [PATCH] fftools/ffmpeg_filter: add -
> autoscale
> >> to disable/enable the default scale
> >>
> >>
> >>
> >> On 17-02-2020 11:07 pm, Fu, Linjie wrote:
> >>>> -----Original Message-----
> >>>> From: ffmpeg-devel <ffmpeg-devel-bounces at ffmpeg.org> On Behalf
> Of
> >>>> Gyan Doshi
> >>>> Sent: Tuesday, February 18, 2020 01:33
> >>>> To: ffmpeg-devel at ffmpeg.org
> >>>> Subject: Re: [FFmpeg-devel] [PATCH] fftools/ffmpeg_filter: add -
> >> autoscale
> >>>> to disable/enable the default scale
> >>>>
> >>>>
> >>>>
> >>>> On 17-02-2020 10:57 pm, Fu, Linjie wrote:
> >>>>>> -----Original Message-----
> >>>>>> From: ffmpeg-devel <ffmpeg-devel-bounces at ffmpeg.org> On
> Behalf
> >> Of
> >>>>>> Gyan Doshi
> >>>>>> Sent: Tuesday, February 18, 2020 00:53
> >>>>>> To: ffmpeg-devel at ffmpeg.org
> >>>>>> Subject: Re: [FFmpeg-devel] [PATCH] fftools/ffmpeg_filter: add -
> >>>> autoscale
> >>>>>> to disable/enable the default scale
> >>>>>>
> >>>>>>
> >>>>>>
> >>>>>> On 17-02-2020 09:13 pm, Fu, Linjie wrote:
> >>>>>>>> -----Original Message-----
> >>>>>>>> From: Fu, Linjie <linjie.fu at intel.com>
> >>>>>>>> Sent: Sunday, February 16, 2020 00:13
> >>>>>>>> To: ffmpeg-devel at ffmpeg.org
> >>>>>>>> Cc: Fu, Linjie <linjie.fu at intel.com>; Eoff, Ullysses A
> >>>>>>>> <ullysses.a.eoff at intel.com>
> >>>>>>>> Subject: [PATCH] fftools/ffmpeg_filter: add -autoscale to
> >>>> disable/enable
> >>>>>> the
> >>>>>>>> default scale
> >>>>>>>>
> >>>>>>>> Currently, ffmpeg inserts scale filter by default in the filter graph
> >>>>>>>> to force the whole decoded stream to scale into the same size
> with
> >> the
> >>>>>>>> first frame. It's not quite make sense in resolution changing cases
> if
> >>>>>>>> user wants the rawvideo without any scale.
> >>>>>>>>
> >>>>>>>> Using autoscale/noautoscale as an output option to indicate
> >> whether
> >>>> auto
> >>>>>>>> inserting the scale filter in the filter graph:
> >>>>>>>>         -noautoscale or -autoscale 0:
> >>>>>>>>         disable the default auto scale filter inserting.
> >>>>>>>>
> >>>>>>>> ffmpeg -y input.mp4 out1.yuv -noautoscale out2.yuv -autoscale 0
> >>>>>> out3.yuv
> >>>>>>>> Update docs.
> >>>>>>>>
> >>>>>>>> Signed-off-by: U. Artie Eoff <ullysses.a.eoff at intel.com>
> >>>>>>>> Signed-off-by: Linjie Fu <linjie.fu at intel.com>
> >>>>>>>> ---
> >>>>>>>>      doc/ffmpeg.texi         | 16 ++++++++++++----
> >>>>>>>>      fftools/ffmpeg.h        |  3 +++
> >>>>>>>>      fftools/ffmpeg_filter.c |  2 +-
> >>>>>>>>      fftools/ffmpeg_opt.c    |  5 +++++
> >>>>>>>>      4 files changed, 21 insertions(+), 5 deletions(-)
> >>>>>>>>
> >>>>>>>> diff --git a/doc/ffmpeg.texi b/doc/ffmpeg.texi
> >>>>>>>> index 29753f0..aebafb3 100644
> >>>>>>>> --- a/doc/ffmpeg.texi
> >>>>>>>> +++ b/doc/ffmpeg.texi
> >>>>>>>> @@ -734,10 +734,6 @@ ffmpeg -dump_attachment:t "" -i INPUT
> >>>>>>>>      Technical note -- attachments are implemented as codec
> extradata,
> >>>> so
> >>>>>> this
> >>>>>>>>      option can actually be used to extract extradata from any
> stream,
> >> not
> >>>>>> just
> >>>>>>>>      attachments.
> >>>>>>>> -
> >>>>>>>> - at item -noautorotate
> >>>>>>>> -Disable automatically rotating video based on file metadata.
> >>>>>>>> -
> >>>>>>>>      @end table
> >>>>>>>>
> >>>>>>>>      @section Video Options
> >>>>>>>> @@ -819,6 +815,18 @@ Create the filtergraph specified by
> >>>>>> @var{filtergraph}
> >>>>>>>> and use it to
> >>>>>>>>      filter the stream.
> >>>>>>>>
> >>>>>>>>      This is an alias for @code{-filter:v}, see the @ref{filter_option,,-
> >> filter
> >>>>>> option}.
> >>>>>>>> +
> >>>>>>>> + at item -autorotate
> >>>>>>>> +Automatically rotate the video according to file metadata.
> Enabled
> >> by
> >>>>>>>> +default, use @option{-noautorotate} to disable it.
> >>>>>>>> +
> >>>>>>>> + at item -autoscale
> >>>>>>>> +Automatically scale the video according to the resolution of first
> >> frame.
> >>>>>>>> +Enabled by default, use @option{-noautoscale} to disable it.
> When
> >>>>>>>> autoscale is
> >>>>>>>> +disabled, all output frames of filter graph might not be in the
> same
> >>>>>>>> resolution
> >>>>>>>> +and may be inadequate for some encoder/muxer. Therefore, it
> is
> >> not
> >>>>>>>> recommended
> >>>>>>>> +to disable it unless you really know what you are doing.
> >>>>>>>> +Disable autoscale at your own risk.
> >>>>>>>>      @end table
> >>>>>>>>
> >>>>>>>>      @section Advanced Video options
> >>>>>>>> diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h
> >>>>>>>> index 7b6f802..8beba6c 100644
> >>>>>>>> --- a/fftools/ffmpeg.h
> >>>>>>>> +++ b/fftools/ffmpeg.h
> >>>>>>>> @@ -230,6 +230,8 @@ typedef struct OptionsContext {
> >>>>>>>>          int        nb_time_bases;
> >>>>>>>>          SpecifierOpt *enc_time_bases;
> >>>>>>>>          int        nb_enc_time_bases;
> >>>>>>>> +    SpecifierOpt *autoscale;
> >>>>>>>> +    int        nb_autoscale;
> >>>>>>>>      } OptionsContext;
> >>>>>>>>
> >>>>>>>>      typedef struct InputFilter {
> >>>>>>>> @@ -479,6 +481,7 @@ typedef struct OutputStream {
> >>>>>>>>          int force_fps;
> >>>>>>>>          int top_field_first;
> >>>>>>>>          int rotate_overridden;
> >>>>>>>> +    int autoscale;
> >>>>>>>>          double rotate_override_value;
> >>>>>>>>
> >>>>>>>>          AVRational frame_aspect_ratio;
> >>>>>>>> diff --git a/fftools/ffmpeg_filter.c b/fftools/ffmpeg_filter.c
> >>>>>>>> index 40cc4c1..46c8ea8 100644
> >>>>>>>> --- a/fftools/ffmpeg_filter.c
> >>>>>>>> +++ b/fftools/ffmpeg_filter.c
> >>>>>>>> @@ -469,7 +469,7 @@ static int
> >>>>>> configure_output_video_filter(FilterGraph
> >>>>>>>> *fg, OutputFilter *ofilter,
> >>>>>>>>          if (ret < 0)
> >>>>>>>>              return ret;
> >>>>>>>>
> >>>>>>>> -    if (ofilter->width || ofilter->height) {
> >>>>>>>> +    if ((ofilter->width || ofilter->height) && ofilter->ost-
> >autoscale) {
> >>>>>>>>              char args[255];
> >>>>>>>>              AVFilterContext *filter;
> >>>>>>>>              AVDictionaryEntry *e = NULL;
> >>>>>>>> diff --git a/fftools/ffmpeg_opt.c b/fftools/ffmpeg_opt.c
> >>>>>>>> index 12d4488..a6f4216 100644
> >>>>>>>> --- a/fftools/ffmpeg_opt.c
> >>>>>>>> +++ b/fftools/ffmpeg_opt.c
> >>>>>>>> @@ -1405,6 +1405,8 @@ static OutputStream
> >>>>>>>> *new_output_stream(OptionsContext *o, AVFormatContext *oc,
> e
> >>>>>>>>              ost->encoder_opts  = filter_codec_opts(o->g->codec_opts,
> >> ost-
> >>>>>>> enc-
> >>>>>>>>> id, oc, st, ost->enc);
> >>>>>>>>              MATCH_PER_STREAM_OPT(presets, str, preset, oc, st);
> >>>>>>>> +        ost->autoscale = 1;
> >>>>>>>> +        MATCH_PER_STREAM_OPT(autoscale, i, ost->autoscale, oc,
> st);
> >>>>>>>>              if (preset && (!(ret = get_preset_file_2(preset, ost->enc-
> >>> name,
> >>>>>> &s))))
> >>>>>>>> {
> >>>>>>>>                  do  {
> >>>>>>>>                      buf = get_line(s);
> >>>>>>>> @@ -3650,6 +3652,9 @@ const OptionDef options[] = {
> >>>>>>>>          { "autorotate",       HAS_ARG | OPT_BOOL | OPT_SPEC |
> >>>>>>>>                                OPT_EXPERT | OPT_INPUT,                                { .off =
> >>>>>>>> OFFSET(autorotate) },
> >>>>>>>>              "automatically insert correct rotate filters" },
> >>>>>>>> +    { "autoscale",        HAS_ARG | OPT_BOOL | OPT_SPEC |
> >>>>>>>> +                          OPT_EXPERT | OPT_OUTPUT,                               { .off =
> >>>>>>>> OFFSET(autoscale) },
> >>>>>>>> +        "automatically insert a scale filter at the end of the filter
> >> graph" },
> >>>>>>>>          /* audio options */
> >>>>>>>>          { "aframes",        OPT_AUDIO | HAS_ARG  | OPT_PERFILE |
> >>>>>> OPT_OUTPUT,
> >>>>>>>> { .func_arg = opt_audio_frames },
> >>>>>>>> --
> >>>>>>>> 2.7.4
> >>>>>> What happens if user disables autoscale and the frame sizes do vary
> >> but
> >>>>>> the encoder doesn't support changing props?
> >>>>> That's the point. Currently they would fail without specific
> notifications
> >> for
> >>>> this usage.
> >>>>> One of the solutions is to declare
> >>>> AV_CODEC_CAP_VARIABLE_DIMENSIONS  capability for encoders [1],
> >>>>> and prompt an error information [2] to indicate " Dynamic resolution
> >>>> encode is not supported by this encoder."
> >>>>> The further work would be providing dynamic encoding support for
> >> some
> >>>> encoders [3].
> >>>>> So this patch is the first step.
> >>>> Is this patch intended to be applied first, before the codec flag is
> >>>> added and checked?
> >>> Considering it won't impact the default behavior, IMHO yes it could be.
> >> So, my question still stands. If it is applied tomorrow, and a user
> >> disables autoscale, and ends up feeding frames of varying sizes to, say,
> >> x264 or aom, what happens?
> >>
> > Failed without specific notifications for wrongly disabling autoscale.
> >
> > Taking x264 as an example to transcode clips with resolution changing
> > from 352x288 to 240x196:
> >
> > [libx264 @ 0x5559143d51c0] Input picture width (352) is greater than stride
> (256)
> > Video encoding failed
> > (This differs according to the encoder.)
> >
> > BTW, it would be great if the patch set for codec flag and check could be
> applied at
> > the same time.
> 
> The flag should be added first, then this patch updated to check and
> abort if encoder doesn't have the capability.
> 
Actually the patches for codec flags and capability check are pending for some time.
Please also help to review. (and apply if it's ok)


More information about the ffmpeg-devel mailing list