[FFmpeg-devel] [PATCH] fftools/ffmpeg_filter: add -autoscale to disable/enable the default scale
Gyan Doshi
ffmpeg at gyani.pro
Mon Feb 17 19:32:42 EET 2020
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?
Gyan
More information about the ffmpeg-devel
mailing list