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

Gyan Doshi ffmpeg at gyani.pro
Mon Feb 17 20:10:14 EET 2020



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.

Gyan


More information about the ffmpeg-devel mailing list