[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:27:16 EET 2020


> -----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.

[1] https://patchwork.ffmpeg.org/project/ffmpeg/patch/1564461924-4772-1-git-send-email-linjie.fu@intel.com/
[2] https://patchwork.ffmpeg.org/project/ffmpeg/patch/1564461944-4820-1-git-send-email-linjie.fu@intel.com/
[3] https://patchwork.ffmpeg.org/project/ffmpeg/patch/1565688544-9043-1-git-send-email-linjie.fu@intel.com/




> Gyan
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> 
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".


More information about the ffmpeg-devel mailing list