[FFmpeg-devel] [PATCH] fftools/ffmpeg_filter: add -autoscale to disable/enable the default scale
Fu, Linjie
linjie.fu at intel.com
Mon Feb 17 19:37:18 EET 2020
> -----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.
More information about the ffmpeg-devel
mailing list