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

Gyan ffmpeg at gyani.pro
Sat Jul 20 08:28:55 EEST 2019



On 19-07-2019 11:04 PM, Linjie Fu wrote:
> 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 to indicate whether auto inserting the scale
> filter in the filter graph:
>      -noautoscale or -autoscale 0:
>          disable the default auto scale filter inserting.
>
> 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         | 17 +++++++++++++----
>   fftools/ffmpeg.c        |  1 +
>   fftools/ffmpeg.h        |  4 ++++
>   fftools/ffmpeg_filter.c |  2 +-
>   fftools/ffmpeg_opt.c    |  8 ++++++++
>   5 files changed, 27 insertions(+), 5 deletions(-)
>
> diff --git a/doc/ffmpeg.texi b/doc/ffmpeg.texi
> index cd35eb49c8..99121b6981 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,19 @@ 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 might not be in the same resolution and may require
> +some additional explicit processing according to your final rendering/output
> +destination. Disabling autoscale may not work in all situations. Therefore, it
> +is not recommended to disable it unless you really know what you are doing.
> +Disable autoscale at your own risk.

Since the auto scaling happens at the end of the graph, what may the 
"additional explicit processing" be?

>   @end table
>   
>   @section Advanced Video options
> diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c
> index 01f04103cf..5d52430b1e 100644
> --- a/fftools/ffmpeg.c
> +++ b/fftools/ffmpeg.c
> @@ -2133,6 +2133,7 @@ static int ifilter_send_frame(InputFilter *ifilter, AVFrame *frame)
>   
>       /* determine if the parameters for this input changed */
>       need_reinit = ifilter->format != frame->format;
> +    fg->autoscale = ifilter->ist->autoscale;
>   
>       switch (ifilter->ist->st->codecpar->codec_type) {
>       case AVMEDIA_TYPE_AUDIO:
> diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h
> index 7b6f802082..1602406581 100644
> --- a/fftools/ffmpeg.h
> +++ b/fftools/ffmpeg.h
> @@ -133,6 +133,8 @@ typedef struct OptionsContext {
>       int        nb_hwaccel_output_formats;
>       SpecifierOpt *autorotate;
>       int        nb_autorotate;
> +    SpecifierOpt *autoscale;
> +    int        nb_autoscale;
>   
>       /* output options */
>       StreamMap *stream_maps;
> @@ -285,6 +287,7 @@ typedef struct FilterGraph {
>   
>       AVFilterGraph *graph;
>       int reconfiguration;
> +    int autoscale;
>   
>       InputFilter   **inputs;
>       int          nb_inputs;
> @@ -335,6 +338,7 @@ typedef struct InputStream {
>       int guess_layout_max;
>   
>       int autorotate;
> +    int autoscale;
>   
>       int fix_sub_duration;
>       struct { /* previous decoded subtitle and related variables */
> diff --git a/fftools/ffmpeg_filter.c b/fftools/ffmpeg_filter.c
> index 72838de1e2..2a2eb080eb 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) && fg->autoscale) {
>           char args[255];
>           AVFilterContext *filter;
>           AVDictionaryEntry *e = NULL;
> diff --git a/fftools/ffmpeg_opt.c b/fftools/ffmpeg_opt.c
> index f5ca18aa64..41cb676dad 100644
> --- a/fftools/ffmpeg_opt.c
> +++ b/fftools/ffmpeg_opt.c
> @@ -742,7 +742,9 @@ static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
>           MATCH_PER_STREAM_OPT(ts_scale, dbl, ist->ts_scale, ic, st);
>   
>           ist->autorotate = 1;
> +        ist->autoscale  = 1;
>           MATCH_PER_STREAM_OPT(autorotate, i, ist->autorotate, ic, st);
> +        MATCH_PER_STREAM_OPT(autoscale, i, ist->autoscale, ic, st);
>   
>           MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, ic, st);
>           if (codec_tag) {
> @@ -3640,6 +3642,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_INPUT,                                { .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."},
Which muxers can detect or check for prop changes within coded 
bitstreams? Which encoders are known to be able to handle
changing resolution?

Gyan


More information about the ffmpeg-devel mailing list