diff mbox series

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

Message ID 1581326823-26655-1-git-send-email-linjie.fu@intel.com
State Superseded
Headers show
Series [FFmpeg-devel] fftools/ffmpeg_filter: add -autoscale to disable/enable the default scale | expand

Checks

Context Check Description
andriy/ffmpeg-patchwork success Make fate finished

Commit Message

Fu, Linjie Feb. 10, 2020, 9:27 a.m. UTC
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@intel.com>
Signed-off-by: Linjie Fu <linjie.fu@intel.com>
---
Suggested by Mark, attach autoscale option to output.

 doc/ffmpeg.texi         | 16 ++++++++++++----
 fftools/ffmpeg.h        |  3 +++
 fftools/ffmpeg_filter.c |  2 +-
 fftools/ffmpeg_opt.c    |  8 ++++++++
 4 files changed, 24 insertions(+), 5 deletions(-)

Comments

Moritz Barsnick Feb. 11, 2020, 11:03 a.m. UTC | #1
On Mon, Feb 10, 2020 at 17:27:03 +0800, Linjie Fu wrote:
> +    { "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 if a resolution"
> +        "change is detected. This ensures all frames are the same resolution as the first frame"
> +        "when they leave the filter chain (this option is enabled by default)."
> +        "If disabled, some encoders/muxers may not support this mode."},

Have you checked the output of "ffmpeg -h"? Your C strings merge
directly together, and are therefore missing spaces, e.g. in
"resolutionchange" and "as the first framewhen they leave",

Moritz
Fu, Linjie Feb. 11, 2020, 12:57 p.m. UTC | #2
> -----Original Message-----
> From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of
> Moritz Barsnick
> Sent: Tuesday, February 11, 2020 19:04
> To: FFmpeg development discussions and patches <ffmpeg-
> devel@ffmpeg.org>
> Subject: Re: [FFmpeg-devel] [PATCH] fftools/ffmpeg_filter: add -autoscale
> to disable/enable the default scale
> 
> On Mon, Feb 10, 2020 at 17:27:03 +0800, Linjie Fu wrote:
> > +    { "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 if a
> resolution"
> > +        "change is detected. This ensures all frames are the same resolution
> as the first frame"
> > +        "when they leave the filter chain (this option is enabled by default)."
> > +        "If disabled, some encoders/muxers may not support this mode."},
> 
> Have you checked the output of "ffmpeg -h"? Your C strings merge
> directly together, and are therefore missing spaces, e.g. in
> "resolutionchange" and "as the first framewhen they leave",
> 
Yes, spaces should be added, thanks for pointing this out :).

I'll fix this in next version together with other suggestions if there is any.
Fu, Linjie Feb. 14, 2020, 5:41 a.m. UTC | #3
> -----Original Message-----
> From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of Fu,
> Linjie
> Sent: Tuesday, February 11, 2020 20:58
> To: FFmpeg development discussions and patches <ffmpeg-
> devel@ffmpeg.org>
> Subject: Re: [FFmpeg-devel] [PATCH] fftools/ffmpeg_filter: add -autoscale
> to disable/enable the default scale
> 
> > -----Original Message-----
> > From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of
> > Moritz Barsnick
> > Sent: Tuesday, February 11, 2020 19:04
> > To: FFmpeg development discussions and patches <ffmpeg-
> > devel@ffmpeg.org>
> > Subject: Re: [FFmpeg-devel] [PATCH] fftools/ffmpeg_filter: add -autoscale
> > to disable/enable the default scale
> >
> > On Mon, Feb 10, 2020 at 17:27:03 +0800, Linjie Fu wrote:
> > > +    { "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 if a
> > resolution"
> > > +        "change is detected. This ensures all frames are the same resolution
> > as the first frame"
> > > +        "when they leave the filter chain (this option is enabled by
> default)."
> > > +        "If disabled, some encoders/muxers may not support this mode."},
> >
> > Have you checked the output of "ffmpeg -h"? Your C strings merge
> > directly together, and are therefore missing spaces, e.g. in
> > "resolutionchange" and "as the first framewhen they leave",
> >
> Yes, spaces should be added, thanks for pointing this out :).
> 
> I'll fix this in next version together with other suggestions if there is any.
> 
Ping, any suggestions?
Paul B Mahol Feb. 14, 2020, 8:55 a.m. UTC | #4
On 2/14/20, Fu, Linjie <linjie.fu@intel.com> wrote:
>> -----Original Message-----
>> From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of Fu,
>> Linjie
>> Sent: Tuesday, February 11, 2020 20:58
>> To: FFmpeg development discussions and patches <ffmpeg-
>> devel@ffmpeg.org>
>> Subject: Re: [FFmpeg-devel] [PATCH] fftools/ffmpeg_filter: add -autoscale
>> to disable/enable the default scale
>>
>> > -----Original Message-----
>> > From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of
>> > Moritz Barsnick
>> > Sent: Tuesday, February 11, 2020 19:04
>> > To: FFmpeg development discussions and patches <ffmpeg-
>> > devel@ffmpeg.org>
>> > Subject: Re: [FFmpeg-devel] [PATCH] fftools/ffmpeg_filter: add
>> > -autoscale
>> > to disable/enable the default scale
>> >
>> > On Mon, Feb 10, 2020 at 17:27:03 +0800, Linjie Fu wrote:
>> > > +    { "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 if a
>> > resolution"
>> > > +        "change is detected. This ensures all frames are the same
>> > > resolution
>> > as the first frame"
>> > > +        "when they leave the filter chain (this option is enabled by
>> default)."
>> > > +        "If disabled, some encoders/muxers may not support this
>> > > mode."},
>> >
>> > Have you checked the output of "ffmpeg -h"? Your C strings merge
>> > directly together, and are therefore missing spaces, e.g. in
>> > "resolutionchange" and "as the first framewhen they leave",
>> >
>> Yes, spaces should be added, thanks for pointing this out :).
>>
>> I'll fix this in next version together with other suggestions if there is
>> any.
>>
> Ping, any suggestions?

