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

Gyan Doshi ffmpeg at gyani.pro
Mon Feb 17 19:44:12 EET 2020



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?

Gyan


More information about the ffmpeg-devel mailing list