Send updated patch with spaces fixed.

>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
Fu, Linjie Feb. 15, 2020, 2:48 a.m. UTC | #5
> -----Original Message-----
> From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of
> Paul B Mahol
> Sent: Friday, February 14, 2020 16:55
> To: FFmpeg development discussions and patches <ffmpeg-
> devel@ffmpeg.org>
> Subject: Re: [FFmpeg-devel] [PATCH] fftools/ffmpeg_filter: add -autoscale
> to disable/enable the default scale
> 
> On 2/14/20, Fu, Linjie <linjie.fu@intel.com> wrote:
> >> -----Original Message-----
> >> From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of
> Fu,
> >> Linjie
> >> Sent: Tuesday, February 11, 2020 20:58
> >> To: FFmpeg development discussions and patches <ffmpeg-
> >> devel@ffmpeg.org>
> >> Subject: Re: [FFmpeg-devel] [PATCH] fftools/ffmpeg_filter: add -
> autoscale
> >> to disable/enable the default scale
> >>
> >> > -----Original Message-----
> >> > From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf
> Of
> >> > Moritz Barsnick
> >> > Sent: Tuesday, February 11, 2020 19:04
> >> > To: FFmpeg development discussions and patches <ffmpeg-
> >> > devel@ffmpeg.org>
> >> > Subject: Re: [FFmpeg-devel] [PATCH] fftools/ffmpeg_filter: add
> >> > -autoscale
> >> > to disable/enable the default scale
> >> >
> >> > On Mon, Feb 10, 2020 at 17:27:03 +0800, Linjie Fu wrote:
> >> > > +    { "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 if a
> >> > resolution"
> >> > > +        "change is detected. This ensures all frames are the same
> >> > > resolution
> >> > as the first frame"
> >> > > +        "when they leave the filter chain (this option is enabled by
> >> default)."
> >> > > +        "If disabled, some encoders/muxers may not support this
> >> > > mode."},
> >> >
> >> > Have you checked the output of "ffmpeg -h"? Your C strings merge
> >> > directly together, and are therefore missing spaces, e.g. in
> >> > "resolutionchange" and "as the first framewhen they leave",
> >> >
> >> Yes, spaces should be added, thanks for pointing this out :).
> >>
> >> I'll fix this in next version together with other suggestions if there is
> >> any.
> >>
> > Ping, any suggestions?
> 
> Send updated patch with spaces fixed.
> 
Updated and resend the patch, thanks for review.
diff mbox series

Patch

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.
-
-@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}.
+
+@item -autorotate
+Automatically rotate the video according to file metadata. Enabled by
+default, use @option{-noautorotate} to disable it.
+
+@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..9bbd8cd 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,12 @@  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 if a resolution"
+        "change is detected. This ensures all frames are the same resolution as the first frame"
+        "when they leave the filter chain (this option is enabled by default)."
+        "If disabled, some encoders/muxers may not support this mode."},
 
     /* audio options */
     { "aframes",        OPT_AUDIO | HAS_ARG  | OPT_PERFILE | OPT_OUTPUT,           { .func_arg = opt_audio_frames },