@chapter Filtering Introduction
@c man begin FILTERING INTRODUCTION

Filtering in FFmpeg is enabled through the libavfilter library.

In libavfilter, a filter can have multiple inputs and multiple
outputs.
To illustrate the sorts of things that are possible, we consider the
following filtergraph.

@verbatim
                [main]
input --> split ---------------------> overlay --> output
            |                             ^
            |[tmp]                  [flip]|
            +-----> crop --> vflip -------+
@end verbatim

This filtergraph splits the input stream in two streams, then sends one
stream through the crop filter and the vflip filter, before merging it
back with the other stream by overlaying it on top. You can use the
following command to achieve this:

@example
ffmpeg -i INPUT -vf "split [main][tmp]; [tmp] crop=iw:ih/2:0:0, vflip [flip]; [main][flip] overlay=0:H/2" OUTPUT
@end example

The result will be that the top half of the video is mirrored
onto the bottom half of the output video.

Filters in the same linear chain are separated by commas, and distinct
linear chains of filters are separated by semicolons. In our example,
@var{crop,vflip} are in one linear chain, @var{split} and
@var{overlay} are separately in another. The points where the linear
chains join are labelled by names enclosed in square brackets. In the
example, the split filter generates two outputs that are associated to
the labels @var{[main]} and @var{[tmp]}.

The stream sent to the second output of @var{split}, labelled as
@var{[tmp]}, is processed through the @var{crop} filter, which crops
away the lower half part of the video, and then vertically flipped. The
@var{overlay} filter takes in input the first unchanged output of the
split filter (which was labelled as @var{[main]}), and overlay on its
lower half the output generated by the @var{crop,vflip} filterchain.

Some filters take in input a list of parameters: they are specified
after the filter name and an equal sign, and are separated from each other
by a colon.

There exist so-called @var{source filters} that do not have an
audio/video input, and @var{sink filters} that will not have audio/video
output.

@c man end FILTERING INTRODUCTION

@chapter graph2dot
@c man begin GRAPH2DOT

The @file{graph2dot} program included in the FFmpeg @file{tools}
directory can be used to parse a filtergraph description and issue a
corresponding textual representation in the dot language.

Invoke the command:
@example
graph2dot -h
@end example

to see how to use @file{graph2dot}.

You can then pass the dot description to the @file{dot} program (from
the graphviz suite of programs) and obtain a graphical representation
of the filtergraph.

For example the sequence of commands:
@example
echo @var{GRAPH_DESCRIPTION} | \
tools/graph2dot -o graph.tmp && \
dot -Tpng graph.tmp -o graph.png && \
display graph.png
@end example

can be used to create and display an image representing the graph
described by the @var{GRAPH_DESCRIPTION} string. Note that this string must be
a complete self-contained graph, with its inputs and outputs explicitly defined.
For example if your command line is of the form:
@example
ffmpeg -i infile -vf scale=640:360 outfile
@end example
your @var{GRAPH_DESCRIPTION} string will need to be of the form:
@example
nullsrc,scale=640:360,nullsink
@end example
you may also need to set the @var{nullsrc} parameters and add a @var{format}
filter in order to simulate a specific input file.

@c man end GRAPH2DOT

@chapter Filtergraph description
@c man begin FILTERGRAPH DESCRIPTION

A filtergraph is a directed graph of connected filters. It can contain
cycles, and there can be multiple links between a pair of
filters. Each link has one input pad on one side connecting it to one
filter from which it takes its input, and one output pad on the other
side connecting it to one filter accepting its output.

Each filter in a filtergraph is an instance of a filter class
registered in the application, which defines the features and the
number of input and output pads of the filter.

A filter with no input pads is called a "source", and a filter with no
output pads is called a "sink".

@anchor{Filtergraph syntax}
@section Filtergraph syntax

A filtergraph has a textual representation, which is recognized by the
@option{-filter}/@option{-vf}/@option{-af} and
@option{-filter_complex} options in @command{ffmpeg} and
@option{-vf}/@option{-af} in @command{ffplay}, and by the
@code{avfilter_graph_parse_ptr()} function defined in
@file{libavfilter/avfilter.h}.

A filterchain consists of a sequence of connected filters, each one
connected to the previous one in the sequence. A filterchain is
represented by a list of ","-separated filter descriptions.

A filtergraph consists of a sequence of filterchains. A sequence of
filterchains is represented by a list of ";"-separated filterchain
descriptions.

A filter is represented by a string of the form:
[@var{in_link_1}]...[@var{in_link_N}]@var{filter_name}@@@var{id}=@var{arguments}[@var{out_link_1}]...[@var{out_link_M}]

@var{filter_name} is the name of the filter class of which the
described filter is an instance of, and has to be the name of one of
the filter classes registered in the program optionally followed by "@@@var{id}".
The name of the filter class is optionally followed by a string
"=@var{arguments}".

@var{arguments} is a string which contains the parameters used to
initialize the filter instance. It may have one of two forms:
@itemize

@item
A ':'-separated list of @var{key=value} pairs.

@item
A ':'-separated list of @var{value}. In this case, the keys are assumed to be
the option names in the order they are declared. E.g. the @code{fade} filter
declares three options in this order -- @option{type}, @option{start_frame} and
@option{nb_frames}. Then the parameter list @var{in:0:30} means that the value
@var{in} is assigned to the option @option{type}, @var{0} to
@option{start_frame} and @var{30} to @option{nb_frames}.

@item
A ':'-separated list of mixed direct @var{value} and long @var{key=value}
pairs. The direct @var{value} must precede the @var{key=value} pairs, and
follow the same constraints order of the previous point. The following
@var{key=value} pairs can be set in any preferred order.

@end itemize

If the option value itself is a list of items (e.g. the @code{format} filter
takes a list of pixel formats), the items in the list are usually separated by
@samp{|}.

The list of arguments can be quoted using the character @samp{'} as initial
and ending mark, and the character @samp{\} for escaping the characters
within the quoted text; otherwise the argument string is considered
terminated when the next special character (belonging to the set
@samp{[]=;,}) is encountered.

The name and arguments of the filter are optionally preceded and
followed by a list of link labels.
A link label allows one to name a link and associate it to a filter output
or input pad. The preceding labels @var{in_link_1}
... @var{in_link_N}, are associated to the filter input pads,
the following labels @var{out_link_1} ... @var{out_link_M}, are
associated to the output pads.

When two link labels with the same name are found in the
filtergraph, a link between the corresponding input and output pad is
created.

If an output pad is not labelled, it is linked by default to the first
unlabelled input pad of the next filter in the filterchain.
For example in the filterchain
@example
nullsrc, split[L1], [L2]overlay, nullsink
@end example
the split filter instance has two output pads, and the overlay filter
instance two input pads. The first output pad of split is labelled
"L1", the first input pad of overlay is labelled "L2", and the second
output pad of split is linked to the second input pad of overlay,
which are both unlabelled.

In a filter description, if the input label of the first filter is not
specified, "in" is assumed; if the output label of the last filter is not
specified, "out" is assumed.

In a complete filterchain all the unlabelled filter input and output
pads must be connected. A filtergraph is considered valid if all the
filter input and output pads of all the filterchains are connected.

Libavfilter will automatically insert @ref{scale} filters where format
conversion is required. It is possible to specify swscale flags
for those automatically inserted scalers by prepending
@code{sws_flags=@var{flags};}
to the filtergraph description.

Here is a BNF description of the filtergraph syntax:
@example
@var{NAME}             ::= sequence of alphanumeric characters and '_'
@var{FILTER_NAME}      ::= @var{NAME}["@@"@var{NAME}]
@var{LINKLABEL}        ::= "[" @var{NAME} "]"
@var{LINKLABELS}       ::= @var{LINKLABEL} [@var{LINKLABELS}]
@var{FILTER_ARGUMENTS} ::= sequence of chars (possibly quoted)
@var{FILTER}           ::= [@var{LINKLABELS}] @var{FILTER_NAME} ["=" @var{FILTER_ARGUMENTS}] [@var{LINKLABELS}]
@var{FILTERCHAIN}      ::= @var{FILTER} [,@var{FILTERCHAIN}]
@var{FILTERGRAPH}      ::= [sws_flags=@var{flags};] @var{FILTERCHAIN} [;@var{FILTERGRAPH}]
@end example

@anchor{filtergraph escaping}
@section Notes on filtergraph escaping

Filtergraph description composition entails several levels of
escaping. See @ref{quoting_and_escaping,,the "Quoting and escaping"
section in the ffmpeg-utils(1) manual,ffmpeg-utils} for more
information about the employed escaping procedure.

A first level escaping affects the content of each filter option
value, which may contain the special character @code{:} used to
separate values, or one of the escaping characters @code{\'}.

A second level escaping affects the whole filter description, which
may contain the escaping characters @code{\'} or the special
characters @code{[],;} used by the filtergraph description.

Finally, when you specify a filtergraph on a shell commandline, you
need to perform a third level escaping for the shell special
characters contained within it.

For example, consider the following string to be embedded in
the @ref{drawtext} filter description @option{text} value:
@example
this is a 'string': may contain one, or more, special characters
@end example

This string contains the @code{'} special escaping character, and the
@code{:} special character, so it needs to be escaped in this way:
@example
text=this is a \'string\'\: may contain one, or more, special characters
@end example

A second level of escaping is required when embedding the filter
description in a filtergraph description, in order to escape all the
filtergraph special characters. Thus the example above becomes:
@example
drawtext=text=this is a \\\'string\\\'\\: may contain one\, or more\, special characters
@end example
(note that in addition to the @code{\'} escaping special characters,
also @code{,} needs to be escaped).

Finally an additional level of escaping is needed when writing the
filtergraph description in a shell command, which depends on the
escaping rules of the adopted shell. For example, assuming that
@code{\} is special and needs to be escaped with another @code{\}, the
previous string will finally result in:
@example
-vf "drawtext=text=this is a \\\\\\'string\\\\\\'\\\\: may contain one\\, or more\\, special characters"
@end example

@chapter Timeline editing

Some filters support a generic @option{enable} option. For the filters
supporting timeline editing, this option can be set to an expression which is
evaluated before sending a frame to the filter. If the evaluation is non-zero,
the filter will be enabled, otherwise the frame will be sent unchanged to the
next filter in the filtergraph.

The expression accepts the following values:
@table @samp
@item t
timestamp expressed in seconds, NAN if the input timestamp is unknown

@item n
sequential number of the input frame, starting from 0

@item pos
the position in the file of the input frame, NAN if unknown

@item w
@item h
width and height of the input frame if video
@end table

Additionally, these filters support an @option{enable} command that can be used
to re-define the expression.

Like any other filtering option, the @option{enable} option follows the same
rules.

For example, to enable a blur filter (@ref{smartblur}) from 10 seconds to 3
minutes, and a @ref{curves} filter starting at 3 seconds:
@example
smartblur = enable='between(t,10,3*60)',
curves    = enable='gte(t,3)' : preset=cross_process
@end example

See @code{ffmpeg -filters} to view which filters have timeline support.

@c man end FILTERGRAPH DESCRIPTION

@anchor{framesync}
@chapter Options for filters with several inputs (framesync)
@c man begin OPTIONS FOR FILTERS WITH SEVERAL INPUTS

Some filters with several inputs support a common set of options.
These options can only be set by name, not with the short notation.

@table @option
@item eof_action
The action to take when EOF is encountered on the secondary input; it accepts
one of the following values:

@table @option
@item repeat
Repeat the last frame (the default).
@item endall
End both streams.
@item pass
Pass the main input through.
@end table

@item shortest
If set to 1, force the output to terminate when the shortest input
terminates. Default value is 0.

@item repeatlast
If set to 1, force the filter to extend the last frame of secondary streams
until the end of the primary stream. A value of 0 disables this behavior.
Default value is 1.
@end table

@c man end OPTIONS FOR FILTERS WITH SEVERAL INPUTS

@chapter Audio Filters
@c man begin AUDIO FILTERS

When you configure your FFmpeg build, you can disable any of the
existing filters using @code{--disable-filters}.
The configure output will show the audio filters included in your
build.

Below is a description of the currently available audio filters.

@section acompressor

A compressor is mainly used to reduce the dynamic range of a signal.
Especially modern music is mostly compressed at a high ratio to
improve the overall loudness. It's done to get the highest attention
of a listener, "fatten" the sound and bring more "power" to the track.
If a signal is compressed too much it may sound dull or "dead"
afterwards or it may start to "pump" (which could be a powerful effect
but can also destroy a track completely).
The right compression is the key to reach a professional sound and is
the high art of mixing and mastering. Because of its complex settings
it may take a long time to get the right feeling for this kind of effect.

Compression is done by detecting the volume above a chosen level
@code{threshold} and dividing it by the factor set with @code{ratio}.
So if you set the threshold to -12dB and your signal reaches -6dB a ratio
of 2:1 will result in a signal at -9dB. Because an exact manipulation of
the signal would cause distortion of the waveform the reduction can be
levelled over the time. This is done by setting "Attack" and "Release".
@code{attack} determines how long the signal has to rise above the threshold
before any reduction will occur and @code{release} sets the time the signal
has to fall below the threshold to reduce the reduction again. Shorter signals
than the chosen attack time will be left untouched.
The overall reduction of the signal can be made up afterwards with the
@code{makeup} setting. So compressing the peaks of a signal about 6dB and
raising the makeup to this level results in a signal twice as loud than the
source. To gain a softer entry in the compression the @code{knee} flattens the
hard edge at the threshold in the range of the chosen decibels.

The filter accepts the following options:

@table @option
@item level_in
Set input gain. Default is 1. Range is between 0.015625 and 64.

@item threshold
If a signal of stream rises above this level it will affect the gain
reduction.
By default it is 0.125. Range is between 0.00097563 and 1.

@item ratio
Set a ratio by which the signal is reduced. 1:2 means that if the level
rose 4dB above the threshold, it will be only 2dB above after the reduction.
Default is 2. Range is between 1 and 20.

@item attack
Amount of milliseconds the signal has to rise above the threshold before gain
reduction starts. Default is 20. Range is between 0.01 and 2000.

@item release
Amount of milliseconds the signal has to fall below the threshold before
reduction is decreased again. Default is 250. Range is between 0.01 and 9000.

@item makeup
Set the amount by how much signal will be amplified after processing.
Default is 1. Range is from 1 to 64.

@item knee
Curve the sharp knee around the threshold to enter gain reduction more softly.
Default is 2.82843. Range is between 1 and 8.

@item link
Choose if the @code{average} level between all channels of input stream
or the louder(@code{maximum}) channel of input stream affects the
reduction. Default is @code{average}.

@item detection
Should the exact signal be taken in case of @code{peak} or an RMS one in case
of @code{rms}. Default is @code{rms} which is mostly smoother.

@item mix
How much to use compressed signal in output. Default is 1.
Range is between 0 and 1.
@end table

@section acontrast
Simple audio dynamic range commpression/expansion filter.

The filter accepts the following options:

@table @option
@item contrast
Set contrast. Default is 33. Allowed range is between 0 and 100.
@end table

@section acopy

Copy the input audio source unchanged to the output. This is mainly useful for
testing purposes.

@section acrossfade

Apply cross fade from one input audio stream to another input audio stream.
The cross fade is applied for specified duration near the end of first stream.

The filter accepts the following options:

@table @option
@item nb_samples, ns
Specify the number of samples for which the cross fade effect has to last.
At the end of the cross fade effect the first input audio will be completely
silent. Default is 44100.

@item duration, d
Specify the duration of the cross fade effect. See
@ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils}
for the accepted syntax.
By default the duration is determined by @var{nb_samples}.
If set this option is used instead of @var{nb_samples}.

@item overlap, o
Should first stream end overlap with second stream start. Default is enabled.

@item curve1
Set curve for cross fade transition for first stream.

@item curve2
Set curve for cross fade transition for second stream.

For description of available curve types see @ref{afade} filter description.
@end table

@subsection Examples

@itemize
@item
Cross fade from one input to another:
@example
ffmpeg -i first.flac -i second.flac -filter_complex acrossfade=d=10:c1=exp:c2=exp output.flac
@end example

@item
Cross fade from one input to another but without overlapping:
@example
ffmpeg -i first.flac -i second.flac -filter_complex acrossfade=d=10:o=0:c1=exp:c2=exp output.flac
@end example
@end itemize

@section acrusher

Reduce audio bit resolution.

This filter is bit crusher with enhanced functionality. A bit crusher
is used to audibly reduce number of bits an audio signal is sampled
with. This doesn't change the bit depth at all, it just produces the
effect. Material reduced in bit depth sounds more harsh and "digital".
This filter is able to even round to continuous values instead of discrete
bit depths.
Additionally it has a D/C offset which results in different crushing of
the lower and the upper half of the signal.
An Anti-Aliasing setting is able to produce "softer" crushing sounds.

Another feature of this filter is the logarithmic mode.
This setting switches from linear distances between bits to logarithmic ones.
The result is a much more "natural" sounding crusher which doesn't gate low
signals for example. The human ear has a logarithmic perception,
so this kind of crushing is much more pleasant.
Logarithmic crushing is also able to get anti-aliased.

The filter accepts the following options:

@table @option
@item level_in
Set level in.

@item level_out
Set level out.

@item bits
Set bit reduction.

@item mix
Set mixing amount.

@item mode
Can be linear: @code{lin} or logarithmic: @code{log}.

@item dc
Set DC.

@item aa
Set anti-aliasing.

@item samples
Set sample reduction.

@item lfo
Enable LFO. By default disabled.

@item lforange
Set LFO range.

@item lforate
Set LFO rate.
@end table

@section adelay

Delay one or more audio channels.

Samples in delayed channel are filled with silence.

The filter accepts the following option:

@table @option
@item delays
Set list of delays in milliseconds for each channel separated by '|'.
Unused delays will be silently ignored. If number of given delays is
smaller than number of channels all remaining channels will not be delayed.
If you want to delay exact number of samples, append 'S' to number.
@end table

@subsection Examples

@itemize
@item
Delay first channel by 1.5 seconds, the third channel by 0.5 seconds and leave
the second channel (and any other channels that may be present) unchanged.
@example
adelay=1500|0|500
@end example

@item
Delay second channel by 500 samples, the third channel by 700 samples and leave
the first channel (and any other channels that may be present) unchanged.
@example
adelay=0|500S|700S
@end example
@end itemize

@section aecho

Apply echoing to the input audio.

Echoes are reflected sound and can occur naturally amongst mountains
(and sometimes large buildings) when talking or shouting; digital echo
effects emulate this behaviour and are often used to help fill out the
sound of a single instrument or vocal. The time difference between the
original signal and the reflection is the @code{delay}, and the
loudness of the reflected signal is the @code{decay}.
Multiple echoes can have different delays and decays.

A description of the accepted parameters follows.

@table @option
@item in_gain
Set input gain of reflected signal. Default is @code{0.6}.

@item out_gain
Set output gain of reflected signal. Default is @code{0.3}.

@item delays
Set list of time intervals in milliseconds between original signal and reflections
separated by '|'. Allowed range for each @code{delay} is @code{(0 - 90000.0]}.
Default is @code{1000}.

@item decays
Set list of loudness of reflected signals separated by '|'.
Allowed range for each @code{decay} is @code{(0 - 1.0]}.
Default is @code{0.5}.
@end table

@subsection Examples

@itemize
@item
Make it sound as if there are twice as many instruments as are actually playing:
@example
aecho=0.8:0.88:60:0.4
@end example

@item
If delay is very short, then it sound like a (metallic) robot playing music:
@example
aecho=0.8:0.88:6:0.4
@end example

@item
A longer delay will sound like an open air concert in the mountains:
@example
aecho=0.8:0.9:1000:0.3
@end example

@item
Same as above but with one more mountain:
@example
aecho=0.8:0.9:1000|1800:0.3|0.25
@end example
@end itemize

@section aemphasis
Audio emphasis filter creates or restores material directly taken from LPs or
emphased CDs with different filter curves. E.g. to store music on vinyl the
signal has to be altered by a filter first to even out the disadvantages of
this recording medium.
Once the material is played back the inverse filter has to be applied to
restore the distortion of the frequency response.

The filter accepts the following options:

@table @option
@item level_in
Set input gain.

@item level_out
Set output gain.

@item mode
Set filter mode. For restoring material use @code{reproduction} mode, otherwise
use @code{production} mode. Default is @code{reproduction} mode.

@item type
Set filter type. Selects medium. Can be one of the following:

@table @option
@item col
select Columbia.
@item emi
select EMI.
@item bsi
select BSI (78RPM).
@item riaa
select RIAA.
@item cd
select Compact Disc (CD).
@item 50fm
select 50µs (FM).
@item 75fm
select 75µs (FM).
@item 50kf
select 50µs (FM-KF).
@item 75kf
select 75µs (FM-KF).
@end table
@end table

@section aeval

Modify an audio signal according to the specified expressions.

This filter accepts one or more expressions (one for each channel),
which are evaluated and used to modify a corresponding audio signal.

It accepts the following parameters:

@table @option
@item exprs
Set the '|'-separated expressions list for each separate channel. If
the number of input channels is greater than the number of
expressions, the last specified expression is used for the remaining
output channels.

@item channel_layout, c
Set output channel layout. If not specified, the channel layout is
specified by the number of expressions. If set to @samp{same}, it will
use by default the same input channel layout.
@end table

Each expression in @var{exprs} can contain the following constants and functions:

@table @option
@item ch
channel number of the current expression

@item n
number of the evaluated sample, starting from 0

@item s
sample rate

@item t
time of the evaluated sample expressed in seconds

@item nb_in_channels
@item nb_out_channels
input and output number of channels

@item val(CH)
the value of input channel with number @var{CH}
@end table

Note: this filter is slow. For faster processing you should use a
dedicated filter.

@subsection Examples

@itemize
@item
Half volume:
@example
aeval=val(ch)/2:c=same
@end example

@item
Invert phase of the second channel:
@example
aeval=val(0)|-val(1)
@end example
@end itemize

@anchor{afade}
@section afade

Apply fade-in/out effect to input audio.

A description of the accepted parameters follows.

@table @option
@item type, t
Specify the effect type, can be either @code{in} for fade-in, or
@code{out} for a fade-out effect. Default is @code{in}.

@item start_sample, ss
Specify the number of the start sample for starting to apply the fade
effect. Default is 0.

@item nb_samples, ns
Specify the number of samples for which the fade effect has to last. At
the end of the fade-in effect the output audio will have the same
volume as the input audio, at the end of the fade-out transition
the output audio will be silence. Default is 44100.

@item start_time, st
Specify the start time of the fade effect. Default is 0.
The value must be specified as a time duration; see
@ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils}
for the accepted syntax.
If set this option is used instead of @var{start_sample}.

@item duration, d
Specify the duration of the fade effect. See
@ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils}
for the accepted syntax.
At the end of the fade-in effect the output audio will have the same
volume as the input audio, at the end of the fade-out transition
the output audio will be silence.
By default the duration is determined by @var{nb_samples}.
If set this option is used instead of @var{nb_samples}.

@item curve
Set curve for fade transition.

It accepts the following values:
@table @option
@item tri
select triangular, linear slope (default)
@item qsin
select quarter of sine wave
@item hsin
select half of sine wave
@item esin
select exponential sine wave
@item log
select logarithmic
@item ipar
select inverted parabola
@item qua
select quadratic
@item cub
select cubic
@item squ
select square root
@item cbr
select cubic root
@item par
select parabola
@item exp
select exponential
@item iqsin
select inverted quarter of sine wave
@item ihsin
select inverted half of sine wave
@item dese
select double-exponential seat
@item desi
select double-exponential sigmoid
@end table
@end table

@subsection Examples

@itemize
@item
Fade in first 15 seconds of audio:
@example
afade=t=in:ss=0:d=15
@end example

@item
Fade out last 25 seconds of a 900 seconds audio:
@example
afade=t=out:st=875:d=25
@end example
@end itemize

@section afftfilt
Apply arbitrary expressions to samples in frequency domain.

@table @option
@item real
Set frequency domain real expression for each separate channel separated
by '|'. Default is "1".
If the number of input channels is greater than the number of
expressions, the last specified expression is used for the remaining
output channels.

@item imag
Set frequency domain imaginary expression for each separate channel
separated by '|'. If not set, @var{real} option is used.

Each expression in @var{real} and @var{imag} can contain the following
constants:

@table @option
@item sr
sample rate

@item b
current frequency bin number

@item nb
number of available bins

@item ch
channel number of the current expression

@item chs
number of channels

@item pts
current frame pts
@end table

@item win_size
Set window size.

It accepts the following values:
@table @samp
@item w16
@item w32
@item w64
@item w128
@item w256
@item w512
@item w1024
@item w2048
@item w4096
@item w8192
@item w16384
@item w32768
@item w65536
@end table
Default is @code{w4096}

@item win_func
Set window function. Default is @code{hann}.

@item overlap
Set window overlap. If set to 1, the recommended overlap for selected
window function will be picked. Default is @code{0.75}.
@end table

@subsection Examples

@itemize
@item
Leave almost only low frequencies in audio:
@example
afftfilt="1-clip((b/nb)*b,0,1)"
@end example
@end itemize

@anchor{afir}
@section afir

Apply an arbitrary Frequency Impulse Response filter.

This filter is designed for applying long FIR filters,
up to 30 seconds long.

It can be used as component for digital crossover filters,
room equalization, cross talk cancellation, wavefield synthesis,
auralization, ambiophonics and ambisonics.

This filter uses second stream as FIR coefficients.
If second stream holds single channel, it will be used
for all input channels in first stream, otherwise
number of channels in second stream must be same as
number of channels in first stream.

It accepts the following parameters:

@table @option
@item dry
Set dry gain. This sets input gain.

@item wet
Set wet gain. This sets final output gain.

@item length
Set Impulse Response filter length. Default is 1, which means whole IR is processed.

@item again
Enable applying gain measured from power of IR.
@end table

@subsection Examples

@itemize
@item
Apply reverb to stream using mono IR file as second input, complete command using ffmpeg:
@example
ffmpeg -i input.wav -i middle_tunnel_1way_mono.wav -lavfi afir output.wav
@end example
@end itemize

@anchor{aformat}
@section aformat

Set output format constraints for the input audio. The framework will
negotiate the most appropriate format to minimize conversions.

It accepts the following parameters:
@table @option

@item sample_fmts
A '|'-separated list of requested sample formats.

@item sample_rates
A '|'-separated list of requested sample rates.

@item channel_layouts
A '|'-separated list of requested channel layouts.

See @ref{channel layout syntax,,the Channel Layout section in the ffmpeg-utils(1) manual,ffmpeg-utils}
for the required syntax.
@end table

If a parameter is omitted, all values are allowed.

Force the output to either unsigned 8-bit or signed 16-bit stereo
@example
aformat=sample_fmts=u8|s16:channel_layouts=stereo
@end example

@section agate

A gate is mainly used to reduce lower parts of a signal. This kind of signal
processing reduces disturbing noise between useful signals.

Gating is done by detecting the volume below a chosen level @var{threshold}
and dividing it by the factor set with @var{ratio}. The bottom of the noise
floor is set via @var{range}. Because an exact manipulation of the signal
would cause distortion of the waveform the reduction can be levelled over
time. This is done by setting @var{attack} and @var{release}.

@var{attack} determines how long the signal has to fall below the threshold
before any reduction will occur and @var{release} sets the time the signal
has to rise above the threshold to reduce the reduction again.
Shorter signals than the chosen attack time will be left untouched.

@table @option
@item level_in
Set input level before filtering.
Default is 1. Allowed range is from 0.015625 to 64.

@item range
Set the level of gain reduction when the signal is below the threshold.
Default is 0.06125. Allowed range is from 0 to 1.

@item threshold
If a signal rises above this level the gain reduction is released.
Default is 0.125. Allowed range is from 0 to 1.

@item ratio
Set a ratio by which the signal is reduced.
Default is 2. Allowed range is from 1 to 9000.

@item attack
Amount of milliseconds the signal has to rise above the threshold before gain
reduction stops.
Default is 20 milliseconds. Allowed range is from 0.01 to 9000.

@item release
Amount of milliseconds the signal has to fall below the threshold before the
reduction is increased again. Default is 250 milliseconds.
Allowed range is from 0.01 to 9000.

@item makeup
Set amount of amplification of signal after processing.
Default is 1. Allowed range is from 1 to 64.

@item knee
Curve the sharp knee around the threshold to enter gain reduction more softly.
Default is 2.828427125. Allowed range is from 1 to 8.

@item detection
Choose if exact signal should be taken for detection or an RMS like one.
Default is @code{rms}. Can be @code{peak} or @code{rms}.

@item link
Choose if the average level between all channels or the louder channel affects
the reduction.
Default is @code{average}. Can be @code{average} or @code{maximum}.
@end table

@section aiir

Apply an arbitrary Infinite Impulse Response filter.

It accepts the following parameters:

@table @option
@item z
Set numerator/zeros coefficients.

@item p
Set denominator/poles coefficients.

@item k
Set channels gains.

@item dry_gain
Set input gain.

@item wet_gain
Set output gain.

@item f
Set coefficients format.

@table @samp
@item tf
transfer function
@item zp
Z-plane zeros/poles, cartesian (default)
@item pr
Z-plane zeros/poles, polar radians
@item pd
Z-plane zeros/poles, polar degrees
@end table

@item r
Set kind of processing.
Can be @code{d} - direct or @code{s} - serial cascading. Defauls is @code{s}.

@item e
Set filtering precision.

@table @samp
@item dbl
double-precision floating-point (default)
@item flt
single-precision floating-point
@item i32
32-bit integers
@item i16
16-bit integers
@end table

@end table

Coefficients in @code{tf} format are separated by spaces and are in ascending
order.

Coefficients in @code{zp} format are separated by spaces and order of coefficients
doesn't matter. Coefficients in @code{zp} format are complex numbers with @var{i}
imaginary unit.

Different coefficients and gains can be provided for every channel, in such case
use '|' to separate coefficients or gains. Last provided coefficients will be
used for all remaining channels.

@subsection Examples

@itemize
@item
Apply 2 pole elliptic notch at arround 5000Hz for 48000 Hz sample rate:
@example
aiir=k=1:z=7.957584807809675810E-1 -2.575128568908332300 3.674839853930788710 -2.57512875289799137 7.957586296317130880E-1:p=1 -2.86950072432325953 3.63022088054647218 -2.28075678147272232 6.361362326477423500E-1:f=tf:r=d
@end example

@item
Same as above but in @code{zp} format:
@example
aiir=k=0.79575848078096756:z=0.80918701+0.58773007i 0.80918701-0.58773007i 0.80884700+0.58784055i 0.80884700-0.58784055i:p=0.63892345+0.59951235i 0.63892345-0.59951235i 0.79582691+0.44198673i 0.79582691-0.44198673i:f=zp:r=s
@end example
@end itemize

@section alimiter

The limiter prevents an input signal from rising over a desired threshold.
This limiter uses lookahead technology to prevent your signal from distorting.
It means that there is a small delay after the signal is processed. Keep in mind
that the delay it produces is the attack time you set.

The filter accepts the following options:

@table @option
@item level_in
Set input gain. Default is 1.

@item level_out
Set output gain. Default is 1.

@item limit
Don't let signals above this level pass the limiter. Default is 1.

@item attack
The limiter will reach its attenuation level in this amount of time in
milliseconds. Default is 5 milliseconds.

@item release
Come back from limiting to attenuation 1.0 in this amount of milliseconds.
Default is 50 milliseconds.

@item asc
When gain reduction is always needed ASC takes care of releasing to an
average reduction level rather than reaching a reduction of 0 in the release
time.

@item asc_level
Select how much the release time is affected by ASC, 0 means nearly no changes
in release time while 1 produces higher release times.

@item level
Auto level output signal. Default is enabled.
This normalizes audio back to 0dB if enabled.
@end table

Depending on picked setting it is recommended to upsample input 2x or 4x times
with @ref{aresample} before applying this filter.

@section allpass

Apply a two-pole all-pass filter with central frequency (in Hz)
@var{frequency}, and filter-width @var{width}.
An all-pass filter changes the audio's frequency to phase relationship
without changing its frequency to amplitude relationship.

The filter accepts the following options:

@table @option
@item frequency, f
Set frequency in Hz.

@item width_type, t
Set method to specify band-width of filter.
@table @option
@item h
Hz
@item q
Q-Factor
@item o
octave
@item s
slope
@item k
kHz
@end table

@item width, w
Specify the band-width of a filter in width_type units.

@item channels, c
Specify which channels to filter, by default all available are filtered.
@end table

@subsection Commands

This filter supports the following commands:
@table @option
@item frequency, f
Change allpass frequency.
Syntax for the command is : "@var{frequency}"

@item width_type, t
Change allpass width_type.
Syntax for the command is : "@var{width_type}"

@item width, w
Change allpass width.
Syntax for the command is : "@var{width}"
@end table

@section aloop

Loop audio samples.

The filter accepts the following options:

@table @option
@item loop
Set the number of loops. Setting this value to -1 will result in infinite loops.
Default is 0.

@item size
Set maximal number of samples. Default is 0.

@item start
Set first sample of loop. Default is 0.
@end table

@anchor{amerge}
@section amerge

Merge two or more audio streams into a single multi-channel stream.

The filter accepts the following options:

@table @option

@item inputs
Set the number of inputs. Default is 2.

@end table

If the channel layouts of the inputs are disjoint, and therefore compatible,
the channel layout of the output will be set accordingly and the channels
will be reordered as necessary. If the channel layouts of the inputs are not
disjoint, the output will have all the channels of the first input then all
the channels of the second input, in that order, and the channel layout of
the output will be the default value corresponding to the total number of
channels.

For example, if the first input is in 2.1 (FL+FR+LF) and the second input
is FC+BL+BR, then the output will be in 5.1, with the channels in the
following order: a1, a2, b1, a3, b2, b3 (a1 is the first channel of the
first input, b1 is the first channel of the second input).

On the other hand, if both input are in stereo, the output channels will be
in the default order: a1, a2, b1, b2, and the channel layout will be
arbitrarily set to 4.0, which may or may not be the expected value.

All inputs must have the same sample rate, and format.

If inputs do not have the same duration, the output will stop with the
shortest.

@subsection Examples

@itemize
@item
Merge two mono files into a stereo stream:
@example
amovie=left.wav [l] ; amovie=right.mp3 [r] ; [l] [r] amerge
@end example

@item
Multiple merges assuming 1 video stream and 6 audio streams in @file{input.mkv}:
@example
ffmpeg -i input.mkv -filter_complex "[0:1][0:2][0:3][0:4][0:5][0:6] amerge=inputs=6" -c:a pcm_s16le output.mkv
@end example
@end itemize

@section amix

Mixes multiple audio inputs into a single output.

Note that this filter only supports float samples (the @var{amerge}
and @var{pan} audio filters support many formats). If the @var{amix}
input has integer samples then @ref{aresample} will be automatically
inserted to perform the conversion to float samples.

For example
@example
ffmpeg -i INPUT1 -i INPUT2 -i INPUT3 -filter_complex amix=inputs=3:duration=first:dropout_transition=3 OUTPUT
@end example
will mix 3 input audio streams to a single output with the same duration as the
first input and a dropout transition time of 3 seconds.

It accepts the following parameters:
@table @option

@item inputs
The number of inputs. If unspecified, it defaults to 2.

@item duration
How to determine the end-of-stream.
@table @option

@item longest
The duration of the longest input. (default)

@item shortest
The duration of the shortest input.

@item first
The duration of the first input.

@end table

@item dropout_transition
The transition time, in seconds, for volume renormalization when an input
stream ends. The default value is 2 seconds.

@item weights
Specify weight of each input audio stream as sequence.
Each weight is separated by space. By default all inputs have same weight.
@end table

@section anequalizer

High-order parametric multiband equalizer for each channel.

It accepts the following parameters:
@table @option
@item params

This option string is in format:
"c@var{chn} f=@var{cf} w=@var{w} g=@var{g} t=@var{f} | ..."
Each equalizer band is separated by '|'.

@table @option
@item chn
Set channel number to which equalization will be applied.
If input doesn't have that channel the entry is ignored.

@item f
Set central frequency for band.
If input doesn't have that frequency the entry is ignored.

@item w
Set band width in hertz.

@item g
Set band gain in dB.

@item t
Set filter type for band, optional, can be:

@table @samp
@item 0
Butterworth, this is default.

@item 1
Chebyshev type 1.

@item 2
Chebyshev type 2.
@end table
@end table

@item curves
With this option activated frequency response of anequalizer is displayed
in video stream.

@item size
Set video stream size. Only useful if curves option is activated.

@item mgain
Set max gain that will be displayed. Only useful if curves option is activated.
Setting this to a reasonable value makes it possible to display gain which is derived from
neighbour bands which are too close to each other and thus produce higher gain
when both are activated.

@item fscale
Set frequency scale used to draw frequency response in video output.
Can be linear or logarithmic. Default is logarithmic.

@item colors
Set color for each channel curve which is going to be displayed in video stream.
This is list of color names separated by space or by '|'.
Unrecognised or missing colors will be replaced by white color.
@end table

@subsection Examples

@itemize
@item
Lower gain by 10 of central frequency 200Hz and width 100 Hz
for first 2 channels using Chebyshev type 1 filter:
@example
anequalizer=c0 f=200 w=100 g=-10 t=1|c1 f=200 w=100 g=-10 t=1
@end example
@end itemize

@subsection Commands

This filter supports the following commands:
@table @option
@item change
Alter existing filter parameters.
Syntax for the commands is : "@var{fN}|f=@var{freq}|w=@var{width}|g=@var{gain}"

@var{fN} is existing filter number, starting from 0, if no such filter is available
error is returned.
@var{freq} set new frequency parameter.
@var{width} set new width parameter in herz.
@var{gain} set new gain parameter in dB.

Full filter invocation with asendcmd may look like this:
asendcmd=c='4.0 anequalizer change 0|f=200|w=50|g=1',anequalizer=...
@end table

@section anull

Pass the audio source unchanged to the output.

@section apad

Pad the end of an audio stream with silence.

This can be used together with @command{ffmpeg} @option{-shortest} to
extend audio streams to the same length as the video stream.

A description of the accepted options follows.

@table @option
@item packet_size
Set silence packet size. Default value is 4096.

@item pad_len
Set the number of samples of silence to add to the end. After the
value is reached, the stream is terminated. This option is mutually
exclusive with @option{whole_len}.

@item whole_len
Set the minimum total number of samples in the output audio stream. If
the value is longer than the input audio length, silence is added to
the end, until the value is reached. This option is mutually exclusive
with @option{pad_len}.
@end table

If neither the @option{pad_len} nor the @option{whole_len} option is
set, the filter will add silence to the end of the input stream
indefinitely.

@subsection Examples

@itemize
@item
Add 1024 samples of silence to the end of the input:
@example
apad=pad_len=1024
@end example

@item
Make sure the audio output will contain at least 10000 samples, pad
the input with silence if required:
@example
apad=whole_len=10000
@end example

@item
Use @command{ffmpeg} to pad the audio input with silence, so that the
video stream will always result the shortest and will be converted
until the end in the output file when using the @option{shortest}
option:
@example
ffmpeg -i VIDEO -i AUDIO -filter_complex "[1:0]apad" -shortest OUTPUT
@end example
@end itemize

@section aphaser
Add a phasing effect to the input audio.

A phaser filter creates series of peaks and troughs in the frequency spectrum.
The position of the peaks and troughs are modulated so that they vary over time, creating a sweeping effect.

A description of the accepted parameters follows.

@table @option
@item in_gain
Set input gain. Default is 0.4.

@item out_gain
Set output gain. Default is 0.74

@item delay
Set delay in milliseconds. Default is 3.0.

@item decay
Set decay. Default is 0.4.

@item speed
Set modulation speed in Hz. Default is 0.5.

@item type
Set modulation type. Default is triangular.

It accepts the following values:
@table @samp
@item triangular, t
@item sinusoidal, s
@end table
@end table

@section apulsator

Audio pulsator is something between an autopanner and a tremolo.
But it can produce funny stereo effects as well. Pulsator changes the volume
of the left and right channel based on a LFO (low frequency oscillator) with
different waveforms and shifted phases.
This filter have the ability to define an offset between left and right
channel. An offset of 0 means that both LFO shapes match each other.
The left and right channel are altered equally - a conventional tremolo.
An offset of 50% means that the shape of the right channel is exactly shifted
in phase (or moved backwards about half of the frequency) - pulsator acts as
an autopanner. At 1 both curves match again. Every setting in between moves the
phase shift gapless between all stages and produces some "bypassing" sounds with
sine and triangle waveforms. The more you set the offset near 1 (starting from
the 0.5) the faster the signal passes from the left to the right speaker.

The filter accepts the following options:

@table @option
@item level_in
Set input gain. By default it is 1. Range is [0.015625 - 64].

@item level_out
Set output gain. By default it is 1. Range is [0.015625 - 64].

@item mode
Set waveform shape the LFO will use. Can be one of: sine, triangle, square,
sawup or sawdown. Default is sine.

@item amount
Set modulation. Define how much of original signal is affected by the LFO.

@item offset_l
Set left channel offset. Default is 0. Allowed range is [0 - 1].

@item offset_r
Set right channel offset. Default is 0.5. Allowed range is [0 - 1].

@item width
Set pulse width. Default is 1. Allowed range is [0 - 2].

@item timing
Set possible timing mode. Can be one of: bpm, ms or hz. Default is hz.

@item bpm
Set bpm. Default is 120. Allowed range is [30 - 300]. Only used if timing
is set to bpm.

@item ms
Set ms. Default is 500. Allowed range is [10 - 2000]. Only used if timing
is set to ms.

@item hz
Set frequency in Hz. Default is 2. Allowed range is [0.01 - 100]. Only used
if timing is set to hz.
@end table

@anchor{aresample}
@section aresample

Resample the input audio to the specified parameters, using the
libswresample library. If none are specified then the filter will
automatically convert between its input and output.

This filter is also able to stretch/squeeze the audio data to make it match
the timestamps or to inject silence / cut out audio to make it match the
timestamps, do a combination of both or do neither.

The filter accepts the syntax
[@var{sample_rate}:]@var{resampler_options}, where @var{sample_rate}
expresses a sample rate and @var{resampler_options} is a list of
@var{key}=@var{value} pairs, separated by ":". See the
@ref{Resampler Options,,"Resampler Options" section in the
ffmpeg-resampler(1) manual,ffmpeg-resampler}
for the complete list of supported options.

@subsection Examples

@itemize
@item
Resample the input audio to 44100Hz:
@example
aresample=44100
@end example

@item
Stretch/squeeze samples to the given timestamps, with a maximum of 1000
samples per second compensation:
@example
aresample=async=1000
@end example
@end itemize

@section areverse

Reverse an audio clip.

Warning: This filter requires memory to buffer the entire clip, so trimming
is suggested.

@subsection Examples

@itemize
@item
Take the first 5 seconds of a clip, and reverse it.
@example
atrim=end=5,areverse
@end example
@end itemize

@section asetnsamples

Set the number of samples per each output audio frame.

The last output packet may contain a different number of samples, as
the filter will flush all the remaining samples when the input audio
signals its end.

The filter accepts the following options:

@table @option

@item nb_out_samples, n
Set the number of frames per each output audio frame. The number is
intended as the number of samples @emph{per each channel}.
Default value is 1024.

@item pad, p
If set to 1, the filter will pad the last audio frame with zeroes, so
that the last frame will contain the same number of samples as the
previous ones. Default value is 1.
@end table

For example, to set the number of per-frame samples to 1234 and
disable padding for the last frame, use:
@example
asetnsamples=n=1234:p=0
@end example

@section asetrate

Set the sample rate without altering the PCM data.
This will result in a change of speed and pitch.

The filter accepts the following options:

@table @option
@item sample_rate, r
Set the output sample rate. Default is 44100 Hz.
@end table

@section ashowinfo

Show a line containing various information for each input audio frame.
The input audio is not modified.

The shown line contains a sequence of key/value pairs of the form
@var{key}:@var{value}.

The following values are shown in the output:

@table @option
@item n
The (sequential) number of the input frame, starting from 0.

@item pts
The presentation timestamp of the input frame, in time base units; the time base
depends on the filter input pad, and is usually 1/@var{sample_rate}.

@item pts_time
The presentation timestamp of the input frame in seconds.

@item pos
position of the frame in the input stream, -1 if this information in
unavailable and/or meaningless (for example in case of synthetic audio)

@item fmt
The sample format.

@item chlayout
The channel layout.

@item rate
The sample rate for the audio frame.

@item nb_samples
The number of samples (per channel) in the frame.

@item checksum
The Adler-32 checksum (printed in hexadecimal) of the audio data. For planar
audio, the data is treated as if all the planes were concatenated.

@item plane_checksums
A list of Adler-32 checksums for each data plane.
@end table

@anchor{astats}
@section astats

Display time domain statistical information about the audio channels.
Statistics are calculated and displayed for each audio channel and,
where applicable, an overall figure is also given.

It accepts the following option:
@table @option
@item length
Short window length in seconds, used for peak and trough RMS measurement.
Default is @code{0.05} (50 milliseconds). Allowed range is @code{[0.01 - 10]}.

@item metadata

Set metadata injection. All the metadata keys are prefixed with @code{lavfi.astats.X},
where @code{X} is channel number starting from 1 or string @code{Overall}. Default is
disabled.

Available keys for each channel are:
DC_offset
Min_level
Max_level
Min_difference
Max_difference
Mean_difference
RMS_difference
Peak_level
RMS_peak
RMS_trough
Crest_factor
Flat_factor
Peak_count
Bit_depth
Dynamic_range

and for Overall:
DC_offset
Min_level
Max_level
Min_difference
Max_difference
Mean_difference
RMS_difference
Peak_level
RMS_level
RMS_peak
RMS_trough
Flat_factor
Peak_count
Bit_depth
Number_of_samples

For example full key look like this @code{lavfi.astats.1.DC_offset} or
this @code{lavfi.astats.Overall.Peak_count}.

For description what each key means read below.

@item reset
Set number of frame after which stats are going to be recalculated.
Default is disabled.
@end table

A description of each shown parameter follows:

@table @option
@item DC offset
Mean amplitude displacement from zero.

@item Min level
Minimal sample level.

@item Max level
Maximal sample level.

@item Min difference
Minimal difference between two consecutive samples.

@item Max difference
Maximal difference between two consecutive samples.

@item Mean difference
Mean difference between two consecutive samples.
The average of each difference between two consecutive samples.

@item RMS difference
Root Mean Square difference between two consecutive samples.

@item Peak level dB
@item RMS level dB
Standard peak and RMS level measured in dBFS.

@item RMS peak dB
@item RMS trough dB
Peak and trough values for RMS level measured over a short window.

@item Crest factor
Standard ratio of peak to RMS level (note: not in dB).

@item Flat factor
Flatness (i.e. consecutive samples with the same value) of the signal at its peak levels
(i.e. either @var{Min level} or @var{Max level}).

@item Peak count
Number of occasions (not the number of samples) that the signal attained either
@var{Min level} or @var{Max level}.

@item Bit depth
Overall bit depth of audio. Number of bits used for each sample.

@item Dynamic range
Measured dynamic range of audio in dB.
@end table

@section atempo

Adjust audio tempo.

The filter accepts exactly one parameter, the audio tempo. If not
specified then the filter will assume nominal 1.0 tempo. Tempo must
be in the [0.5, 2.0] range.

@subsection Examples

@itemize
@item
Slow down audio to 80% tempo:
@example
atempo=0.8
@end example

@item
To speed up audio to 125% tempo:
@example
atempo=1.25
@end example
@end itemize

@section atrim

Trim the input so that the output contains one continuous subpart of the input.

It accepts the following parameters:
@table @option
@item start
Timestamp (in seconds) of the start of the section to keep. I.e. the audio
sample with the timestamp @var{start} will be the first sample in the output.

@item end
Specify time of the first audio sample that will be dropped, i.e. the
audio sample immediately preceding the one with the timestamp @var{end} will be
the last sample in the output.

@item start_pts
Same as @var{start}, except this option sets the start timestamp in samples
instead of seconds.

@item end_pts
Same as @var{end}, except this option sets the end timestamp in samples instead
of seconds.

@item duration
The maximum duration of the output in seconds.

@item start_sample
The number of the first sample that should be output.

@item end_sample
The number of the first sample that should be dropped.
@end table

@option{start}, @option{end}, and @option{duration} are expressed as time
duration specifications; see
@ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils}.

Note that the first two sets of the start/end options and the @option{duration}
option look at the frame timestamp, while the _sample options simply count the
samples that pass through the filter. So start/end_pts and start/end_sample will
give different results when the timestamps are wrong, inexact or do not start at
zero. Also note that this filter does not modify the timestamps. If you wish
to have the output timestamps start at zero, insert the asetpts filter after the
atrim filter.

If multiple start or end options are set, this filter tries to be greedy and
keep all samples that match at least one of the specified constraints. To keep
only the part that matches all the constraints at once, chain multiple atrim
filters.

The defaults are such that all the input is kept. So it is possible to set e.g.
just the end values to keep everything before the specified time.

Examples:
@itemize
@item
Drop everything except the second minute of input:
@example
ffmpeg -i INPUT -af atrim=60:120
@end example

@item
Keep only the first 1000 samples:
@example
ffmpeg -i INPUT -af atrim=end_sample=1000
@end example

@end itemize

@section bandpass

Apply a two-pole Butterworth band-pass filter with central
frequency @var{frequency}, and (3dB-point) band-width width.
The @var{csg} option selects a constant skirt gain (peak gain = Q)
instead of the default: constant 0dB peak gain.
The filter roll off at 6dB per octave (20dB per decade).

The filter accepts the following options:

@table @option
@item frequency, f
Set the filter's central frequency. Default is @code{3000}.

@item csg
Constant skirt gain if set to 1. Defaults to 0.

@item width_type, t
Set method to specify band-width of filter.
@table @option
@item h
Hz
@item q
Q-Factor
@item o
octave
@item s
slope
@item k
kHz
@end table

@item width, w
Specify the band-width of a filter in width_type units.

@item channels, c
Specify which channels to filter, by default all available are filtered.
@end table

@subsection Commands

This filter supports the following commands:
@table @option
@item frequency, f
Change bandpass frequency.
Syntax for the command is : "@var{frequency}"

@item width_type, t
Change bandpass width_type.
Syntax for the command is : "@var{width_type}"

@item width, w
Change bandpass width.
Syntax for the command is : "@var{width}"
@end table

@section bandreject

Apply a two-pole Butterworth band-reject filter with central
frequency @var{frequency}, and (3dB-point) band-width @var{width}.
The filter roll off at 6dB per octave (20dB per decade).

The filter accepts the following options:

@table @option
@item frequency, f
Set the filter's central frequency. Default is @code{3000}.

@item width_type, t
Set method to specify band-width of filter.
@table @option
@item h
Hz
@item q
Q-Factor
@item o
octave
@item s
slope
@item k
kHz
@end table

@item width, w
Specify the band-width of a filter in width_type units.

@item channels, c
Specify which channels to filter, by default all available are filtered.
@end table

@subsection Commands

This filter supports the following commands:
@table @option
@item frequency, f
Change bandreject frequency.
Syntax for the command is : "@var{frequency}"

@item width_type, t
Change bandreject width_type.
Syntax for the command is : "@var{width_type}"

@item width, w
Change bandreject width.
Syntax for the command is : "@var{width}"
@end table

@section bass

Boost or cut the bass (lower) frequencies of the audio using a two-pole
shelving filter with a response similar to that of a standard
hi-fi's tone-controls. This is also known as shelving equalisation (EQ).

The filter accepts the following options:

@table @option
@item gain, g
Give the gain at 0 Hz. Its useful range is about -20
(for a large cut) to +20 (for a large boost).
Beware of clipping when using a positive gain.

@item frequency, f
Set the filter's central frequency and so can be used
to extend or reduce the frequency range to be boosted or cut.
The default value is @code{100} Hz.

@item width_type, t
Set method to specify band-width of filter.
@table @option
@item h
Hz
@item q
Q-Factor
@item o
octave
@item s
slope
@item k
kHz
@end table

@item width, w
Determine how steep is the filter's shelf transition.

@item channels, c
Specify which channels to filter, by default all available are filtered.
@end table

@subsection Commands

This filter supports the following commands:
@table @option
@item frequency, f
Change bass frequency.
Syntax for the command is : "@var{frequency}"

@item width_type, t
Change bass width_type.
Syntax for the command is : "@var{width_type}"

@item width, w
Change bass width.
Syntax for the command is : "@var{width}"

@item gain, g
Change bass gain.
Syntax for the command is : "@var{gain}"
@end table

@section biquad

Apply a biquad IIR filter with the given coefficients.
Where @var{b0}, @var{b1}, @var{b2} and @var{a0}, @var{a1}, @var{a2}
are the numerator and denominator coefficients respectively.
and @var{channels}, @var{c} specify which channels to filter, by default all
available are filtered.

@subsection Commands

This filter supports the following commands:
@table @option
@item a0
@item a1
@item a2
@item b0
@item b1
@item b2
Change biquad parameter.
Syntax for the command is : "@var{value}"
@end table

@section bs2b
Bauer stereo to binaural transformation, which improves headphone listening of
stereo audio records.

To enable compilation of this filter you need to configure FFmpeg with
@code{--enable-libbs2b}.

It accepts the following parameters:
@table @option

@item profile
Pre-defined crossfeed level.
@table @option

@item default
Default level (fcut=700, feed=50).

@item cmoy
Chu Moy circuit (fcut=700, feed=60).

@item jmeier
Jan Meier circuit (fcut=650, feed=95).

@end table

@item fcut
Cut frequency (in Hz).

@item feed
Feed level (in Hz).

@end table

@section channelmap

Remap input channels to new locations.

It accepts the following parameters:
@table @option
@item map
Map channels from input to output. The argument is a '|'-separated list of
mappings, each in the @code{@var{in_channel}-@var{out_channel}} or
@var{in_channel} form. @var{in_channel} can be either the name of the input
channel (e.g. FL for front left) or its index in the input channel layout.
@var{out_channel} is the name of the output channel or its index in the output
channel layout. If @var{out_channel} is not given then it is implicitly an
index, starting with zero and increasing by one for each mapping.

@item channel_layout
The channel layout of the output stream.
@end table

If no mapping is present, the filter will implicitly map input channels to
output channels, preserving indices.

@subsection Examples

@itemize
@item
For example, assuming a 5.1+downmix input MOV file,
@example
ffmpeg -i in.mov -filter 'channelmap=map=DL-FL|DR-FR' out.wav
@end example
will create an output WAV file tagged as stereo from the downmix channels of
the input.

@item
To fix a 5.1 WAV improperly encoded in AAC's native channel order
@example
ffmpeg -i in.wav -filter 'channelmap=1|2|0|5|3|4:5.1' out.wav
@end example
@end itemize

@section channelsplit

Split each channel from an input audio stream into a separate output stream.

It accepts the following parameters:
@table @option
@item channel_layout
The channel layout of the input stream. The default is "stereo".
@item channels
A channel layout describing the channels to be extracted as separate output streams
or "all" to extract each input channel as a separate stream. The default is "all".

Choosing channels not present in channel layout in the input will result in an error.
@end table

@subsection Examples

@itemize
@item
For example, assuming a stereo input MP3 file,
@example
ffmpeg -i in.mp3 -filter_complex channelsplit out.mkv
@end example
will create an output Matroska file with two audio streams, one containing only
the left channel and the other the right channel.

@item
Split a 5.1 WAV file into per-channel files:
@example
ffmpeg -i in.wav -filter_complex
'channelsplit=channel_layout=5.1[FL][FR][FC][LFE][SL][SR]'
-map '[FL]' front_left.wav -map '[FR]' front_right.wav -map '[FC]'
front_center.wav -map '[LFE]' lfe.wav -map '[SL]' side_left.wav -map '[SR]'
side_right.wav
@end example

@item
Extract only LFE from a 5.1 WAV file:
@example
ffmpeg -i in.wav -filter_complex 'channelsplit=channel_layout=5.1:channels=LFE[LFE]'
-map '[LFE]' lfe.wav
@end example
@end itemize

@section chorus
Add a chorus effect to the audio.

Can make a single vocal sound like a chorus, but can also be applied to instrumentation.

Chorus resembles an echo effect with a short delay, but whereas with echo the delay is
constant, with chorus, it is varied using using sinusoidal or triangular modulation.
The modulation depth defines the range the modulated delay is played before or after
the delay. Hence the delayed sound will sound slower or faster, that is the delayed
sound tuned around the original one, like in a chorus where some vocals are slightly
off key.

It accepts the following parameters:
@table @option
@item in_gain
Set input gain. Default is 0.4.

@item out_gain
Set output gain. Default is 0.4.

@item delays
Set delays. A typical delay is around 40ms to 60ms.

@item decays
Set decays.

@item speeds
Set speeds.

@item depths
Set depths.
@end table

@subsection Examples

@itemize
@item
A single delay:
@example
chorus=0.7:0.9:55:0.4:0.25:2
@end example

@item
Two delays:
@example
chorus=0.6:0.9:50|60:0.4|0.32:0.25|0.4:2|1.3
@end example

@item
Fuller sounding chorus with three delays:
@example
chorus=0.5:0.9:50|60|40:0.4|0.32|0.3:0.25|0.4|0.3:2|2.3|1.3
@end example
@end itemize

@section compand
Compress or expand the audio's dynamic range.

It accepts the following parameters:

@table @option

@item attacks
@item decays
A list of times in seconds for each channel over which the instantaneous level
of the input signal is averaged to determine its volume. @var{attacks} refers to
increase of volume and @var{decays} refers to decrease of volume. For most
situations, the attack time (response to the audio getting louder) should be
shorter than the decay time, because the human ear is more sensitive to sudden
loud audio than sudden soft audio. A typical value for attack is 0.3 seconds and
a typical value for decay is 0.8 seconds.
If specified number of attacks & decays is lower than number of channels, the last
set attack/decay will be used for all remaining channels.

@item points
A list of points for the transfer function, specified in dB relative to the
maximum possible signal amplitude. Each key points list must be defined using
the following syntax: @code{x0/y0|x1/y1|x2/y2|....} or
@code{x0/y0 x1/y1 x2/y2 ....}

The input values must be in strictly increasing order but the transfer function
does not have to be monotonically rising. The point @code{0/0} is assumed but
may be overridden (by @code{0/out-dBn}). Typical values for the transfer
function are @code{-70/-70|-60/-20|1/0}.

@item soft-knee
Set the curve radius in dB for all joints. It defaults to 0.01.

@item gain
Set the additional gain in dB to be applied at all points on the transfer
function. This allows for easy adjustment of the overall gain.
It defaults to 0.

@item volume
Set an initial volume, in dB, to be assumed for each channel when filtering
starts. This permits the user to supply a nominal level initially, so that, for
example, a very large gain is not applied to initial signal levels before the
companding has begun to operate. A typical value for audio which is initially
quiet is -90 dB. It defaults to 0.

@item delay
Set a delay, in seconds. The input audio is analyzed immediately, but audio is
delayed before being fed to the volume adjuster. Specifying a delay
approximately equal to the attack/decay times allows the filter to effectively
operate in predictive rather than reactive mode. It defaults to 0.

@end table

@subsection Examples

@itemize
@item
Make music with both quiet and loud passages suitable for listening to in a
noisy environment:
@example
compand=.3|.3:1|1:-90/-60|-60/-40|-40/-30|-20/-20:6:0:-90:0.2
@end example

Another example for audio with whisper and explosion parts:
@example
compand=0|0:1|1:-90/-900|-70/-70|-30/-9|0/-3:6:0:0:0
@end example

@item
A noise gate for when the noise is at a lower level than the signal:
@example
compand=.1|.1:.2|.2:-900/-900|-50.1/-900|-50/-50:.01:0:-90:.1
@end example

@item
Here is another noise gate, this time for when the noise is at a higher level
than the signal (making it, in some ways, similar to squelch):
@example
compand=.1|.1:.1|.1:-45.1/-45.1|-45/-900|0/-900:.01:45:-90:.1
@end example

@item
2:1 compression starting at -6dB:
@example
compand=points=-80/-80|-6/-6|0/-3.8|20/3.5
@end example

@item
2:1 compression starting at -9dB:
@example
compand=points=-80/-80|-9/-9|0/-5.3|20/2.9
@end example

@item
2:1 compression starting at -12dB:
@example
compand=points=-80/-80|-12/-12|0/-6.8|20/1.9
@end example

@item
2:1 compression starting at -18dB:
@example
compand=points=-80/-80|-18/-18|0/-9.8|20/0.7
@end example

@item
3:1 compression starting at -15dB:
@example
compand=points=-80/-80|-15/-15|0/-10.8|20/-5.2
@end example

@item
Compressor/Gate:
@example
compand=points=-80/-105|-62/-80|-15.4/-15.4|0/-12|20/-7.6
@end example

@item
Expander:
@example
compand=attacks=0:points=-80/-169|-54/-80|-49.5/-64.6|-41.1/-41.1|-25.8/-15|-10.8/-4.5|0/0|20/8.3
@end example

@item
Hard limiter at -6dB:
@example
compand=attacks=0:points=-80/-80|-6/-6|20/-6
@end example

@item
Hard limiter at -12dB:
@example
compand=attacks=0:points=-80/-80|-12/-12|20/-12
@end example

@item
Hard noise gate at -35 dB:
@example
compand=attacks=0:points=-80/-115|-35.1/-80|-35/-35|20/20
@end example

@item
Soft limiter:
@example
compand=attacks=0:points=-80/-80|-12.4/-12.4|-6/-8|0/-6.8|20/-2.8
@end example
@end itemize

@section compensationdelay

Compensation Delay Line is a metric based delay to compensate differing
positions of microphones or speakers.

For example, you have recorded guitar with two microphones placed in
different location. Because the front of sound wave has fixed speed in
normal conditions, the phasing of microphones can vary and depends on
their location and interposition. The best sound mix can be achieved when
these microphones are in phase (synchronized). Note that distance of
~30 cm between microphones makes one microphone to capture signal in
antiphase to another microphone. That makes the final mix sounding moody.
This filter helps to solve phasing problems by adding different delays
to each microphone track and make them synchronized.

The best result can be reached when you take one track as base and
synchronize other tracks one by one with it.
Remember that synchronization/delay tolerance depends on sample rate, too.
Higher sample rates will give more tolerance.

It accepts the following parameters:

@table @option
@item mm
Set millimeters distance. This is compensation distance for fine tuning.
Default is 0.

@item cm
Set cm distance. This is compensation distance for tightening distance setup.
Default is 0.

@item m
Set meters distance. This is compensation distance for hard distance setup.
Default is 0.

@item dry
Set dry amount. Amount of unprocessed (dry) signal.
Default is 0.

@item wet
Set wet amount. Amount of processed (wet) signal.
Default is 1.

@item temp
Set temperature degree in Celsius. This is the temperature of the environment.
Default is 20.
@end table

@section crossfeed
Apply headphone crossfeed filter.

Crossfeed is the process of blending the left and right channels of stereo
audio recording.
It is mainly used to reduce extreme stereo separation of low frequencies.

The intent is to produce more speaker like sound to the listener.

The filter accepts the following options:

@table @option
@item strength
Set strength of crossfeed. Default is 0.2. Allowed range is from 0 to 1.
This sets gain of low shelf filter for side part of stereo image.
Default is -6dB. Max allowed is -30db when strength is set to 1.

@item range
Set soundstage wideness. Default is 0.5. Allowed range is from 0 to 1.
This sets cut off frequency of low shelf filter. Default is cut off near
1550 Hz. With range set to 1 cut off frequency is set to 2100 Hz.

@item level_in
Set input gain. Default is 0.9.

@item level_out
Set output gain. Default is 1.
@end table

@section crystalizer
Simple algorithm to expand audio dynamic range.

The filter accepts the following options:

@table @option
@item i
Sets the intensity of effect (default: 2.0). Must be in range between 0.0
(unchanged sound) to 10.0 (maximum effect).

@item c
Enable clipping. By default is enabled.
@end table

@section dcshift
Apply a DC shift to the audio.

This can be useful to remove a DC offset (caused perhaps by a hardware problem
in the recording chain) from the audio. The effect of a DC offset is reduced
headroom and hence volume. The @ref{astats} filter can be used to determine if
a signal has a DC offset.

@table @option
@item shift
Set the DC shift, allowed range is [-1, 1]. It indicates the amount to shift
the audio.

@item limitergain
Optional. It should have a value much less than 1 (e.g. 0.05 or 0.02) and is
used to prevent clipping.
@end table

@section drmeter
Measure audio dynamic range.

DR values of 14 and higher is found in very dynamic material. DR of 8 to 13
is found in transition material. And anything less that 8 have very poor dynamics
and is very compressed.

The filter accepts the following options:

@table @option
@item length
Set window length in seconds used to split audio into segments of equal length.
Default is 3 seconds.
@end table

@section dynaudnorm
Dynamic Audio Normalizer.

This filter applies a certain amount of gain to the input audio in order
to bring its peak magnitude to a target level (e.g. 0 dBFS). However, in
contrast to more "simple" normalization algorithms, the Dynamic Audio
Normalizer *dynamically* re-adjusts the gain factor to the input audio.
This allows for applying extra gain to the "quiet" sections of the audio
while avoiding distortions or clipping the "loud" sections. In other words:
The Dynamic Audio Normalizer will "even out" the volume of quiet and loud
sections, in the sense that the volume of each section is brought to the
same target level. Note, however, that the Dynamic Audio Normalizer achieves
this goal *without* applying "dynamic range compressing". It will retain 100%
of the dynamic range *within* each section of the audio file.

@table @option
@item f
Set the frame length in milliseconds. In range from 10 to 8000 milliseconds.
Default is 500 milliseconds.
The Dynamic Audio Normalizer processes the input audio in small chunks,
referred to as frames. This is required, because a peak magnitude has no
meaning for just a single sample value. Instead, we need to determine the
peak magnitude for a contiguous sequence of sample values. While a "standard"
normalizer would simply use the peak magnitude of the complete file, the
Dynamic Audio Normalizer determines the peak magnitude individually for each
frame. The length of a frame is specified in milliseconds. By default, the
Dynamic Audio Normalizer uses a frame length of 500 milliseconds, which has
been found to give good results with most files.
Note that the exact frame length, in number of samples, will be determined
automatically, based on the sampling rate of the individual input audio file.

@item g
Set the Gaussian filter window size. In range from 3 to 301, must be odd
number. Default is 31.
Probably the most important parameter of the Dynamic Audio Normalizer is the
@code{window size} of the Gaussian smoothing filter. The filter's window size
is specified in frames, centered around the current frame. For the sake of
simplicity, this must be an odd number. Consequently, the default value of 31
takes into account the current frame, as well as the 15 preceding frames and
the 15 subsequent frames. Using a larger window results in a stronger
smoothing effect and thus in less gain variation, i.e. slower gain
adaptation. Conversely, using a smaller window results in a weaker smoothing
effect and thus in more gain variation, i.e. faster gain adaptation.
In other words, the more you increase this value, the more the Dynamic Audio
Normalizer will behave like a "traditional" normalization filter. On the
contrary, the more you decrease this value, the more the Dynamic Audio
Normalizer will behave like a dynamic range compressor.

@item p
Set the target peak value. This specifies the highest permissible magnitude
level for the normalized audio input. This filter will try to approach the
target peak magnitude as closely as possible, but at the same time it also
makes sure that the normalized signal will never exceed the peak magnitude.
A frame's maximum local gain factor is imposed directly by the target peak
magnitude. The default value is 0.95 and thus leaves a headroom of 5%*.
It is not recommended to go above this value.

@item m
Set the maximum gain factor. In range from 1.0 to 100.0. Default is 10.0.
The Dynamic Audio Normalizer determines the maximum possible (local) gain
factor for each input frame, i.e. the maximum gain factor that does not
result in clipping or distortion. The maximum gain factor is determined by
the frame's highest magnitude sample. However, the Dynamic Audio Normalizer
additionally bounds the frame's maximum gain factor by a predetermined
(global) maximum gain factor. This is done in order to avoid excessive gain
factors in "silent" or almost silent frames. By default, the maximum gain
factor is 10.0, For most inputs the default value should be sufficient and
it usually is not recommended to increase this value. Though, for input
with an extremely low overall volume level, it may be necessary to allow even
higher gain factors. Note, however, that the Dynamic Audio Normalizer does
not simply apply a "hard" threshold (i.e. cut off values above the threshold).
Instead, a "sigmoid" threshold function will be applied. This way, the
gain factors will smoothly approach the threshold value, but never exceed that
value.

@item r
Set the target RMS. In range from 0.0 to 1.0. Default is 0.0 - disabled.
By default, the Dynamic Audio Normalizer performs "peak" normalization.
This means that the maximum local gain factor for each frame is defined
(only) by the frame's highest magnitude sample. This way, the samples can
be amplified as much as possible without exceeding the maximum signal
level, i.e. without clipping. Optionally, however, the Dynamic Audio
Normalizer can also take into account the frame's root mean square,
abbreviated RMS. In electrical engineering, the RMS is commonly used to
determine the power of a time-varying signal. It is therefore considered
that the RMS is a better approximation of the "perceived loudness" than
just looking at the signal's peak magnitude. Consequently, by adjusting all
frames to a constant RMS value, a uniform "perceived loudness" can be
established. If a target RMS value has been specified, a frame's local gain
factor is defined as the factor that would result in exactly that RMS value.
Note, however, that the maximum local gain factor is still restricted by the
frame's highest magnitude sample, in order to prevent clipping.

@item n
Enable channels coupling. By default is enabled.
By default, the Dynamic Audio Normalizer will amplify all channels by the same
amount. This means the same gain factor will be applied to all channels, i.e.
the maximum possible gain factor is determined by the "loudest" channel.
However, in some recordings, it may happen that the volume of the different
channels is uneven, e.g. one channel may be "quieter" than the other one(s).
In this case, this option can be used to disable the channel coupling. This way,
the gain factor will be determined independently for each channel, depending
only on the individual channel's highest magnitude sample. This allows for
harmonizing the volume of the different channels.

@item c
Enable DC bias correction. By default is disabled.
An audio signal (in the time domain) is a sequence of sample values.
In the Dynamic Audio Normalizer these sample values are represented in the
-1.0 to 1.0 range, regardless of the original input format. Normally, the
audio signal, or "waveform", should be centered around the zero point.
That means if we calculate the mean value of all samples in a file, or in a
single frame, then the result should be 0.0 or at least very close to that
value. If, however, there is a significant deviation of the mean value from
0.0, in either positive or negative direction, this is referred to as a
DC bias or DC offset. Since a DC bias is clearly undesirable, the Dynamic
Audio Normalizer provides optional DC bias correction.
With DC bias correction enabled, the Dynamic Audio Normalizer will determine
the mean value, or "DC correction" offset, of each input frame and subtract
that value from all of the frame's sample values which ensures those samples
are centered around 0.0 again. Also, in order to avoid "gaps" at the frame
boundaries, the DC correction offset values will be interpolated smoothly
between neighbouring frames.

@item b
Enable alternative boundary mode. By default is disabled.
The Dynamic Audio Normalizer takes into account a certain neighbourhood
around each frame. This includes the preceding frames as well as the
subsequent frames. However, for the "boundary" frames, located at the very
beginning and at the very end of the audio file, not all neighbouring
frames are available. In particular, for the first few frames in the audio
file, the preceding frames are not known. And, similarly, for the last few
frames in the audio file, the subsequent frames are not known. Thus, the
question arises which gain factors should be assumed for the missing frames
in the "boundary" region. The Dynamic Audio Normalizer implements two modes
to deal with this situation. The default boundary mode assumes a gain factor
of exactly 1.0 for the missing frames, resulting in a smooth "fade in" and
"fade out" at the beginning and at the end of the input, respectively.

@item s
Set the compress factor. In range from 0.0 to 30.0. Default is 0.0.
By default, the Dynamic Audio Normalizer does not apply "traditional"
compression. This means that signal peaks will not be pruned and thus the
full dynamic range will be retained within each local neighbourhood. However,
in some cases it may be desirable to combine the Dynamic Audio Normalizer's
normalization algorithm with a more "traditional" compression.
For this purpose, the Dynamic Audio Normalizer provides an optional compression
(thresholding) function. If (and only if) the compression feature is enabled,
all input frames will be processed by a soft knee thresholding function prior
to the actual normalization process. Put simply, the thresholding function is
going to prune all samples whose magnitude exceeds a certain threshold value.
However, the Dynamic Audio Normalizer does not simply apply a fixed threshold
value. Instead, the threshold value will be adjusted for each individual
frame.
In general, smaller parameters result in stronger compression, and vice versa.
Values below 3.0 are not recommended, because audible distortion may appear.
@end table

@section earwax

Make audio easier to listen to on headphones.

This filter adds `cues' to 44.1kHz stereo (i.e. audio CD format) audio
so that when listened to on headphones the stereo image is moved from
inside your head (standard for headphones) to outside and in front of
the listener (standard for speakers).

Ported from SoX.

@section equalizer

Apply a two-pole peaking equalisation (EQ) filter. With this
filter, the signal-level at and around a selected frequency can
be increased or decreased, whilst (unlike bandpass and bandreject
filters) that at all other frequencies is unchanged.

In order to produce complex equalisation curves, this filter can
be given several times, each with a different central frequency.

The filter accepts the following options:

@table @option
@item frequency, f
Set the filter's central frequency in Hz.

@item width_type, t
Set method to specify band-width of filter.
@table @option
@item h
Hz
@item q
Q-Factor
@item o
octave
@item s
slope
@item k
kHz
@end table

@item width, w
Specify the band-width of a filter in width_type units.

@item gain, g
Set the required gain or attenuation in dB.
Beware of clipping when using a positive gain.

@item channels, c
Specify which channels to filter, by default all available are filtered.
@end table

@subsection Examples
@itemize
@item
Attenuate 10 dB at 1000 Hz, with a bandwidth of 200 Hz:
@example
equalizer=f=1000:t=h:width=200:g=-10
@end example

@item
Apply 2 dB gain at 1000 Hz with Q 1 and attenuate 5 dB at 100 Hz with Q 2:
@example
equalizer=f=1000:t=q:w=1:g=2,equalizer=f=100:t=q:w=2:g=-5
@end example
@end itemize

@subsection Commands

This filter supports the following commands:
@table @option
@item frequency, f
Change equalizer frequency.
Syntax for the command is : "@var{frequency}"

@item width_type, t
Change equalizer width_type.
Syntax for the command is : "@var{width_type}"

@item width, w
Change equalizer width.
Syntax for the command is : "@var{width}"

@item gain, g
Change equalizer gain.
Syntax for the command is : "@var{gain}"
@end table

@section extrastereo

Linearly increases the difference between left and right channels which
adds some sort of "live" effect to playback.

The filter accepts the following options:

@table @option
@item m
Sets the difference coefficient (default: 2.5). 0.0 means mono sound
(average of both channels), with 1.0 sound will be unchanged, with
-1.0 left and right channels will be swapped.

@item c
Enable clipping. By default is enabled.
@end table

@section firequalizer
Apply FIR Equalization using arbitrary frequency response.

The filter accepts the following option:

@table @option
@item gain
Set gain curve equation (in dB). The expression can contain variables:
@table @option
@item f
the evaluated frequency
@item sr
sample rate
@item ch
channel number, set to 0 when multichannels evaluation is disabled
@item chid
channel id, see libavutil/channel_layout.h, set to the first channel id when
multichannels evaluation is disabled
@item chs
number of channels
@item chlayout
channel_layout, see libavutil/channel_layout.h

@end table
and functions:
@table @option
@item gain_interpolate(f)
interpolate gain on frequency f based on gain_entry
@item cubic_interpolate(f)
same as gain_interpolate, but smoother
@end table
This option is also available as command. Default is @code{gain_interpolate(f)}.

@item gain_entry
Set gain entry for gain_interpolate function. The expression can
contain functions:
@table @option
@item entry(f, g)
store gain entry at frequency f with value g
@end table
This option is also available as command.

@item delay
Set filter delay in seconds. Higher value means more accurate.
Default is @code{0.01}.

@item accuracy
Set filter accuracy in Hz. Lower value means more accurate.
Default is @code{5}.

@item wfunc
Set window function. Acceptable values are:
@table @option
@item rectangular
rectangular window, useful when gain curve is already smooth
@item hann
hann window (default)
@item hamming
hamming window
@item blackman
blackman window
@item nuttall3
3-terms continuous 1st derivative nuttall window
@item mnuttall3
minimum 3-terms discontinuous nuttall window
@item nuttall
4-terms continuous 1st derivative nuttall window
@item bnuttall
minimum 4-terms discontinuous nuttall (blackman-nuttall) window
@item bharris
blackman-harris window
@item tukey
tukey window
@end table

@item fixed
If enabled, use fixed number of audio samples. This improves speed when
filtering with large delay. Default is disabled.

@item multi
Enable multichannels evaluation on gain. Default is disabled.

@item zero_phase
Enable zero phase mode by subtracting timestamp to compensate delay.
Default is disabled.

@item scale
Set scale used by gain. Acceptable values are:
@table @option
@item linlin
linear frequency, linear gain
@item linlog
linear frequency, logarithmic (in dB) gain (default)
@item loglin
logarithmic (in octave scale where 20 Hz is 0) frequency, linear gain
@item loglog
logarithmic frequency, logarithmic gain
@end table

@item dumpfile
Set file for dumping, suitable for gnuplot.

@item dumpscale
Set scale for dumpfile. Acceptable values are same with scale option.
Default is linlog.

@item fft2
Enable 2-channel convolution using complex FFT. This improves speed significantly.
Default is disabled.

@item min_phase
Enable minimum phase impulse response. Default is disabled.
@end table

@subsection Examples
@itemize
@item
lowpass at 1000 Hz:
@example
firequalizer=gain='if(lt(f,1000), 0, -INF)'
@end example
@item
lowpass at 1000 Hz with gain_entry:
@example
firequalizer=gain_entry='entry(1000,0); entry(1001, -INF)'
@end example
@item
custom equalization:
@example
firequalizer=gain_entry='entry(100,0); entry(400, -4); entry(1000, -6); entry(2000, 0)'
@end example
@item
higher delay with zero phase to compensate delay:
@example
firequalizer=delay=0.1:fixed=on:zero_phase=on
@end example
@item
lowpass on left channel, highpass on right channel:
@example
firequalizer=gain='if(eq(chid,1), gain_interpolate(f), if(eq(chid,2), gain_interpolate(1e6+f), 0))'
:gain_entry='entry(1000, 0); entry(1001,-INF); entry(1e6+1000,0)':multi=on
@end example
@end itemize

@section flanger
Apply a flanging effect to the audio.

The filter accepts the following options:

@table @option
@item delay
Set base delay in milliseconds. Range from 0 to 30. Default value is 0.

@item depth
Set added sweep delay in milliseconds. Range from 0 to 10. Default value is 2.

@item regen
Set percentage regeneration (delayed signal feedback). Range from -95 to 95.
Default value is 0.

@item width
Set percentage of delayed signal mixed with original. Range from 0 to 100.
Default value is 71.

@item speed
Set sweeps per second (Hz). Range from 0.1 to 10. Default value is 0.5.

@item shape
Set swept wave shape, can be @var{triangular} or @var{sinusoidal}.
Default value is @var{sinusoidal}.

@item phase
Set swept wave percentage-shift for multi channel. Range from 0 to 100.
Default value is 25.

@item interp
Set delay-line interpolation, @var{linear} or @var{quadratic}.
Default is @var{linear}.
@end table

@section haas
Apply Haas effect to audio.

Note that this makes most sense to apply on mono signals.
With this filter applied to mono signals it give some directionality and
stretches its stereo image.

The filter accepts the following options:

@table @option
@item level_in
Set input level. By default is @var{1}, or 0dB

@item level_out
Set output level. By default is @var{1}, or 0dB.

@item side_gain
Set gain applied to side part of signal. By default is @var{1}.

@item middle_source
Set kind of middle source. Can be one of the following:

@table @samp
@item left
Pick left channel.

@item right
Pick right channel.

@item mid
Pick middle part signal of stereo image.

@item side
Pick side part signal of stereo image.
@end table

@item middle_phase
Change middle phase. By default is disabled.

@item left_delay
Set left channel delay. By default is @var{2.05} milliseconds.

@item left_balance
Set left channel balance. By default is @var{-1}.

@item left_gain
Set left channel gain. By default is @var{1}.

@item left_phase
Change left phase. By default is disabled.

@item right_delay
Set right channel delay. By defaults is @var{2.12} milliseconds.

@item right_balance
Set right channel balance. By default is @var{1}.

@item right_gain
Set right channel gain. By default is @var{1}.

@item right_phase
Change right phase. By default is enabled.
@end table

@section hdcd

Decodes High Definition Compatible Digital (HDCD) data. A 16-bit PCM stream with
embedded HDCD codes is expanded into a 20-bit PCM stream.

The filter supports the Peak Extend and Low-level Gain Adjustment features
of HDCD, and detects the Transient Filter flag.

@example
ffmpeg -i HDCD16.flac -af hdcd OUT24.flac
@end example

When using the filter with wav, note the default encoding for wav is 16-bit,
so the resulting 20-bit stream will be truncated back to 16-bit. Use something
like @command{-acodec pcm_s24le} after the filter to get 24-bit PCM output.
@example
ffmpeg -i HDCD16.wav -af hdcd OUT16.wav
ffmpeg -i HDCD16.wav -af hdcd -c:a pcm_s24le OUT24.wav
@end example

The filter accepts the following options:

@table @option
@item disable_autoconvert
Disable any automatic format conversion or resampling in the filter graph.

@item process_stereo
Process the stereo channels together. If target_gain does not match between
channels, consider it invalid and use the last valid target_gain.

@item cdt_ms
Set the code detect timer period in ms.

@item force_pe
Always extend peaks above -3dBFS even if PE isn't signaled.

@item analyze_mode
Replace audio with a solid tone and adjust the amplitude to signal some
specific aspect of the decoding process. The output file can be loaded in
an audio editor alongside the original to aid analysis.

@code{analyze_mode=pe:force_pe=true} can be used to see all samples above the PE level.

Modes are:
@table @samp
@item 0, off
Disabled
@item 1, lle
Gain adjustment level at each sample
@item 2, pe
Samples where peak extend occurs
@item 3, cdt
Samples where the code detect timer is active
@item 4, tgm
Samples where the target gain does not match between channels
@end table
@end table

@section headphone

Apply head-related transfer functions (HRTFs) to create virtual
loudspeakers around the user for binaural listening via headphones.
The HRIRs are provided via additional streams, for each channel
one stereo input stream is needed.

The filter accepts the following options:

@table @option
@item map
Set mapping of input streams for convolution.
The argument is a '|'-separated list of channel names in order as they
are given as additional stream inputs for filter.
This also specify number of input streams. Number of input streams
must be not less than number of channels in first stream plus one.

@item gain
Set gain applied to audio. Value is in dB. Default is 0.

@item type
Set processing type. Can be @var{time} or @var{freq}. @var{time} is
processing audio in time domain which is slow.
@var{freq} is processing audio in frequency domain which is fast.
Default is @var{freq}.

@item lfe
Set custom gain for LFE channels. Value is in dB. Default is 0.

@item size
Set size of frame in number of samples which will be processed at once.
Default value is @var{1024}. Allowed range is from 1024 to 96000.

@item hrir
Set format of hrir stream.
Default value is @var{stereo}. Alternative value is @var{multich}.
If value is set to @var{stereo}, number of additional streams should
be greater or equal to number of input channels in first input stream.
Also each additional stream should have stereo number of channels.
If value is set to @var{multich}, number of additional streams should
be exactly one. Also number of input channels of additional stream
should be equal or greater than twice number of channels of first input
stream.
@end table

@subsection Examples

@itemize
@item
Full example using wav files as coefficients with amovie filters for 7.1 downmix,
each amovie filter use stereo file with IR coefficients as input.
The files give coefficients for each position of virtual loudspeaker:
@example
ffmpeg -i input.wav -lavfi-complex "amovie=azi_270_ele_0_DFC.wav[sr],amovie=azi_90_ele_0_DFC.wav[sl],amovie=azi_225_ele_0_DFC.wav[br],amovie=azi_135_ele_0_DFC.wav[bl],amovie=azi_0_ele_0_DFC.wav,asplit[fc][lfe],amovie=azi_35_ele_0_DFC.wav[fl],amovie=azi_325_ele_0_DFC.wav[fr],[a:0][fl][fr][fc][lfe][bl][br][sl][sr]headphone=FL|FR|FC|LFE|BL|BR|SL|SR"
output.wav
@end example

@item
Full example using wav files as coefficients with amovie filters for 7.1 downmix,
but now in @var{multich} @var{hrir} format.
@example
ffmpeg -i input.wav -lavfi-complex "amovie=minp.wav[hrirs],[a:0][hrirs]headphone=map=FL|FR|FC|LFE|BL|BR|SL|SR:hrir=multich"
output.wav
@end example
@end itemize

@section highpass

Apply a high-pass filter with 3dB point frequency.
The filter can be either single-pole, or double-pole (the default).
The filter roll off at 6dB per pole per octave (20dB per pole per decade).

The filter accepts the following options:

@table @option
@item frequency, f
Set frequency in Hz. Default is 3000.

@item poles, p
Set number of poles. Default is 2.

@item width_type, t
Set method to specify band-width of filter.
@table @option
@item h
Hz
@item q
Q-Factor
@item o
octave
@item s
slope
@item k
kHz
@end table

@item width, w
Specify the band-width of a filter in width_type units.
Applies only to double-pole filter.
The default is 0.707q and gives a Butterworth response.

@item channels, c
Specify which channels to filter, by default all available are filtered.
@end table

@subsection Commands

This filter supports the following commands:
@table @option
@item frequency, f
Change highpass frequency.
Syntax for the command is : "@var{frequency}"

@item width_type, t
Change highpass width_type.
Syntax for the command is : "@var{width_type}"

@item width, w
Change highpass width.
Syntax for the command is : "@var{width}"
@end table

@section join

Join multiple input streams into one multi-channel stream.

It accepts the following parameters:
@table @option

@item inputs
The number of input streams. It defaults to 2.

@item channel_layout
The desired output channel layout. It defaults to stereo.

@item map
Map channels from inputs to output. The argument is a '|'-separated list of
mappings, each in the @code{@var{input_idx}.@var{in_channel}-@var{out_channel}}
form. @var{input_idx} is the 0-based index of the input stream. @var{in_channel}
can be either the name of the input channel (e.g. FL for front left) or its
index in the specified input stream. @var{out_channel} is the name of the output
channel.
@end table

The filter will attempt to guess the mappings when they are not specified
explicitly. It does so by first trying to find an unused matching input channel
and if that fails it picks the first unused input channel.

Join 3 inputs (with properly set channel layouts):
@example
ffmpeg -i INPUT1 -i INPUT2 -i INPUT3 -filter_complex join=inputs=3 OUTPUT
@end example

Build a 5.1 output from 6 single-channel streams:
@example
ffmpeg -i fl -i fr -i fc -i sl -i sr -i lfe -filter_complex
'join=inputs=6:channel_layout=5.1:map=0.0-FL|1.0-FR|2.0-FC|3.0-SL|4.0-SR|5.0-LFE'
out
@end example

@section ladspa

Load a LADSPA (Linux Audio Developer's Simple Plugin API) plugin.

To enable compilation of this filter you need to configure FFmpeg with
@code{--enable-ladspa}.

@table @option
@item file, f
Specifies the name of LADSPA plugin library to load. If the environment
variable @env{LADSPA_PATH} is defined, the LADSPA plugin is searched in
each one of the directories specified by the colon separated list in
@env{LADSPA_PATH}, otherwise in the standard LADSPA paths, which are in
this order: @file{HOME/.ladspa/lib/}, @file{/usr/local/lib/ladspa/},
@file{/usr/lib/ladspa/}.

@item plugin, p
Specifies the plugin within the library. Some libraries contain only
one plugin, but others contain many of them. If this is not set filter
will list all available plugins within the specified library.

@item controls, c
Set the '|' separated list of controls which are zero or more floating point
values that determine the behavior of the loaded plugin (for example delay,
threshold or gain).
Controls need to be defined using the following syntax:
c0=@var{value0}|c1=@var{value1}|c2=@var{value2}|..., where
@var{valuei} is the value set on the @var{i}-th control.
Alternatively they can be also defined using the following syntax:
@var{value0}|@var{value1}|@var{value2}|..., where
@var{valuei} is the value set on the @var{i}-th control.
If @option{controls} is set to @code{help}, all available controls and
their valid ranges are printed.

@item sample_rate, s
Specify the sample rate, default to 44100. Only used if plugin have
zero inputs.

@item nb_samples, n
Set the number of samples per channel per each output frame, default
is 1024. Only used if plugin have zero inputs.

@item duration, d
Set the minimum duration of the sourced audio. See
@ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils}
for the accepted syntax.
Note that the resulting duration may be greater than the specified duration,
as the generated audio is always cut at the end of a complete frame.
If not specified, or the expressed duration is negative, the audio is
supposed to be generated forever.
Only used if plugin have zero inputs.

@end table

@subsection Examples

@itemize
@item
List all available plugins within amp (LADSPA example plugin) library:
@example
ladspa=file=amp
@end example

@item
List all available controls and their valid ranges for @code{vcf_notch}
plugin from @code{VCF} library:
@example
ladspa=f=vcf:p=vcf_notch:c=help
@end example

@item
Simulate low quality audio equipment using @code{Computer Music Toolkit} (CMT)
plugin library:
@example
ladspa=file=cmt:plugin=lofi:controls=c0=22|c1=12|c2=12
@end example

@item
Add reverberation to the audio using TAP-plugins
(Tom's Audio Processing plugins):
@example
ladspa=file=tap_reverb:tap_reverb
@end example

@item
Generate white noise, with 0.2 amplitude:
@example
ladspa=file=cmt:noise_source_white:c=c0=.2
@end example

@item
Generate 20 bpm clicks using plugin @code{C* Click - Metronome} from the
@code{C* Audio Plugin Suite} (CAPS) library:
@example
ladspa=file=caps:Click:c=c1=20'
@end example

@item
Apply @code{C* Eq10X2 - Stereo 10-band equaliser} effect:
@example
ladspa=caps:Eq10X2:c=c0=-48|c9=-24|c3=12|c4=2
@end example

@item
Increase volume by 20dB using fast lookahead limiter from Steve Harris
@code{SWH Plugins} collection:
@example
ladspa=fast_lookahead_limiter_1913:fastLookaheadLimiter:20|0|2
@end example

@item
Attenuate low frequencies using Multiband EQ from Steve Harris
@code{SWH Plugins} collection:
@example
ladspa=mbeq_1197:mbeq:-24|-24|-24|0|0|0|0|0|0|0|0|0|0|0|0
@end example

@item
Reduce stereo image using @code{Narrower} from the @code{C* Audio Plugin Suite}
(CAPS) library:
@example
ladspa=caps:Narrower
@end example

@item
Another white noise, now using @code{C* Audio Plugin Suite} (CAPS) library:
@example
ladspa=caps:White:.2
@end example

@item
Some fractal noise, using @code{C* Audio Plugin Suite} (CAPS) library:
@example
ladspa=caps:Fractal:c=c1=1
@end example

@item
Dynamic volume normalization using @code{VLevel} plugin:
@example
ladspa=vlevel-ladspa:vlevel_mono
@end example
@end itemize

@subsection Commands

This filter supports the following commands:
@table @option
@item cN
Modify the @var{N}-th control value.

If the specified value is not valid, it is ignored and prior one is kept.
@end table

@section loudnorm

EBU R128 loudness normalization. Includes both dynamic and linear normalization modes.
Support for both single pass (livestreams, files) and double pass (files) modes.
This algorithm can target IL, LRA, and maximum true peak. To accurately detect true peaks,
the audio stream will be upsampled to 192 kHz unless the normalization mode is linear.
Use the @code{-ar} option or @code{aresample} filter to explicitly set an output sample rate.

The filter accepts the following options:

@table @option
@item I, i
Set integrated loudness target.
Range is -70.0 - -5.0. Default value is -24.0.

@item LRA, lra
Set loudness range target.
Range is 1.0 - 20.0. Default value is 7.0.

@item TP, tp
Set maximum true peak.
Range is -9.0 - +0.0. Default value is -2.0.

@item measured_I, measured_i
Measured IL of input file.
Range is -99.0 - +0.0.

@item measured_LRA, measured_lra
Measured LRA of input file.
Range is  0.0 - 99.0.

@item measured_TP, measured_tp
Measured true peak of input file.
Range is  -99.0 - +99.0.

@item measured_thresh
Measured threshold of input file.
Range is -99.0 - +0.0.

@item offset
Set offset gain. Gain is applied before the true-peak limiter.
Range is  -99.0 - +99.0. Default is +0.0.

@item linear
Normalize linearly if possible.
measured_I, measured_LRA, measured_TP, and measured_thresh must also
to be specified in order to use this mode.
Options are true or false. Default is true.

@item dual_mono
Treat mono input files as "dual-mono". If a mono file is intended for playback
on a stereo system, its EBU R128 measurement will be perceptually incorrect.
If set to @code{true}, this option will compensate for this effect.
Multi-channel input files are not affected by this option.
Options are true or false. Default is false.

@item print_format
Set print format for stats. Options are summary, json, or none.
Default value is none.
@end table

@section lowpass

Apply a low-pass filter with 3dB point frequency.
The filter can be either single-pole or double-pole (the default).
The filter roll off at 6dB per pole per octave (20dB per pole per decade).

The filter accepts the following options:

@table @option
@item frequency, f
Set frequency in Hz. Default is 500.

@item poles, p
Set number of poles. Default is 2.

@item width_type, t
Set method to specify band-width of filter.
@table @option
@item h
Hz
@item q
Q-Factor
@item o
octave
@item s
slope
@item k
kHz
@end table

@item width, w
Specify the band-width of a filter in width_type units.
Applies only to double-pole filter.
The default is 0.707q and gives a Butterworth response.

@item channels, c
Specify which channels to filter, by default all available are filtered.
@end table

@subsection Examples
@itemize
@item
Lowpass only LFE channel, it LFE is not present it does nothing:
@example
lowpass=c=LFE
@end example
@end itemize

@subsection Commands

This filter supports the following commands:
@table @option
@item frequency, f
Change lowpass frequency.
Syntax for the command is : "@var{frequency}"

@item width_type, t
Change lowpass width_type.
Syntax for the command is : "@var{width_type}"

@item width, w
Change lowpass width.
Syntax for the command is : "@var{width}"
@end table

@section lv2

Load a LV2 (LADSPA Version 2) plugin.

To enable compilation of this filter you need to configure FFmpeg with
@code{--enable-lv2}.

@table @option
@item plugin, p
Specifies the plugin URI. You may need to escape ':'.

@item controls, c
Set the '|' separated list of controls which are zero or more floating point
values that determine the behavior of the loaded plugin (for example delay,
threshold or gain).
If @option{controls} is set to @code{help}, all available controls and
their valid ranges are printed.

@item sample_rate, s
Specify the sample rate, default to 44100. Only used if plugin have
zero inputs.

@item nb_samples, n
Set the number of samples per channel per each output frame, default
is 1024. Only used if plugin have zero inputs.

@item duration, d
Set the minimum duration of the sourced audio. See
@ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils}
for the accepted syntax.
Note that the resulting duration may be greater than the specified duration,
as the generated audio is always cut at the end of a complete frame.
If not specified, or the expressed duration is negative, the audio is
supposed to be generated forever.
Only used if plugin have zero inputs.
@end table

@subsection Examples

@itemize
@item
Apply bass enhancer plugin from Calf:
@example
lv2=p=http\\\\://calf.sourceforge.net/plugins/BassEnhancer:c=amount=2
@end example

@item
Apply vinyl plugin from Calf:
@example
lv2=p=http\\\\://calf.sourceforge.net/plugins/Vinyl:c=drone=0.2|aging=0.5
@end example

@item
Apply bit crusher plugin from ArtyFX:
@example
lv2=p=http\\\\://www.openavproductions.com/artyfx#bitta:c=crush=0.3
@end example
@end itemize

@section mcompand
Multiband Compress or expand the audio's dynamic range.

The input audio is divided into bands using 4th order Linkwitz-Riley IIRs.
This is akin to the crossover of a loudspeaker, and results in flat frequency
response when absent compander action.

It accepts the following parameters:

@table @option
@item args
This option syntax is:
attack,decay,[attack,decay..] soft-knee points crossover_frequency [delay [initial_volume [gain]]] | attack,decay ...
For explanation of each item refer to compand filter documentation.
@end table

@anchor{pan}
@section pan

Mix channels with specific gain levels. The filter accepts the output
channel layout followed by a set of channels definitions.

This filter is also designed to efficiently remap the channels of an audio
stream.

The filter accepts parameters of the form:
"@var{l}|@var{outdef}|@var{outdef}|..."

@table @option
@item l
output channel layout or number of channels

@item outdef
output channel specification, of the form:
"@var{out_name}=[@var{gain}*]@var{in_name}[(+-)[@var{gain}*]@var{in_name}...]"

@item out_name
output channel to define, either a channel name (FL, FR, etc.) or a channel
number (c0, c1, etc.)

@item gain
multiplicative coefficient for the channel, 1 leaving the volume unchanged

@item in_name
input channel to use, see out_name for details; it is not possible to mix
named and numbered input channels
@end table

If the `=' in a channel specification is replaced by `<', then the gains for
that specification will be renormalized so that the total is 1, thus
avoiding clipping noise.

@subsection Mixing examples

For example, if you want to down-mix from stereo to mono, but with a bigger
factor for the left channel:
@example
pan=1c|c0=0.9*c0+0.1*c1
@end example

A customized down-mix to stereo that works automatically for 3-, 4-, 5- and
7-channels surround:
@example
pan=stereo| FL < FL + 0.5*FC + 0.6*BL + 0.6*SL | FR < FR + 0.5*FC + 0.6*BR + 0.6*SR
@end example

Note that @command{ffmpeg} integrates a default down-mix (and up-mix) system
that should be preferred (see "-ac" option) unless you have very specific
needs.

@subsection Remapping examples

The channel remapping will be effective if, and only if:

@itemize
@item gain coefficients are zeroes or ones,
@item only one input per channel output,
@end itemize

If all these conditions are satisfied, the filter will notify the user ("Pure
channel mapping detected"), and use an optimized and lossless method to do the
remapping.

For example, if you have a 5.1 source and want a stereo audio stream by
dropping the extra channels:
@example
pan="stereo| c0=FL | c1=FR"
@end example

Given the same source, you can also switch front left and front right channels
and keep the input channel layout:
@example
pan="5.1| c0=c1 | c1=c0 | c2=c2 | c3=c3 | c4=c4 | c5=c5"
@end example

If the input is a stereo audio stream, you can mute the front left channel (and
still keep the stereo channel layout) with:
@example
pan="stereo|c1=c1"
@end example

Still with a stereo audio stream input, you can copy the right channel in both
front left and right:
@example
pan="stereo| c0=FR | c1=FR"
@end example

@section replaygain

ReplayGain scanner filter. This filter takes an audio stream as an input and
outputs it unchanged.
At end of filtering it displays @code{track_gain} and @code{track_peak}.

@section resample

Convert the audio sample format, sample rate and channel layout. It is
not meant to be used directly.

@section rubberband
Apply time-stretching and pitch-shifting with librubberband.

The filter accepts the following options:

@table @option
@item tempo
Set tempo scale factor.

@item pitch
Set pitch scale factor.

@item transients
Set transients detector.
Possible values are:
@table @var
@item crisp
@item mixed
@item smooth
@end table

@item detector
Set detector.
Possible values are:
@table @var
@item compound
@item percussive
@item soft
@end table

@item phase
Set phase.
Possible values are:
@table @var
@item laminar
@item independent
@end table

@item window
Set processing window size.
Possible values are:
@table @var
@item standard
@item short
@item long
@end table

@item smoothing
Set smoothing.
Possible values are:
@table @var
@item off
@item on
@end table

@item formant
Enable formant preservation when shift pitching.
Possible values are:
@table @var
@item shifted
@item preserved
@end table

@item pitchq
Set pitch quality.
Possible values are:
@table @var
@item quality
@item speed
@item consistency
@end table

@item channels
Set channels.
Possible values are:
@table @var
@item apart
@item together
@end table
@end table

@section sidechaincompress

This filter acts like normal compressor but has the ability to compress
detected signal using second input signal.
It needs two input streams and returns one output stream.
First input stream will be processed depending on second stream signal.
The filtered signal then can be filtered with other filters in later stages of
processing. See @ref{pan} and @ref{amerge} filter.

The filter accepts the following options:

@table @option
@item level_in
Set input gain. Default is 1. Range is between 0.015625 and 64.

@item threshold
If a signal of second stream raises above this level it will affect the gain
reduction of first stream.
By default is 0.125. Range is between 0.00097563 and 1.

@item ratio
Set a ratio about which the signal is reduced. 1:2 means that if the level
raised 4dB above the threshold, it will be only 2dB above after the reduction.
Default is 2. Range is between 1 and 20.

@item attack
Amount of milliseconds the signal has to rise above the threshold before gain
reduction starts. Default is 20. Range is between 0.01 and 2000.

@item release
Amount of milliseconds the signal has to fall below the threshold before
reduction is decreased again. Default is 250. Range is between 0.01 and 9000.

@item makeup
Set the amount by how much signal will be amplified after processing.
Default is 1. Range is from 1 to 64.

@item knee
Curve the sharp knee around the threshold to enter gain reduction more softly.
Default is 2.82843. Range is between 1 and 8.

@item link
Choose if the @code{average} level between all channels of side-chain stream
or the louder(@code{maximum}) channel of side-chain stream affects the
reduction. Default is @code{average}.

@item detection
Should the exact signal be taken in case of @code{peak} or an RMS one in case
of @code{rms}. Default is @code{rms} which is mainly smoother.

@item level_sc
Set sidechain gain. Default is 1. Range is between 0.015625 and 64.

@item mix
How much to use compressed signal in output. Default is 1.
Range is between 0 and 1.
@end table

@subsection Examples

@itemize
@item
Full ffmpeg example taking 2 audio inputs, 1st input to be compressed
depending on the signal of 2nd input and later compressed signal to be
merged with 2nd input:
@example
ffmpeg -i main.flac -i sidechain.flac -filter_complex "[1:a]asplit=2[sc][mix];[0:a][sc]sidechaincompress[compr];[compr][mix]amerge"
@end example
@end itemize

@section sidechaingate

A sidechain gate acts like a normal (wideband) gate but has the ability to
filter the detected signal before sending it to the gain reduction stage.
Normally a gate uses the full range signal to detect a level above the
threshold.
For example: If you cut all lower frequencies from your sidechain signal
the gate will decrease the volume of your track only if not enough highs
appear. With this technique you are able to reduce the resonation of a
natural drum or remove "rumbling" of muted strokes from a heavily distorted
guitar.
It needs two input streams and returns one output stream.
First input stream will be processed depending on second stream signal.

The filter accepts the following options:

@table @option
@item level_in
Set input level before filtering.
Default is 1. Allowed range is from 0.015625 to 64.

@item range
Set the level of gain reduction when the signal is below the threshold.
Default is 0.06125. Allowed range is from 0 to 1.

@item threshold
If a signal rises above this level the gain reduction is released.
Default is 0.125. Allowed range is from 0 to 1.

@item ratio
Set a ratio about which the signal is reduced.
Default is 2. Allowed range is from 1 to 9000.

@item attack
Amount of milliseconds the signal has to rise above the threshold before gain
reduction stops.
Default is 20 milliseconds. Allowed range is from 0.01 to 9000.

@item release
Amount of milliseconds the signal has to fall below the threshold before the
reduction is increased again. Default is 250 milliseconds.
Allowed range is from 0.01 to 9000.

@item makeup
Set amount of amplification of signal after processing.
Default is 1. Allowed range is from 1 to 64.

@item knee
Curve the sharp knee around the threshold to enter gain reduction more softly.
Default is 2.828427125. Allowed range is from 1 to 8.

@item detection
Choose if exact signal should be taken for detection or an RMS like one.
Default is rms. Can be peak or rms.

@item link
Choose if the average level between all channels or the louder channel affects
the reduction.
Default is average. Can be average or maximum.

@item level_sc
Set sidechain gain. Default is 1. Range is from 0.015625 to 64.
@end table

@section silencedetect

Detect silence in an audio stream.

This filter logs a message when it detects that the input audio volume is less
or equal to a noise tolerance value for a duration greater or equal to the
minimum detected noise duration.

The printed times and duration are expressed in seconds.

The filter accepts the following options:

@table @option
@item duration, d
Set silence duration until notification (default is 2 seconds).

@item noise, n
Set noise tolerance. Can be specified in dB (in case "dB" is appended to the
specified value) or amplitude ratio. Default is -60dB, or 0.001.
@end table

@subsection Examples

@itemize
@item
Detect 5 seconds of silence with -50dB noise tolerance:
@example
silencedetect=n=-50dB:d=5
@end example

@item
Complete example with @command{ffmpeg} to detect silence with 0.0001 noise
tolerance in @file{silence.mp3}:
@example
ffmpeg -i silence.mp3 -af silencedetect=noise=0.0001 -f null -
@end example
@end itemize

@section silenceremove

Remove silence from the beginning, middle or end of the audio.

The filter accepts the following options:

@table @option
@item start_periods
This value is used to indicate if audio should be trimmed at beginning of
the audio. A value of zero indicates no silence should be trimmed from the
beginning. When specifying a non-zero value, it trims audio up until it
finds non-silence. Normally, when trimming silence from beginning of audio
the @var{start_periods} will be @code{1} but it can be increased to higher
values to trim all audio up to specific count of non-silence periods.
Default value is @code{0}.

@item start_duration
Specify the amount of time that non-silence must be detected before it stops
trimming audio. By increasing the duration, bursts of noises can be treated
as silence and trimmed off. Default value is @code{0}.

@item start_threshold
This indicates what sample value should be treated as silence. For digital
audio, a value of @code{0} may be fine but for audio recorded from analog,
you may wish to increase the value to account for background noise.
Can be specified in dB (in case "dB" is appended to the specified value)
or amplitude ratio. Default value is @code{0}.

@item stop_periods
Set the count for trimming silence from the end of audio.
To remove silence from the middle of a file, specify a @var{stop_periods}
that is negative. This value is then treated as a positive value and is
used to indicate the effect should restart processing as specified by
@var{start_periods}, making it suitable for removing periods of silence
in the middle of the audio.
Default value is @code{0}.

@item stop_duration
Specify a duration of silence that must exist before audio is not copied any
more. By specifying a higher duration, silence that is wanted can be left in
the audio.
Default value is @code{0}.

@item stop_threshold
This is the same as @option{start_threshold} but for trimming silence from
the end of audio.
Can be specified in dB (in case "dB" is appended to the specified value)
or amplitude ratio. Default value is @code{0}.

@item leave_silence
This indicates that @var{stop_duration} length of audio should be left intact
at the beginning of each period of silence.
For example, if you want to remove long pauses between words but do not want
to remove the pauses completely. Default value is @code{0}.

@item detection
Set how is silence detected. Can be @code{rms} or @code{peak}. Second is faster
and works better with digital silence which is exactly 0.
Default value is @code{rms}.

@item window
Set ratio used to calculate size of window for detecting silence.
Default value is @code{0.02}. Allowed range is from @code{0} to @code{10}.
@end table

@subsection Examples

@itemize
@item
The following example shows how this filter can be used to start a recording
that does not contain the delay at the start which usually occurs between
pressing the record button and the start of the performance:
@example
silenceremove=1:5:0.02
@end example

@item
Trim all silence encountered from beginning to end where there is more than 1
second of silence in audio:
@example
silenceremove=0:0:0:-1:1:-90dB
@end example
@end itemize

@section sofalizer

SOFAlizer uses head-related transfer functions (HRTFs) to create virtual
loudspeakers around the user for binaural listening via headphones (audio
formats up to 9 channels supported).
The HRTFs are stored in SOFA files (see @url{http://www.sofacoustics.org/} for a database).
SOFAlizer is developed at the Acoustics Research Institute (ARI) of the
Austrian Academy of Sciences.

To enable compilation of this filter you need to configure FFmpeg with
@code{--enable-libmysofa}.

The filter accepts the following options:

@table @option
@item sofa
Set the SOFA file used for rendering.

@item gain
Set gain applied to audio. Value is in dB. Default is 0.

@item rotation
Set rotation of virtual loudspeakers in deg. Default is 0.

@item elevation
Set elevation of virtual speakers in deg. Default is 0.

@item radius
Set distance in meters between loudspeakers and the listener with near-field
HRTFs. Default is 1.

@item type
Set processing type. Can be @var{time} or @var{freq}. @var{time} is
processing audio in time domain which is slow.
@var{freq} is processing audio in frequency domain which is fast.
Default is @var{freq}.

@item speakers
Set custom positions of virtual loudspeakers. Syntax for this option is:
<CH> <AZIM> <ELEV>[|<CH> <AZIM> <ELEV>|...].
Each virtual loudspeaker is described with short channel name following with
azimuth and elevation in degrees.
Each virtual loudspeaker description is separated by '|'.
For example to override front left and front right channel positions use:
'speakers=FL 45 15|FR 345 15'.
Descriptions with unrecognised channel names are ignored.

@item lfegain
Set custom gain for LFE channels. Value is in dB. Default is 0.
@end table

@subsection Examples

@itemize
@item
Using ClubFritz6 sofa file:
@example
sofalizer=sofa=/path/to/ClubFritz6.sofa:type=freq:radius=1
@end example

@item
Using ClubFritz12 sofa file and bigger radius with small rotation:
@example
sofalizer=sofa=/path/to/ClubFritz12.sofa:type=freq:radius=2:rotation=5
@end example

@item
Similar as above but with custom speaker positions for front left, front right, back left and back right
and also with custom gain:
@example
"sofalizer=sofa=/path/to/ClubFritz6.sofa:type=freq:radius=2:speakers=FL 45|FR 315|BL 135|BR 225:gain=28"
@end example
@end itemize

@section stereotools

This filter has some handy utilities to manage stereo signals, for converting
M/S stereo recordings to L/R signal while having control over the parameters
or spreading the stereo image of master track.

The filter accepts the following options:

@table @option
@item level_in
Set input level before filtering for both channels. Defaults is 1.
Allowed range is from 0.015625 to 64.

@item level_out
Set output level after filtering for both channels. Defaults is 1.
Allowed range is from 0.015625 to 64.

@item balance_in
Set input balance between both channels. Default is 0.
Allowed range is from -1 to 1.

@item balance_out
Set output balance between both channels. Default is 0.
Allowed range is from -1 to 1.

@item softclip
Enable softclipping. Results in analog distortion instead of harsh digital 0dB
clipping. Disabled by default.

@item mutel
Mute the left channel. Disabled by default.

@item muter
Mute the right channel. Disabled by default.

@item phasel
Change the phase of the left channel. Disabled by default.

@item phaser
Change the phase of the right channel. Disabled by default.

@item mode
Set stereo mode. Available values are:

@table @samp
@item lr>lr
Left/Right to Left/Right, this is default.

@item lr>ms
Left/Right to Mid/Side.

@item ms>lr
Mid/Side to Left/Right.

@item lr>ll
Left/Right to Left/Left.

@item lr>rr
Left/Right to Right/Right.

@item lr>l+r
Left/Right to Left + Right.

@item lr>rl
Left/Right to Right/Left.

@item ms>ll
Mid/Side to Left/Left.

@item ms>rr
Mid/Side to Right/Right.
@end table

@item slev
Set level of side signal. Default is 1.
Allowed range is from 0.015625 to 64.

@item sbal
Set balance of side signal. Default is 0.
Allowed range is from -1 to 1.

@item mlev
Set level of the middle signal. Default is 1.
Allowed range is from 0.015625 to 64.

@item mpan
Set middle signal pan. Default is 0. Allowed range is from -1 to 1.

@item base
Set stereo base between mono and inversed channels. Default is 0.
Allowed range is from -1 to 1.

@item delay
Set delay in milliseconds how much to delay left from right channel and
vice versa. Default is 0. Allowed range is from -20 to 20.

@item sclevel
Set S/C level. Default is 1. Allowed range is from 1 to 100.

@item phase
Set the stereo phase in degrees. Default is 0. Allowed range is from 0 to 360.

@item bmode_in, bmode_out
Set balance mode for balance_in/balance_out option.

Can be one of the following:

@table @samp
@item balance
Classic balance mode. Attenuate one channel at time.
Gain is raised up to 1.

@item amplitude
Similar as classic mode above but gain is raised up to 2.

@item power
Equal power distribution, from -6dB to +6dB range.
@end table
@end table

@subsection Examples

@itemize
@item
Apply karaoke like effect:
@example
stereotools=mlev=0.015625
@end example

@item
Convert M/S signal to L/R:
@example
"stereotools=mode=ms>lr"
@end example
@end itemize

@section stereowiden

This filter enhance the stereo effect by suppressing signal common to both
channels and by delaying the signal of left into right and vice versa,
thereby widening the stereo effect.

The filter accepts the following options:

@table @option
@item delay
Time in milliseconds of the delay of left signal into right and vice versa.
Default is 20 milliseconds.

@item feedback
Amount of gain in delayed signal into right and vice versa. Gives a delay
effect of left signal in right output and vice versa which gives widening
effect. Default is 0.3.

@item crossfeed
Cross feed of left into right with inverted phase. This helps in suppressing
the mono. If the value is 1 it will cancel all the signal common to both
channels. Default is 0.3.

@item drymix
Set level of input signal of original channel. Default is 0.8.
@end table

@section superequalizer
Apply 18 band equalizer.

The filter accepts the following options:
@table @option
@item 1b
Set 65Hz band gain.
@item 2b
Set 92Hz band gain.
@item 3b
Set 131Hz band gain.
@item 4b
Set 185Hz band gain.
@item 5b
Set 262Hz band gain.
@item 6b
Set 370Hz band gain.
@item 7b
Set 523Hz band gain.
@item 8b
Set 740Hz band gain.
@item 9b
Set 1047Hz band gain.
@item 10b
Set 1480Hz band gain.
@item 11b
Set 2093Hz band gain.
@item 12b
Set 2960Hz band gain.
@item 13b
Set 4186Hz band gain.
@item 14b
Set 5920Hz band gain.
@item 15b
Set 8372Hz band gain.
@item 16b
Set 11840Hz band gain.
@item 17b
Set 16744Hz band gain.
@item 18b
Set 20000Hz band gain.
@end table

@section surround
Apply audio surround upmix filter.

This filter allows to produce multichannel output from audio stream.

The filter accepts the following options:

@table @option
@item chl_out
Set output channel layout. By default, this is @var{5.1}.

See @ref{channel layout syntax,,the Channel Layout section in the ffmpeg-utils(1) manual,ffmpeg-utils}
for the required syntax.

@item chl_in
Set input channel layout. By default, this is @var{stereo}.

See @ref{channel layout syntax,,the Channel Layout section in the ffmpeg-utils(1) manual,ffmpeg-utils}
for the required syntax.

@item level_in
Set input volume level. By default, this is @var{1}.

@item level_out
Set output volume level. By default, this is @var{1}.

@item lfe
Enable LFE channel output if output channel layout has it. By default, this is enabled.

@item lfe_low
Set LFE low cut off frequency. By default, this is @var{128} Hz.

@item lfe_high
Set LFE high cut off frequency. By default, this is @var{256} Hz.

@item fc_in
Set front center input volume. By default, this is @var{1}.

@item fc_out
Set front center output volume. By default, this is @var{1}.

@item lfe_in
Set LFE input volume. By default, this is @var{1}.

@item lfe_out
Set LFE output volume. By default, this is @var{1}.
@end table

@section treble

Boost or cut treble (upper) frequencies of the audio using a two-pole
shelving filter with a response similar to that of a standard
hi-fi's tone-controls. This is also known as shelving equalisation (EQ).

The filter accepts the following options:

@table @option
@item gain, g
Give the gain at whichever is the lower of ~22 kHz and the
Nyquist frequency. Its useful range is about -20 (for a large cut)
to +20 (for a large boost). Beware of clipping when using a positive gain.

@item frequency, f
Set the filter's central frequency and so can be used
to extend or reduce the frequency range to be boosted or cut.
The default value is @code{3000} Hz.

@item width_type, t
Set method to specify band-width of filter.
@table @option
@item h
Hz
@item q
Q-Factor
@item o
octave
@item s
slope
@item k
kHz
@end table

@item width, w
Determine how steep is the filter's shelf transition.

@item channels, c
Specify which channels to filter, by default all available are filtered.
@end table

@subsection Commands

This filter supports the following commands:
@table @option
@item frequency, f
Change treble frequency.
Syntax for the command is : "@var{frequency}"

@item width_type, t
Change treble width_type.
Syntax for the command is : "@var{width_type}"

@item width, w
Change treble width.
Syntax for the command is : "@var{width}"

@item gain, g
Change treble gain.
Syntax for the command is : "@var{gain}"
@end table

@section tremolo

Sinusoidal amplitude modulation.

The filter accepts the following options:

@table @option
@item f
Modulation frequency in Hertz. Modulation frequencies in the subharmonic range
(20 Hz or lower) will result in a tremolo effect.
This filter may also be used as a ring modulator by specifying
a modulation frequency higher than 20 Hz.
Range is 0.1 - 20000.0. Default value is 5.0 Hz.

@item d
Depth of modulation as a percentage. Range is 0.0 - 1.0.
Default value is 0.5.
@end table

@section vibrato

Sinusoidal phase modulation.

The filter accepts the following options:

@table @option
@item f
Modulation frequency in Hertz.
Range is 0.1 - 20000.0. Default value is 5.0 Hz.

@item d
Depth of modulation as a percentage. Range is 0.0 - 1.0.
Default value is 0.5.
@end table

@section volume

Adjust the input audio volume.

It accepts the following parameters:
@table @option

@item volume
Set audio volume expression.

Output values are clipped to the maximum value.

The output audio volume is given by the relation:
@example
@var{output_volume} = @var{volume} * @var{input_volume}
@end example

The default value for @var{volume} is "1.0".

@item precision
This parameter represents the mathematical precision.

It determines which input sample formats will be allowed, which affects the
precision of the volume scaling.

@table @option
@item fixed
8-bit fixed-point; this limits input sample format to U8, S16, and S32.
@item float
32-bit floating-point; this limits input sample format to FLT. (default)
@item double
64-bit floating-point; this limits input sample format to DBL.
@end table

@item replaygain
Choose the behaviour on encountering ReplayGain side data in input frames.

@table @option
@item drop
Remove ReplayGain side data, ignoring its contents (the default).

@item ignore
Ignore ReplayGain side data, but leave it in the frame.

@item track
Prefer the track gain, if present.

@item album
Prefer the album gain, if present.
@end table

@item replaygain_preamp
Pre-amplification gain in dB to apply to the selected replaygain gain.

Default value for @var{replaygain_preamp} is 0.0.

@item eval
Set when the volume expression is evaluated.

It accepts the following values:
@table @samp
@item once
only evaluate expression once during the filter initialization, or
when the @samp{volume} command is sent

@item frame
evaluate expression for each incoming frame
@end table

Default value is @samp{once}.
@end table

The volume expression can contain the following parameters.

@table @option
@item n
frame number (starting at zero)
@item nb_channels
number of channels
@item nb_consumed_samples
number of samples consumed by the filter
@item nb_samples
number of samples in the current frame
@item pos
original frame position in the file
@item pts
frame PTS
@item sample_rate
sample rate
@item startpts
PTS at start of stream
@item startt
time at start of stream
@item t
frame time
@item tb
timestamp timebase
@item volume
last set volume value
@end table

Note that when @option{eval} is set to @samp{once} only the
@var{sample_rate} and @var{tb} variables are available, all other
variables will evaluate to NAN.

@subsection Commands

This filter supports the following commands:
@table @option
@item volume
Modify the volume expression.
The command accepts the same syntax of the corresponding option.

If the specified expression is not valid, it is kept at its current
value.
@item replaygain_noclip
Prevent clipping by limiting the gain applied.

Default value for @var{replaygain_noclip} is 1.

@end table

@subsection Examples

@itemize
@item
Halve the input audio volume:
@example
volume=volume=0.5
volume=volume=1/2
volume=volume=-6.0206dB
@end example

In all the above example the named key for @option{volume} can be
omitted, for example like in:
@example
volume=0.5
@end example

@item
Increase input audio power by 6 decibels using fixed-point precision:
@example
volume=volume=6dB:precision=fixed
@end example

@item
Fade volume after time 10 with an annihilation period of 5 seconds:
@example
volume='if(lt(t,10),1,max(1-(t-10)/5,0))':eval=frame
@end example
@end itemize

@section volumedetect

Detect the volume of the input video.

The filter has no parameters. The input is not modified. Statistics about
the volume will be printed in the log when the input stream end is reached.

In particular it will show the mean volume (root mean square), maximum
volume (on a per-sample basis), and the beginning of a histogram of the
registered volume values (from the maximum value to a cumulated 1/1000 of
the samples).

All volumes are in decibels relative to the maximum PCM value.

@subsection Examples

Here is an excerpt of the output:
@example
[Parsed_volumedetect_0 @ 0xa23120] mean_volume: -27 dB
[Parsed_volumedetect_0 @ 0xa23120] max_volume: -4 dB
[Parsed_volumedetect_0 @ 0xa23120] histogram_4db: 6
[Parsed_volumedetect_0 @ 0xa23120] histogram_5db: 62
[Parsed_volumedetect_0 @ 0xa23120] histogram_6db: 286
[Parsed_volumedetect_0 @ 0xa23120] histogram_7db: 1042
[Parsed_volumedetect_0 @ 0xa23120] histogram_8db: 2551
[Parsed_volumedetect_0 @ 0xa23120] histogram_9db: 4609
[Parsed_volumedetect_0 @ 0xa23120] histogram_10db: 8409
@end example

It means that:
@itemize
@item
The mean square energy is approximately -27 dB, or 10^-2.7.
@item
The largest sample is at -4 dB, or more precisely between -4 dB and -5 dB.
@item
There are 6 samples at -4 dB, 62 at -5 dB, 286 at -6 dB, etc.
@end itemize

In other words, raising the volume by +4 dB does not cause any clipping,
raising it by +5 dB causes clipping for 6 samples, etc.

@c man end AUDIO FILTERS

@chapter Audio Sources
@c man begin AUDIO SOURCES

Below is a description of the currently available audio sources.

@section abuffer

Buffer audio frames, and make them available to the filter chain.

This source is mainly intended for a programmatic use, in particular
through the interface defined in @file{libavfilter/asrc_abuffer.h}.

It accepts the following parameters:
@table @option

@item time_base
The timebase which will be used for timestamps of submitted frames. It must be
either a floating-point number or in @var{numerator}/@var{denominator} form.

@item sample_rate
The sample rate of the incoming audio buffers.

@item sample_fmt
The sample format of the incoming audio buffers.
Either a sample format name or its corresponding integer representation from
the enum AVSampleFormat in @file{libavutil/samplefmt.h}

@item channel_layout
The channel layout of the incoming audio buffers.
Either a channel layout name from channel_layout_map in
@file{libavutil/channel_layout.c} or its corresponding integer representation
from the AV_CH_LAYOUT_* macros in @file{libavutil/channel_layout.h}

@item channels
The number of channels of the incoming audio buffers.
If both @var{channels} and @var{channel_layout} are specified, then they
must be consistent.

@end table

@subsection Examples

@example
abuffer=sample_rate=44100:sample_fmt=s16p:channel_layout=stereo
@end example

will instruct the source to accept planar 16bit signed stereo at 44100Hz.
Since the sample format with name "s16p" corresponds to the number
6 and the "stereo" channel layout corresponds to the value 0x3, this is
equivalent to:
@example
abuffer=sample_rate=44100:sample_fmt=6:channel_layout=0x3
@end example

@section aevalsrc

Generate an audio signal specified by an expression.

This source accepts in input one or more expressions (one for each
channel), which are evaluated and used to generate a corresponding
audio signal.

This source accepts the following options:

@table @option
@item exprs
Set the '|'-separated expressions list for each separate channel. In case the
@option{channel_layout} option is not specified, the selected channel layout
depends on the number of provided expressions. Otherwise the last
specified expression is applied to the remaining output channels.

@item channel_layout, c
Set the channel layout. The number of channels in the specified layout
must be equal to the number of specified expressions.

@item duration, d
Set the minimum duration of the sourced audio. See
@ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils}
for the accepted syntax.
Note that the resulting duration may be greater than the specified
duration, as the generated audio is always cut at the end of a
complete frame.

If not specified, or the expressed duration is negative, the audio is
supposed to be generated forever.

@item nb_samples, n
Set the number of samples per channel per each output frame,
default to 1024.

@item sample_rate, s
Specify the sample rate, default to 44100.
@end table

Each expression in @var{exprs} can contain the following constants:

@table @option
@item n
number of the evaluated sample, starting from 0

@item t
time of the evaluated sample expressed in seconds, starting from 0

@item s
sample rate

@end table

@subsection Examples

@itemize
@item
Generate silence:
@example
aevalsrc=0
@end example

@item
Generate a sin signal with frequency of 440 Hz, set sample rate to
8000 Hz:
@example
aevalsrc="sin(440*2*PI*t):s=8000"
@end example

@item
Generate a two channels signal, specify the channel layout (Front
Center + Back Center) explicitly:
@example
aevalsrc="sin(420*2*PI*t)|cos(430*2*PI*t):c=FC|BC"
@end example

@item
Generate white noise:
@example
aevalsrc="-2+random(0)"
@end example

@item
Generate an amplitude modulated signal:
@example
aevalsrc="sin(10*2*PI*t)*sin(880*2*PI*t)"
@end example

@item
Generate 2.5 Hz binaural beats on a 360 Hz carrier:
@example
aevalsrc="0.1*sin(2*PI*(360-2.5/2)*t) | 0.1*sin(2*PI*(360+2.5/2)*t)"
@end example

@end itemize

@section anullsrc

The null audio source, return unprocessed audio frames. It is mainly useful
as a template and to be employed in analysis / debugging tools, or as
the source for filters which ignore the input data (for example the sox
synth filter).

This source accepts the following options:

@table @option

@item channel_layout, cl

Specifies the channel layout, and can be either an integer or a string
representing a channel layout. The default value of @var{channel_layout}
is "stereo".

Check the channel_layout_map definition in
@file{libavutil/channel_layout.c} for the mapping between strings and
channel layout values.

@item sample_rate, r
Specifies the sample rate, and defaults to 44100.

@item nb_samples, n
Set the number of samples per requested frames.

@end table

@subsection Examples

@itemize
@item
Set the sample rate to 48000 Hz and the channel layout to AV_CH_LAYOUT_MONO.
@example
anullsrc=r=48000:cl=4
@end example

@item
Do the same operation with a more obvious syntax:
@example
anullsrc=r=48000:cl=mono
@end example
@end itemize

All the parameters need to be explicitly defined.

@section flite

Synthesize a voice utterance using the libflite library.

To enable compilation of this filter you need to configure FFmpeg with
@code{--enable-libflite}.

Note that versions of the flite library prior to 2.0 are not thread-safe.

The filter accepts the following options:

@table @option

@item list_voices
If set to 1, list the names of the available voices and exit
immediately. Default value is 0.

@item nb_samples, n
Set the maximum number of samples per frame. Default value is 512.

@item textfile
Set the filename containing the text to speak.

@item text
Set the text to speak.

@item voice, v
Set the voice to use for the speech synthesis. Default value is
@code{kal}. See also the @var{list_voices} option.
@end table

@subsection Examples

@itemize
@item
Read from file @file{speech.txt}, and synthesize the text using the
standard flite voice:
@example
flite=textfile=speech.txt
@end example

@item
Read the specified text selecting the @code{slt} voice:
@example
flite=text='So fare thee well, poor devil of a Sub-Sub, whose commentator I am':voice=slt
@end example

@item
Input text to ffmpeg:
@example
ffmpeg -f lavfi -i flite=text='So fare thee well, poor devil of a Sub-Sub, whose commentator I am':voice=slt
@end example

@item
Make @file{ffplay} speak the specified text, using @code{flite} and
the @code{lavfi} device:
@example
ffplay -f lavfi flite=text='No more be grieved for which that thou hast done.'
@end example
@end itemize

For more information about libflite, check:
@url{http://www.festvox.org/flite/}

@section anoisesrc

Generate a noise audio signal.

The filter accepts the following options:

@table @option
@item sample_rate, r
Specify the sample rate. Default value is 48000 Hz.

@item amplitude, a
Specify the amplitude (0.0 - 1.0) of the generated audio stream. Default value
is 1.0.

@item duration, d
Specify the duration of the generated audio stream. Not specifying this option
results in noise with an infinite length.

@item color, colour, c
Specify the color of noise. Available noise colors are white, pink, brown,
blue and violet. Default color is white.

@item seed, s
Specify a value used to seed the PRNG.

@item nb_samples, n
Set the number of samples per each output frame, default is 1024.
@end table

@subsection Examples

@itemize

@item
Generate 60 seconds of pink noise, with a 44.1 kHz sampling rate and an amplitude of 0.5:
@example
anoisesrc=d=60:c=pink:r=44100:a=0.5
@end example
@end itemize

@section hilbert

Generate odd-tap Hilbert transform FIR coefficients.

The resulting stream can be used with @ref{afir} filter for phase-shifting
the signal by 90 degrees.

This is used in many matrix coding schemes and for analytic signal generation.
The process is often written as a multiplication by i (or j), the imaginary unit.

The filter accepts the following options:

@table @option

@item sample_rate, s
Set sample rate, default is 44100.

@item taps, t
Set length of FIR filter, default is 22051.

@item nb_samples, n
Set number of samples per each frame.

@item win_func, w
Set window function to be used when generating FIR coefficients.
@end table

@section sine

Generate an audio signal made of a sine wave with amplitude 1/8.

The audio signal is bit-exact.

The filter accepts the following options:

@table @option

@item frequency, f
Set the carrier frequency. Default is 440 Hz.

@item beep_factor, b
Enable a periodic beep every second with frequency @var{beep_factor} times
the carrier frequency. Default is 0, meaning the beep is disabled.

@item sample_rate, r
Specify the sample rate, default is 44100.

@item duration, d
Specify the duration of the generated audio stream.

@item samples_per_frame
Set the number of samples per output frame.

The expression can contain the following constants:

@table @option
@item n
The (sequential) number of the output audio frame, starting from 0.

@item pts
The PTS (Presentation TimeStamp) of the output audio frame,
expressed in @var{TB} units.

@item t
The PTS of the output audio frame, expressed in seconds.

@item TB
The timebase of the output audio frames.
@end table

Default is @code{1024}.
@end table

@subsection Examples

@itemize

@item
Generate a simple 440 Hz sine wave:
@example
sine
@end example

@item
Generate a 220 Hz sine wave with a 880 Hz beep each second, for 5 seconds:
@example
sine=220:4:d=5
sine=f=220:b=4:d=5
sine=frequency=220:beep_factor=4:duration=5
@end example

@item
Generate a 1 kHz sine wave following @code{1602,1601,1602,1601,1602} NTSC
pattern:
@example
sine=1000:samples_per_frame='st(0,mod(n,5)); 1602-not(not(eq(ld(0),1)+eq(ld(0),3)))'
@end example
@end itemize

@c man end AUDIO SOURCES

@chapter Audio Sinks
@c man begin AUDIO SINKS

Below is a description of the currently available audio sinks.

@section abuffersink

Buffer audio frames, and make them available to the end of filter chain.

This sink is mainly intended for programmatic use, in particular
through the interface defined in @file{libavfilter/buffersink.h}
or the options system.

It accepts a pointer to an AVABufferSinkContext structure, which
defines the incoming buffers' formats, to be passed as the opaque
parameter to @code{avfilter_init_filter} for initialization.
@section anullsink

Null audio sink; do absolutely nothing with the input audio. It is
mainly useful as a template and for use in analysis / debugging
tools.

@c man end AUDIO SINKS

@chapter Video Filters
@c man begin VIDEO FILTERS

When you configure your FFmpeg build, you can disable any of the
existing filters using @code{--disable-filters}.
The configure output will show the video filters included in your
build.

Below is a description of the currently available video filters.

@section alphaextract

Extract the alpha component from the input as a grayscale video. This
is especially useful with the @var{alphamerge} filter.

@section alphamerge

Add or replace the alpha component of the primary input with the
grayscale value of a second input. This is intended for use with
@var{alphaextract} to allow the transmission or storage of frame
sequences that have alpha in a format that doesn't support an alpha
channel.

For example, to reconstruct full frames from a normal YUV-encoded video
and a separate video created with @var{alphaextract}, you might use:
@example
movie=in_alpha.mkv [alpha]; [in][alpha] alphamerge [out]
@end example

Since this filter is designed for reconstruction, it operates on frame
sequences without considering timestamps, and terminates when either
input reaches end of stream. This will cause problems if your encoding
pipeline drops frames. If you're trying to apply an image as an
overlay to a video stream, consider the @var{overlay} filter instead.

@section ass

Same as the @ref{subtitles} filter, except that it doesn't require libavcodec
and libavformat to work. On the other hand, it is limited to ASS (Advanced
Substation Alpha) subtitles files.

This filter accepts the following option in addition to the common options from
the @ref{subtitles} filter:

@table @option
@item shaping
Set the shaping engine

Available values are:
@table @samp
@item auto
The default libass shaping engine, which is the best available.
@item simple
Fast, font-agnostic shaper that can do only substitutions
@item complex
Slower shaper using OpenType for substitutions and positioning
@end table

The default is @code{auto}.
@end table

@section atadenoise
Apply an Adaptive Temporal Averaging Denoiser to the video input.

The filter accepts the following options:

@table @option
@item 0a
Set threshold A for 1st plane. Default is 0.02.
Valid range is 0 to 0.3.

@item 0b
Set threshold B for 1st plane. Default is 0.04.
Valid range is 0 to 5.

@item 1a
Set threshold A for 2nd plane. Default is 0.02.
Valid range is 0 to 0.3.

@item 1b
Set threshold B for 2nd plane. Default is 0.04.
Valid range is 0 to 5.

@item 2a
Set threshold A for 3rd plane. Default is 0.02.
Valid range is 0 to 0.3.

@item 2b
Set threshold B for 3rd plane. Default is 0.04.
Valid range is 0 to 5.

Threshold A is designed to react on abrupt changes in the input signal and
threshold B is designed to react on continuous changes in the input signal.

@item s
Set number of frames filter will use for averaging. Default is 33. Must be odd
number in range [5, 129].

@item p
Set what planes of frame filter will use for averaging. Default is all.
@end table

@section avgblur

Apply average blur filter.

The filter accepts the following options:

@table @option
@item sizeX
Set horizontal kernel size.

@item planes
Set which planes to filter. By default all planes are filtered.

@item sizeY
Set vertical kernel size, if zero it will be same as @code{sizeX}.
Default is @code{0}.
@end table

@section bbox

Compute the bounding box for the non-black pixels in the input frame
luminance plane.

This filter computes the bounding box containing all the pixels with a
luminance value greater than the minimum allowed value.
The parameters describing the bounding box are printed on the filter
log.

The filter accepts the following option:

@table @option
@item min_val
Set the minimal luminance value. Default is @code{16}.
@end table

@section bitplanenoise

Show and measure bit plane noise.

The filter accepts the following options:

@table @option
@item bitplane
Set which plane to analyze. Default is @code{1}.

@item filter
Filter out noisy pixels from @code{bitplane} set above.
Default is disabled.
@end table

@section blackdetect

Detect video intervals that are (almost) completely black. Can be
useful to detect chapter transitions, commercials, or invalid
recordings. Output lines contains the time for the start, end and
duration of the detected black interval expressed in seconds.

In order to display the output lines, you need to set the loglevel at
least to the AV_LOG_INFO value.

The filter accepts the following options:

@table @option
@item black_min_duration, d
Set the minimum detected black duration expressed in seconds. It must
be a non-negative floating point number.

Default value is 2.0.

@item picture_black_ratio_th, pic_th
Set the threshold for considering a picture "black".
Express the minimum value for the ratio:
@example
@var{nb_black_pixels} / @var{nb_pixels}
@end example

for which a picture is considered black.
Default value is 0.98.

@item pixel_black_th, pix_th
Set the threshold for considering a pixel "black".

The threshold expresses the maximum pixel luminance value for which a
pixel is considered "black". The provided value is scaled according to
the following equation:
@example
@var{absolute_threshold} = @var{luminance_minimum_value} + @var{pixel_black_th} * @var{luminance_range_size}
@end example

@var{luminance_range_size} and @var{luminance_minimum_value} depend on
the input video format, the range is [0-255] for YUV full-range
formats and [16-235] for YUV non full-range formats.

Default value is 0.10.
@end table

The following example sets the maximum pixel threshold to the minimum
value, and detects only black intervals of 2 or more seconds:
@example
blackdetect=d=2:pix_th=0.00
@end example

@section blackframe

Detect frames that are (almost) completely black. Can be useful to
detect chapter transitions or commercials. Output lines consist of
the frame number of the detected frame, the percentage of blackness,
the position in the file if known or -1 and the timestamp in seconds.

In order to display the output lines, you need to set the loglevel at
least to the AV_LOG_INFO value.

This filter exports frame metadata @code{lavfi.blackframe.pblack}.
The value represents the percentage of pixels in the picture that
are below the threshold value.

It accepts the following parameters:

@table @option

@item amount
The percentage of the pixels that have to be below the threshold; it defaults to
@code{98}.

@item threshold, thresh
The threshold below which a pixel value is considered black; it defaults to
@code{32}.

@end table

@section blend, tblend

Blend two video frames into each other.

The @code{blend} filter takes two input streams and outputs one
stream, the first input is the "top" layer and second input is
"bottom" layer.  By default, the output terminates when the longest input terminates.

The @code{tblend} (time blend) filter takes two consecutive frames
from one single stream, and outputs the result obtained by blending
the new frame on top of the old frame.

A description of the accepted options follows.

@table @option
@item c0_mode
@item c1_mode
@item c2_mode
@item c3_mode
@item all_mode
Set blend mode for specific pixel component or all pixel components in case
of @var{all_mode}. Default value is @code{normal}.

Available values for component modes are:
@table @samp
@item addition
@item grainmerge
@item and
@item average
@item burn
@item darken
@item difference
@item grainextract
@item divide
@item dodge
@item freeze
@item exclusion
@item extremity
@item glow
@item hardlight
@item hardmix
@item heat
@item lighten
@item linearlight
@item multiply
@item multiply128
@item negation
@item normal
@item or
@item overlay
@item phoenix
@item pinlight
@item reflect
@item screen
@item softlight
@item subtract
@item vividlight
@item xor
@end table

@item c0_opacity
@item c1_opacity
@item c2_opacity
@item c3_opacity
@item all_opacity
Set blend opacity for specific pixel component or all pixel components in case
of @var{all_opacity}. Only used in combination with pixel component blend modes.

@item c0_expr
@item c1_expr
@item c2_expr
@item c3_expr
@item all_expr
Set blend expression for specific pixel component or all pixel components in case
of @var{all_expr}. Note that related mode options will be ignored if those are set.

The expressions can use the following variables:

@table @option
@item N
The sequential number of the filtered frame, starting from @code{0}.

@item X
@item Y
the coordinates of the current sample

@item W
@item H
the width and height of currently filtered plane

@item SW
@item SH
Width and height scale depending on the currently filtered plane. It is the
ratio between the corresponding luma plane number of pixels and the current
plane ones. E.g. for YUV4:2:0 the values are @code{1,1} for the luma plane, and
@code{0.5,0.5} for chroma planes.

@item T
Time of the current frame, expressed in seconds.

@item TOP, A
Value of pixel component at current location for first video frame (top layer).

@item BOTTOM, B
Value of pixel component at current location for second video frame (bottom layer).
@end table
@end table

The @code{blend} filter also supports the @ref{framesync} options.

@subsection Examples

@itemize
@item
Apply transition from bottom layer to top layer in first 10 seconds:
@example
blend=all_expr='A*(if(gte(T,10),1,T/10))+B*(1-(if(gte(T,10),1,T/10)))'
@end example

@item
Apply linear horizontal transition from top layer to bottom layer:
@example
blend=all_expr='A*(X/W)+B*(1-X/W)'
@end example

@item
Apply 1x1 checkerboard effect:
@example
blend=all_expr='if(eq(mod(X,2),mod(Y,2)),A,B)'
@end example

@item
Apply uncover left effect:
@example
blend=all_expr='if(gte(N*SW+X,W),A,B)'
@end example

@item
Apply uncover down effect:
@example
blend=all_expr='if(gte(Y-N*SH,0),A,B)'
@end example

@item
Apply uncover up-left effect:
@example
blend=all_expr='if(gte(T*SH*40+Y,H)*gte((T*40*SW+X)*W/H,W),A,B)'
@end example

@item
Split diagonally video and shows top and bottom layer on each side:
@example
blend=all_expr='if(gt(X,Y*(W/H)),A,B)'
@end example

@item
Display differences between the current and the previous frame:
@example
tblend=all_mode=grainextract
@end example
@end itemize

@section boxblur

Apply a boxblur algorithm to the input video.

It accepts the following parameters:

@table @option

@item luma_radius, lr
@item luma_power, lp
@item chroma_radius, cr
@item chroma_power, cp
@item alpha_radius, ar
@item alpha_power, ap

@end table

A description of the accepted options follows.

@table @option
@item luma_radius, lr
@item chroma_radius, cr
@item alpha_radius, ar
Set an expression for the box radius in pixels used for blurring the
corresponding input plane.

The radius value must be a non-negative number, and must not be
greater than the value of the expression @code{min(w,h)/2} for the
luma and alpha planes, and of @code{min(cw,ch)/2} for the chroma
planes.

Default value for @option{luma_radius} is "2". If not specified,
@option{chroma_radius} and @option{alpha_radius} default to the
corresponding value set for @option{luma_radius}.

The expressions can contain the following constants:
@table @option
@item w
@item h
The input width and height in pixels.

@item cw
@item ch
The input chroma image width and height in pixels.

@item hsub
@item vsub
The horizontal and vertical chroma subsample values. For example, for the
pixel format "yuv422p", @var{hsub} is 2 and @var{vsub} is 1.
@end table

@item luma_power, lp
@item chroma_power, cp
@item alpha_power, ap
Specify how many times the boxblur filter is applied to the
corresponding plane.

Default value for @option{luma_power} is 2. If not specified,
@option{chroma_power} and @option{alpha_power} default to the
corresponding value set for @option{luma_power}.

A value of 0 will disable the effect.
@end table

@subsection Examples

@itemize
@item
Apply a boxblur filter with the luma, chroma, and alpha radii
set to 2:
@example
boxblur=luma_radius=2:luma_power=1
boxblur=2:1
@end example

@item
Set the luma radius to 2, and alpha and chroma radius to 0:
@example
boxblur=2:1:cr=0:ar=0
@end example

@item
Set the luma and chroma radii to a fraction of the video dimension:
@example
boxblur=luma_radius=min(h\,w)/10:luma_power=1:chroma_radius=min(cw\,ch)/10:chroma_power=1
@end example
@end itemize

@section bwdif

Deinterlace the input video ("bwdif" stands for "Bob Weaver
Deinterlacing Filter").

Motion adaptive deinterlacing based on yadif with the use of w3fdif and cubic
interpolation algorithms.
It accepts the following parameters:

@table @option
@item mode
The interlacing mode to adopt. It accepts one of the following values:

@table @option
@item 0, send_frame
Output one frame for each frame.
@item 1, send_field
Output one frame for each field.
@end table

The default value is @code{send_field}.

@item parity
The picture field parity assumed for the input interlaced video. It accepts one
of the following values:

@table @option
@item 0, tff
Assume the top field is first.
@item 1, bff
Assume the bottom field is first.
@item -1, auto
Enable automatic detection of field parity.
@end table

The default value is @code{auto}.
If the interlacing is unknown or the decoder does not export this information,
top field first will be assumed.

@item deint
Specify which frames to deinterlace. Accept one of the following
values:

@table @option
@item 0, all
Deinterlace all frames.
@item 1, interlaced
Only deinterlace frames marked as interlaced.
@end table

The default value is @code{all}.
@end table

@section chromakey
YUV colorspace color/chroma keying.

The filter accepts the following options:

@table @option
@item color
The color which will be replaced with transparency.

@item similarity
Similarity percentage with the key color.

0.01 matches only the exact key color, while 1.0 matches everything.

@item blend
Blend percentage.

0.0 makes pixels either fully transparent, or not transparent at all.

Higher values result in semi-transparent pixels, with a higher transparency
the more similar the pixels color is to the key color.

@item yuv
Signals that the color passed is already in YUV instead of RGB.

Literal colors like "green" or "red" don't make sense with this enabled anymore.
This can be used to pass exact YUV values as hexadecimal numbers.
@end table

@subsection Examples

@itemize
@item
Make every green pixel in the input image transparent:
@example
ffmpeg -i input.png -vf chromakey=green out.png
@end example

@item
Overlay a greenscreen-video on top of a static black background.
@example
ffmpeg -f lavfi -i color=c=black:s=1280x720 -i video.mp4 -shortest -filter_complex "[1:v]chromakey=0x70de77:0.1:0.2[ckout];[0:v][ckout]overlay[out]" -map "[out]" output.mkv
@end example
@end itemize

@section ciescope

Display CIE color diagram with pixels overlaid onto it.

The filter accepts the following options:

@table @option
@item system
Set color system.

@table @samp
@item ntsc, 470m
@item ebu, 470bg
@item smpte
@item 240m
@item apple
@item widergb
@item cie1931
@item rec709, hdtv
@item uhdtv, rec2020
@end table

@item cie
Set CIE system.

@table @samp
@item xyy
@item ucs
@item luv
@end table

@item gamuts
Set what gamuts to draw.

See @code{system} option for available values.

@item size, s
Set ciescope size, by default set to 512.

@item intensity, i
Set intensity used to map input pixel values to CIE diagram.

@item contrast
Set contrast used to draw tongue colors that are out of active color system gamut.

@item corrgamma
Correct gamma displayed on scope, by default enabled.

@item showwhite
Show white point on CIE diagram, by default disabled.

@item gamma
Set input gamma. Used only with XYZ input color space.
@end table

@section codecview

Visualize information exported by some codecs.

Some codecs can export information through frames using side-data or other
means. For example, some MPEG based codecs export motion vectors through the
@var{export_mvs} flag in the codec @option{flags2} option.

The filter accepts the following option:

@table @option
@item mv
Set motion vectors to visualize.

Available flags for @var{mv} are:

@table @samp
@item pf
forward predicted MVs of P-frames
@item bf
forward predicted MVs of B-frames
@item bb
backward predicted MVs of B-frames
@end table

@item qp
Display quantization parameters using the chroma planes.

@item mv_type, mvt
Set motion vectors type to visualize. Includes MVs from all frames unless specified by @var{frame_type} option.

Available flags for @var{mv_type} are:

@table @samp
@item fp
forward predicted MVs
@item bp
backward predicted MVs
@end table

@item frame_type, ft
Set frame type to visualize motion vectors of.

Available flags for @var{frame_type} are:

@table @samp
@item if
intra-coded frames (I-frames)
@item pf
predicted frames (P-frames)
@item bf
bi-directionally predicted frames (B-frames)
@end table
@end table

@subsection Examples

@itemize
@item
Visualize forward predicted MVs of all frames using @command{ffplay}:
@example
ffplay -flags2 +export_mvs input.mp4 -vf codecview=mv_type=fp
@end example

@item
Visualize multi-directionals MVs of P and B-Frames using @command{ffplay}:
@example
ffplay -flags2 +export_mvs input.mp4 -vf codecview=mv=pf+bf+bb
@end example
@end itemize

@section colorbalance
Modify intensity of primary colors (red, green and blue) of input frames.

The filter allows an input frame to be adjusted in the shadows, midtones or highlights
regions for the red-cyan, green-magenta or blue-yellow balance.

A positive adjustment value shifts the balance towards the primary color, a negative
value towards the complementary color.

The filter accepts the following options:

@table @option
@item rs
@item gs
@item bs
Adjust red, green and blue shadows (darkest pixels).

@item rm
@item gm
@item bm
Adjust red, green and blue midtones (medium pixels).

@item rh
@item gh
@item bh
Adjust red, green and blue highlights (brightest pixels).

Allowed ranges for options are @code{[-1.0, 1.0]}. Defaults are @code{0}.
@end table

@subsection Examples

@itemize
@item
Add red color cast to shadows:
@example
colorbalance=rs=.3
@end example
@end itemize

@section colorkey
RGB colorspace color keying.

The filter accepts the following options:

@table @option
@item color
The color which will be replaced with transparency.

@item similarity
Similarity percentage with the key color.

0.01 matches only the exact key color, while 1.0 matches everything.

@item blend
Blend percentage.

0.0 makes pixels either fully transparent, or not transparent at all.

Higher values result in semi-transparent pixels, with a higher transparency
the more similar the pixels color is to the key color.
@end table

@subsection Examples

@itemize
@item
Make every green pixel in the input image transparent:
@example
ffmpeg -i input.png -vf colorkey=green out.png
@end example

@item
Overlay a greenscreen-video on top of a static background image.
@example
ffmpeg -i background.png -i video.mp4 -filter_complex "[1:v]colorkey=0x3BBD1E:0.3:0.2[ckout];[0:v][ckout]overlay[out]" -map "[out]" output.flv
@end example
@end itemize

@section colorlevels

Adjust video input frames using levels.

The filter accepts the following options:

@table @option
@item rimin
@item gimin
@item bimin
@item aimin
Adjust red, green, blue and alpha input black point.
Allowed ranges for options are @code{[-1.0, 1.0]}. Defaults are @code{0}.

@item rimax
@item gimax
@item bimax
@item aimax
Adjust red, green, blue and alpha input white point.
Allowed ranges for options are @code{[-1.0, 1.0]}. Defaults are @code{1}.

Input levels are used to lighten highlights (bright tones), darken shadows
(dark tones), change the balance of bright and dark tones.

@item romin
@item gomin
@item bomin
@item aomin
Adjust red, green, blue and alpha output black point.
Allowed ranges for options are @code{[0, 1.0]}. Defaults are @code{0}.

@item romax
@item gomax
@item bomax
@item aomax
Adjust red, green, blue and alpha output white point.
Allowed ranges for options are @code{[0, 1.0]}. Defaults are @code{1}.

Output levels allows manual selection of a constrained output level range.
@end table

@subsection Examples

@itemize
@item
Make video output darker:
@example
colorlevels=rimin=0.058:gimin=0.058:bimin=0.058
@end example

@item
Increase contrast:
@example
colorlevels=rimin=0.039:gimin=0.039:bimin=0.039:rimax=0.96:gimax=0.96:bimax=0.96
@end example

@item
Make video output lighter:
@example
colorlevels=rimax=0.902:gimax=0.902:bimax=0.902
@end example

@item
Increase brightness:
@example
colorlevels=romin=0.5:gomin=0.5:bomin=0.5
@end example
@end itemize

@section colorchannelmixer

Adjust video input frames by re-mixing color channels.

This filter modifies a color channel by adding the values associated to
the other channels of the same pixels. For example if the value to
modify is red, the output value will be:
@example
@var{red}=@var{red}*@var{rr} + @var{blue}*@var{rb} + @var{green}*@var{rg} + @var{alpha}*@var{ra}
@end example

The filter accepts the following options:

@table @option
@item rr
@item rg
@item rb
@item ra
Adjust contribution of input red, green, blue and alpha channels for output red channel.
Default is @code{1} for @var{rr}, and @code{0} for @var{rg}, @var{rb} and @var{ra}.

@item gr
@item gg
@item gb
@item ga
Adjust contribution of input red, green, blue and alpha channels for output green channel.
Default is @code{1} for @var{gg}, and @code{0} for @var{gr}, @var{gb} and @var{ga}.

@item br
@item bg
@item bb
@item ba
Adjust contribution of input red, green, blue and alpha channels for output blue channel.
Default is @code{1} for @var{bb}, and @code{0} for @var{br}, @var{bg} and @var{ba}.

@item ar
@item ag
@item ab
@item aa
Adjust contribution of input red, green, blue and alpha channels for output alpha channel.
Default is @code{1} for @var{aa}, and @code{0} for @var{ar}, @var{ag} and @var{ab}.

Allowed ranges for options are @code{[-2.0, 2.0]}.
@end table

@subsection Examples

@itemize
@item
Convert source to grayscale:
@example
colorchannelmixer=.3:.4:.3:0:.3:.4:.3:0:.3:.4:.3
@end example
@item
Simulate sepia tones:
@example
colorchannelmixer=.393:.769:.189:0:.349:.686:.168:0:.272:.534:.131
@end example
@end itemize

@section colormatrix

Convert color matrix.

The filter accepts the following options:

@table @option
@item src
@item dst
Specify the source and destination color matrix. Both values must be
specified.

The accepted values are:
@table @samp
@item bt709
BT.709

@item fcc
FCC

@item bt601
BT.601

@item bt470
BT.470

@item bt470bg
BT.470BG

@item smpte170m
SMPTE-170M

@item smpte240m
SMPTE-240M

@item bt2020
BT.2020
@end table
@end table

For example to convert from BT.601 to SMPTE-240M, use the command:
@example
colormatrix=bt601:smpte240m
@end example

@section colorspace

Convert colorspace, transfer characteristics or color primaries.
Input video needs to have an even size.

The filter accepts the following options:

@table @option
@anchor{all}
@item all
Specify all color properties at once.

The accepted values are:
@table @samp
@item bt470m
BT.470M

@item bt470bg
BT.470BG

@item bt601-6-525
BT.601-6 525

@item bt601-6-625
BT.601-6 625

@item bt709
BT.709

@item smpte170m
SMPTE-170M

@item smpte240m
SMPTE-240M

@item bt2020
BT.2020

@end table

@anchor{space}
@item space
Specify output colorspace.

The accepted values are:
@table @samp
@item bt709
BT.709

@item fcc
FCC

@item bt470bg
BT.470BG or BT.601-6 625

@item smpte170m
SMPTE-170M or BT.601-6 525

@item smpte240m
SMPTE-240M

@item ycgco
YCgCo

@item bt2020ncl
BT.2020 with non-constant luminance

@end table

@anchor{trc}
@item trc
Specify output transfer characteristics.

The accepted values are:
@table @samp
@item bt709
BT.709

@item bt470m
BT.470M

@item bt470bg
BT.470BG

@item gamma22
Constant gamma of 2.2

@item gamma28
Constant gamma of 2.8

@item smpte170m
SMPTE-170M, BT.601-6 625 or BT.601-6 525

@item smpte240m
SMPTE-240M

@item srgb
SRGB

@item iec61966-2-1
iec61966-2-1

@item iec61966-2-4
iec61966-2-4

@item xvycc
xvycc

@item bt2020-10
BT.2020 for 10-bits content

@item bt2020-12
BT.2020 for 12-bits content

@end table

@anchor{primaries}
@item primaries
Specify output color primaries.

The accepted values are:
@table @samp
@item bt709
BT.709

@item bt470m
BT.470M

@item bt470bg
BT.470BG or BT.601-6 625

@item smpte170m
SMPTE-170M or BT.601-6 525

@item smpte240m
SMPTE-240M

@item film
film

@item smpte431
SMPTE-431

@item smpte432
SMPTE-432

@item bt2020
BT.2020

@item jedec-p22
JEDEC P22 phosphors

@end table

@anchor{range}
@item range
Specify output color range.

The accepted values are:
@table @samp
@item tv
TV (restricted) range

@item mpeg
MPEG (restricted) range

@item pc
PC (full) range

@item jpeg
JPEG (full) range

@end table

@item format
Specify output color format.

The accepted values are:
@table @samp
@item yuv420p
YUV 4:2:0 planar 8-bits

@item yuv420p10
YUV 4:2:0 planar 10-bits

@item yuv420p12
YUV 4:2:0 planar 12-bits

@item yuv422p
YUV 4:2:2 planar 8-bits

@item yuv422p10
YUV 4:2:2 planar 10-bits

@item yuv422p12
YUV 4:2:2 planar 12-bits

@item yuv444p
YUV 4:4:4 planar 8-bits

@item yuv444p10
YUV 4:4:4 planar 10-bits

@item yuv444p12
YUV 4:4:4 planar 12-bits

@end table

@item fast
Do a fast conversion, which skips gamma/primary correction. This will take
significantly less CPU, but will be mathematically incorrect. To get output
compatible with that produced by the colormatrix filter, use fast=1.

@item dither
Specify dithering mode.

The accepted values are:
@table @samp
@item none
No dithering

@item fsb
Floyd-Steinberg dithering
@end table

@item wpadapt
Whitepoint adaptation mode.

The accepted values are:
@table @samp
@item bradford
Bradford whitepoint adaptation

@item vonkries
von Kries whitepoint adaptation

@item identity
identity whitepoint adaptation (i.e. no whitepoint adaptation)
@end table

@item iall
Override all input properties at once. Same accepted values as @ref{all}.

@item ispace
Override input colorspace. Same accepted values as @ref{space}.

@item iprimaries
Override input color primaries. Same accepted values as @ref{primaries}.

@item itrc
Override input transfer characteristics. Same accepted values as @ref{trc}.

@item irange
Override input color range. Same accepted values as @ref{range}.

@end table

The filter converts the transfer characteristics, color space and color
primaries to the specified user values. The output value, if not specified,
is set to a default value based on the "all" property. If that property is
also not specified, the filter will log an error. The output color range and
format default to the same value as the input color range and format. The
input transfer characteristics, color space, color primaries and color range
should be set on the input data. If any of these are missing, the filter will
log an error and no conversion will take place.

For example to convert the input to SMPTE-240M, use the command:
@example
colorspace=smpte240m
@end example

@section convolution

Apply convolution 3x3, 5x5 or 7x7 filter.

The filter accepts the following options:

@table @option
@item 0m
@item 1m
@item 2m
@item 3m
Set matrix for each plane.
Matrix is sequence of 9, 25 or 49 signed integers.

@item 0rdiv
@item 1rdiv
@item 2rdiv
@item 3rdiv
Set multiplier for calculated value for each plane.

@item 0bias
@item 1bias
@item 2bias
@item 3bias
Set bias for each plane. This value is added to the result of the multiplication.
Useful for making the overall image brighter or darker. Default is 0.0.
@end table

@subsection Examples

@itemize
@item
Apply sharpen:
@example
convolution="0 -1 0 -1 5 -1 0 -1 0:0 -1 0 -1 5 -1 0 -1 0:0 -1 0 -1 5 -1 0 -1 0:0 -1 0 -1 5 -1 0 -1 0"
@end example

@item
Apply blur:
@example
convolution="1 1 1 1 1 1 1 1 1:1 1 1 1 1 1 1 1 1:1 1 1 1 1 1 1 1 1:1 1 1 1 1 1 1 1 1:1/9:1/9:1/9:1/9"
@end example

@item
Apply edge enhance:
@example
convolution="0 0 0 -1 1 0 0 0 0:0 0 0 -1 1 0 0 0 0:0 0 0 -1 1 0 0 0 0:0 0 0 -1 1 0 0 0 0:5:1:1:1:0:128:128:128"
@end example

@item
Apply edge detect:
@example
convolution="0 1 0 1 -4 1 0 1 0:0 1 0 1 -4 1 0 1 0:0 1 0 1 -4 1 0 1 0:0 1 0 1 -4 1 0 1 0:5:5:5:1:0:128:128:128"
@end example

@item
Apply laplacian edge detector which includes diagonals:
@example
convolution="1 1 1 1 -8 1 1 1 1:1 1 1 1 -8 1 1 1 1:1 1 1 1 -8 1 1 1 1:1 1 1 1 -8 1 1 1 1:5:5:5:1:0:128:128:0"
@end example

@item
Apply emboss:
@example
convolution="-2 -1 0 -1 1 1 0 1 2:-2 -1 0 -1 1 1 0 1 2:-2 -1 0 -1 1 1 0 1 2:-2 -1 0 -1 1 1 0 1 2"
@end example
@end itemize

@section convolve

Apply 2D convolution of video stream in frequency domain using second stream
as impulse.

The filter accepts the following options:

@table @option
@item planes
Set which planes to process.

@item impulse
Set which impulse video frames will be processed, can be @var{first}
or @var{all}. Default is @var{all}.
@end table

The @code{convolve} filter also supports the @ref{framesync} options.

@section copy

Copy the input video source unchanged to the output. This is mainly useful for
testing purposes.

@anchor{coreimage}
@section coreimage
Video filtering on GPU using Apple's CoreImage API on OSX.

Hardware acceleration is based on an OpenGL context. Usually, this means it is
processed by video hardware. However, software-based OpenGL implementations
exist which means there is no guarantee for hardware processing. It depends on
the respective OSX.

There are many filters and image generators provided by Apple that come with a
large variety of options. The filter has to be referenced by its name along
with its options.

The coreimage filter accepts the following options:
@table @option
@item list_filters
List all available filters and generators along with all their respective
options as well as possible minimum and maximum values along with the default
values.
@example
list_filters=true
@end example

@item filter
Specify all filters by their respective name and options.
Use @var{list_filters} to determine all valid filter names and options.
Numerical options are specified by a float value and are automatically clamped
to their respective value range.  Vector and color options have to be specified
by a list of space separated float values. Character escaping has to be done.
A special option name @code{default} is available to use default options for a
filter.

It is required to specify either @code{default} or at least one of the filter options.
All omitted options are used with their default values.
The syntax of the filter string is as follows:
@example
filter=<NAME>@@<OPTION>=<VALUE>[@@<OPTION>=<VALUE>][@@...][#<NAME>@@<OPTION>=<VALUE>[@@<OPTION>=<VALUE>][@@...]][#...]
@end example

@item output_rect
Specify a rectangle where the output of the filter chain is copied into the
input image. It is given by a list of space separated float values:
@example
output_rect=x\ y\ width\ height
@end example
If not given, the output rectangle equals the dimensions of the input image.
The output rectangle is automatically cropped at the borders of the input
image. Negative values are valid for each component.
@example
output_rect=25\ 25\ 100\ 100
@end example
@end table

Several filters can be chained for successive processing without GPU-HOST
transfers allowing for fast processing of complex filter chains.
Currently, only filters with zero (generators) or exactly one (filters) input
image and one output image are supported. Also, transition filters are not yet
usable as intended.

Some filters generate output images with additional padding depending on the
respective filter kernel. The padding is automatically removed to ensure the
filter output has the same size as the input image.

For image generators, the size of the output image is determined by the
previous output image of the filter chain or the input image of the whole
filterchain, respectively. The generators do not use the pixel information of
this image to generate their output. However, the generated output is
blended onto this image, resulting in partial or complete coverage of the
output image.

The @ref{coreimagesrc} video source can be used for generating input images
which are directly fed into the filter chain. By using it, providing input
images by another video source or an input video is not required.

@subsection Examples

@itemize

@item
List all filters available:
@example
coreimage=list_filters=true
@end example

@item
Use the CIBoxBlur filter with default options to blur an image:
@example
coreimage=filter=CIBoxBlur@@default
@end example

@item
Use a filter chain with CISepiaTone at default values and CIVignetteEffect with
its center at 100x100 and a radius of 50 pixels:
@example
coreimage=filter=CIBoxBlur@@default#CIVignetteEffect@@inputCenter=100\ 100@@inputRadius=50
@end example

@item
Use nullsrc and CIQRCodeGenerator to create a QR code for the FFmpeg homepage,
given as complete and escaped command-line for Apple's standard bash shell:
@example
ffmpeg -f lavfi -i nullsrc=s=100x100,coreimage=filter=CIQRCodeGenerator@@inputMessage=https\\\\\://FFmpeg.org/@@inputCorrectionLevel=H -frames:v 1 QRCode.png
@end example
@end itemize

@section crop

Crop the input video to given dimensions.

It accepts the following parameters:

@table @option
@item w, out_w
The width of the output video. It defaults to @code{iw}.
This expression is evaluated only once during the filter
configuration, or when the @samp{w} or @samp{out_w} command is sent.

@item h, out_h
The height of the output video. It defaults to @code{ih}.
This expression is evaluated only once during the filter
configuration, or when the @samp{h} or @samp{out_h} command is sent.

@item x
The horizontal position, in the input video, of the left edge of the output
video. It defaults to @code{(in_w-out_w)/2}.
This expression is evaluated per-frame.

@item y
The vertical position, in the input video, of the top edge of the output video.
It defaults to @code{(in_h-out_h)/2}.
This expression is evaluated per-frame.

@item keep_aspect
If set to 1 will force the output display aspect ratio
to be the same of the input, by changing the output sample aspect
ratio. It defaults to 0.

@item exact
Enable exact cropping. If enabled, subsampled videos will be cropped at exact
width/height/x/y as specified and will not be rounded to nearest smaller value.
It defaults to 0.
@end table

The @var{out_w}, @var{out_h}, @var{x}, @var{y} parameters are
expressions containing the following constants:

@table @option
@item x
@item y
The computed values for @var{x} and @var{y}. They are evaluated for
each new frame.

@item in_w
@item in_h
The input width and height.

@item iw
@item ih
These are the same as @var{in_w} and @var{in_h}.

@item out_w
@item out_h
The output (cropped) width and height.

@item ow
@item oh
These are the same as @var{out_w} and @var{out_h}.

@item a
same as @var{iw} / @var{ih}

@item sar
input sample aspect ratio

@item dar
input display aspect ratio, it is the same as (@var{iw} / @var{ih}) * @var{sar}

@item hsub
@item vsub
horizontal and vertical chroma subsample values. For example for the
pixel format "yuv422p" @var{hsub} is 2 and @var{vsub} is 1.

@item n
The number of the input frame, starting from 0.

@item pos
the position in the file of the input frame, NAN if unknown

@item t
The timestamp expressed in seconds. It's NAN if the input timestamp is unknown.

@end table

The expression for @var{out_w} may depend on the value of @var{out_h},
and the expression for @var{out_h} may depend on @var{out_w}, but they
cannot depend on @var{x} and @var{y}, as @var{x} and @var{y} are
evaluated after @var{out_w} and @var{out_h}.

The @var{x} and @var{y} parameters specify the expressions for the
position of the top-left corner of the output (non-cropped) area. They
are evaluated for each frame. If the evaluated value is not valid, it
is approximated to the nearest valid value.

The expression for @var{x} may depend on @var{y}, and the expression
for @var{y} may depend on @var{x}.

@subsection Examples

@itemize
@item
Crop area with size 100x100 at position (12,34).
@example
crop=100:100:12:34
@end example

Using named options, the example above becomes:
@example
crop=w=100:h=100:x=12:y=34
@end example

@item
Crop the central input area with size 100x100:
@example
crop=100:100
@end example

@item
Crop the central input area with size 2/3 of the input video:
@example
crop=2/3*in_w:2/3*in_h
@end example

@item
Crop the input video central square:
@example
crop=out_w=in_h
crop=in_h
@end example

@item
Delimit the rectangle with the top-left corner placed at position
100:100 and the right-bottom corner corresponding to the right-bottom
corner of the input image.
@example
crop=in_w-100:in_h-100:100:100
@end example

@item
Crop 10 pixels from the left and right borders, and 20 pixels from
the top and bottom borders
@example
crop=in_w-2*10:in_h-2*20
@end example

@item
Keep only the bottom right quarter of the input image:
@example
crop=in_w/2:in_h/2:in_w/2:in_h/2
@end example

@item
Crop height for getting Greek harmony:
@example
crop=in_w:1/PHI*in_w
@end example

@item
Apply trembling effect:
@example
crop=in_w/2:in_h/2:(in_w-out_w)/2+((in_w-out_w)/2)*sin(n/10):(in_h-out_h)/2 +((in_h-out_h)/2)*sin(n/7)
@end example

@item
Apply erratic camera effect depending on timestamp:
@example
crop=in_w/2:in_h/2:(in_w-out_w)/2+((in_w-out_w)/2)*sin(t*10):(in_h-out_h)/2 +((in_h-out_h)/2)*sin(t*13)"
@end example

@item
Set x depending on the value of y:
@example
crop=in_w/2:in_h/2:y:10+10*sin(n/10)
@end example
@end itemize

@subsection Commands

This filter supports the following commands:
@table @option
@item w, out_w
@item h, out_h
@item x
@item y
Set width/height of the output video and the horizontal/vertical position
in the input video.
The command accepts the same syntax of the corresponding option.

If the specified expression is not valid, it is kept at its current
value.
@end table

@section cropdetect

Auto-detect the crop size.

It calculates the necessary cropping parameters and prints the
recommended parameters via the logging system. The detected dimensions
correspond to the non-black area of the input video.

It accepts the following parameters:

@table @option

@item limit
Set higher black value threshold, which can be optionally specified
from nothing (0) to everything (255 for 8-bit based formats). An intensity
value greater to the set value is considered non-black. It defaults to 24.
You can also specify a value between 0.0 and 1.0 which will be scaled depending
on the bitdepth of the pixel format.

@item round
The value which the width/height should be divisible by. It defaults to
16. The offset is automatically adjusted to center the video. Use 2 to
get only even dimensions (needed for 4:2:2 video). 16 is best when
encoding to most video codecs.

@item reset_count, reset
Set the counter that determines after how many frames cropdetect will
reset the previously detected largest video area and start over to
detect the current optimal crop area. Default value is 0.

This can be useful when channel logos distort the video area. 0
indicates 'never reset', and returns the largest area encountered during
playback.
@end table

@anchor{curves}
@section curves

Apply color adjustments using curves.

This filter is similar to the Adobe Photoshop and GIMP curves tools. Each
component (red, green and blue) has its values defined by @var{N} key points
tied from each other using a smooth curve. The x-axis represents the pixel
values from the input frame, and the y-axis the new pixel values to be set for
the output frame.

By default, a component curve is defined by the two points @var{(0;0)} and
@var{(1;1)}. This creates a straight line where each original pixel value is
"adjusted" to its own value, which means no change to the image.

The filter allows you to redefine these two points and add some more. A new
curve (using a natural cubic spline interpolation) will be define to pass
smoothly through all these new coordinates. The new defined points needs to be
strictly increasing over the x-axis, and their @var{x} and @var{y} values must
be in the @var{[0;1]} interval.  If the computed curves happened to go outside
the vector spaces, the values will be clipped accordingly.

The filter accepts the following options:

@table @option
@item preset
Select one of the available color presets. This option can be used in addition
to the @option{r}, @option{g}, @option{b} parameters; in this case, the later
options takes priority on the preset values.
Available presets are:
@table @samp
@item none
@item color_negative
@item cross_process
@item darker
@item increase_contrast
@item lighter
@item linear_contrast
@item medium_contrast
@item negative
@item strong_contrast
@item vintage
@end table
Default is @code{none}.
@item master, m
Set the master key points. These points will define a second pass mapping. It
is sometimes called a "luminance" or "value" mapping. It can be used with
@option{r}, @option{g}, @option{b} or @option{all} since it acts like a
post-processing LUT.
@item red, r
Set the key points for the red component.
@item green, g
Set the key points for the green component.
@item blue, b
Set the key points for the blue component.
@item all
Set the key points for all components (not including master).
Can be used in addition to the other key points component
options. In this case, the unset component(s) will fallback on this
@option{all} setting.
@item psfile
Specify a Photoshop curves file (@code{.acv}) to import the settings from.
@item plot
Save Gnuplot script of the curves in specified file.
@end table

To avoid some filtergraph syntax conflicts, each key points list need to be
defined using the following syntax: @code{x0/y0 x1/y1 x2/y2 ...}.

@subsection Examples

@itemize
@item
Increase slightly the middle level of blue:
@example
curves=blue='0/0 0.5/0.58 1/1'
@end example

@item
Vintage effect:
@example
curves=r='0/0.11 .42/.51 1/0.95':g='0/0 0.50/0.48 1/1':b='0/0.22 .49/.44 1/0.8'
@end example
Here we obtain the following coordinates for each components:
@table @var
@item red
@code{(0;0.11) (0.42;0.51) (1;0.95)}
@item green
@code{(0;0) (0.50;0.48) (1;1)}
@item blue
@code{(0;0.22) (0.49;0.44) (1;0.80)}
@end table

@item
The previous example can also be achieved with the associated built-in preset:
@example
curves=preset=vintage
@end example

@item
Or simply:
@example
curves=vintage
@end example

@item
Use a Photoshop preset and redefine the points of the green component:
@example
curves=psfile='MyCurvesPresets/purple.acv':green='0/0 0.45/0.53 1/1'
@end example

@item
Check out the curves of the @code{cross_process} profile using @command{ffmpeg}
and @command{gnuplot}:
@example
ffmpeg -f lavfi -i color -vf curves=cross_process:plot=/tmp/curves.plt -frames:v 1 -f null -
gnuplot -p /tmp/curves.plt
@end example
@end itemize

@section datascope

Video data analysis filter.

This filter shows hexadecimal pixel values of part of video.

The filter accepts the following options:

@table @option
@item size, s
Set output video size.

@item x
Set x offset from where to pick pixels.

@item y
Set y offset from where to pick pixels.

@item mode
Set scope mode, can be one of the following:
@table @samp
@item mono
Draw hexadecimal pixel values with white color on black background.

@item color
Draw hexadecimal pixel values with input video pixel color on black
background.

@item color2
Draw hexadecimal pixel values on color background picked from input video,
the text color is picked in such way so its always visible.
@end table

@item axis
Draw rows and columns numbers on left and top of video.

@item opacity
Set background opacity.
@end table

@section dctdnoiz

Denoise frames using 2D DCT (frequency domain filtering).

This filter is not designed for real time.

The filter accepts the following options:

@table @option
@item sigma, s
Set the noise sigma constant.

This @var{sigma} defines a hard threshold of @code{3 * sigma}; every DCT
coefficient (absolute value) below this threshold with be dropped.

If you need a more advanced filtering, see @option{expr}.

Default is @code{0}.

@item overlap
Set number overlapping pixels for each block. Since the filter can be slow, you
may want to reduce this value, at the cost of a less effective filter and the
risk of various artefacts.

If the overlapping value doesn't permit processing the whole input width or
height, a warning will be displayed and according borders won't be denoised.

Default value is @var{blocksize}-1, which is the best possible setting.

@item expr, e
Set the coefficient factor expression.

For each coefficient of a DCT block, this expression will be evaluated as a
multiplier value for the coefficient.

If this is option is set, the @option{sigma} option will be ignored.

The absolute value of the coefficient can be accessed through the @var{c}
variable.

@item n
Set the @var{blocksize} using the number of bits. @code{1<<@var{n}} defines the
@var{blocksize}, which is the width and height of the processed blocks.

The default value is @var{3} (8x8) and can be raised to @var{4} for a
@var{blocksize} of 16x16. Note that changing this setting has huge consequences
on the speed processing. Also, a larger block size does not necessarily means a
better de-noising.
@end table

@subsection Examples

Apply a denoise with a @option{sigma} of @code{4.5}:
@example
dctdnoiz=4.5
@end example

The same operation can be achieved using the expression system:
@example
dctdnoiz=e='gte(c, 4.5*3)'
@end example

Violent denoise using a block size of @code{16x16}:
@example
dctdnoiz=15:n=4
@end example

@section deband

Remove banding artifacts from input video.
It works by replacing banded pixels with average value of referenced pixels.

The filter accepts the following options:

@table @option
@item 1thr
@item 2thr
@item 3thr
@item 4thr
Set banding detection threshold for each plane. Default is 0.02.
Valid range is 0.00003 to 0.5.
If difference between current pixel and reference pixel is less than threshold,
it will be considered as banded.

@item range, r
Banding detection range in pixels. Default is 16. If positive, random number
in range 0 to set value will be used. If negative, exact absolute value
will be used.
The range defines square of four pixels around current pixel.

@item direction, d
Set direction in radians from which four pixel will be compared. If positive,
random direction from 0 to set direction will be picked. If negative, exact of
absolute value will be picked. For example direction 0, -PI or -2*PI radians
will pick only pixels on same row and -PI/2 will pick only pixels on same
column.

@item blur, b
If enabled, current pixel is compared with average value of all four
surrounding pixels. The default is enabled. If disabled current pixel is
compared with all four surrounding pixels. The pixel is considered banded
if only all four differences with surrounding pixels are less than threshold.

@item coupling, c
If enabled, current pixel is changed if and only if all pixel components are banded,
e.g. banding detection threshold is triggered for all color components.
The default is disabled.
@end table

@anchor{decimate}
@section decimate

Drop duplicated frames at regular intervals.

The filter accepts the following options:

@table @option
@item cycle
Set the number of frames from which one will be dropped. Setting this to
@var{N} means one frame in every batch of @var{N} frames will be dropped.
Default is @code{5}.

@item dupthresh
Set the threshold for duplicate detection. If the difference metric for a frame
is less than or equal to this value, then it is declared as duplicate. Default
is @code{1.1}

@item scthresh
Set scene change threshold. Default is @code{15}.

@item blockx
@item blocky
Set the size of the x and y-axis blocks used during metric calculations.
Larger blocks give better noise suppression, but also give worse detection of
small movements. Must be a power of two. Default is @code{32}.

@item ppsrc
Mark main input as a pre-processed input and activate clean source input
stream. This allows the input to be pre-processed with various filters to help
the metrics calculation while keeping the frame selection lossless. When set to
@code{1}, the first stream is for the pre-processed input, and the second
stream is the clean source from where the kept frames are chosen. Default is
@code{0}.

@item chroma
Set whether or not chroma is considered in the metric calculations. Default is
@code{1}.
@end table

@section deconvolve

Apply 2D deconvolution of video stream in frequency domain using second stream
as impulse.

The filter accepts the following options:

@table @option
@item planes
Set which planes to process.

@item impulse
Set which impulse video frames will be processed, can be @var{first}
or @var{all}. Default is @var{all}.

@item noise
Set noise when doing divisions. Default is @var{0.0000001}. Useful when width
and height are not same and not power of 2 or if stream prior to convolving
had noise.
@end table

The @code{deconvolve} filter also supports the @ref{framesync} options.

@section deflate

Apply deflate effect to the video.

This filter replaces the pixel by the local(3x3) average by taking into account
only values lower than the pixel.

It accepts the following options:

@table @option
@item threshold0
@item threshold1
@item threshold2
@item threshold3
Limit the maximum change for each plane, default is 65535.
If 0, plane will remain unchanged.
@end table

@section deflicker

Remove temporal frame luminance variations.

It accepts the following options:

@table @option
@item size, s
Set moving-average filter size in frames. Default is 5. Allowed range is 2 - 129.

@item mode, m
Set averaging mode to smooth temporal luminance variations.

Available values are:
@table @samp
@item am
Arithmetic mean

@item gm
Geometric mean

@item hm
Harmonic mean

@item qm
Quadratic mean

@item cm
Cubic mean

@item pm
Power mean

@item median
Median
@end table

@item bypass
Do not actually modify frame. Useful when one only wants metadata.
@end table

@section dejudder

Remove judder produced by partially interlaced telecined content.

Judder can be introduced, for instance, by @ref{pullup} filter. If the original
source was partially telecined content then the output of @code{pullup,dejudder}
will have a variable frame rate. May change the recorded frame rate of the
container. Aside from that change, this filter will not affect constant frame
rate video.

The option available in this filter is:
@table @option

@item cycle
Specify the length of the window over which the judder repeats.

Accepts any integer greater than 1. Useful values are:
@table @samp

@item 4
If the original was telecined from 24 to 30 fps (Film to NTSC).

@item 5
If the original was telecined from 25 to 30 fps (PAL to NTSC).

@item 20
If a mixture of the two.
@end table

The default is @samp{4}.
@end table

@section delogo

Suppress a TV station logo by a simple interpolation of the surrounding
pixels. Just set a rectangle covering the logo and watch it disappear
(and sometimes something even uglier appear - your mileage may vary).

It accepts the following parameters:
@table @option

@item x
@item y
Specify the top left corner coordinates of the logo. They must be
specified.

@item w
@item h
Specify the width and height of the logo to clear. They must be
specified.

@item band, t
Specify the thickness of the fuzzy edge of the rectangle (added to
@var{w} and @var{h}). The default value is 1. This option is
deprecated, setting higher values should no longer be necessary and
is not recommended.

@item show
When set to 1, a green rectangle is drawn on the screen to simplify
finding the right @var{x}, @var{y}, @var{w}, and @var{h} parameters.
The default value is 0.

The rectangle is drawn on the outermost pixels which will be (partly)
replaced with interpolated values. The values of the next pixels
immediately outside this rectangle in each direction will be used to
compute the interpolated pixel values inside the rectangle.

@end table

@subsection Examples

@itemize
@item
Set a rectangle covering the area with top left corner coordinates 0,0
and size 100x77, and a band of size 10:
@example
delogo=x=0:y=0:w=100:h=77:band=10
@end example

@end itemize

@section deshake

Attempt to fix small changes in horizontal and/or vertical shift. This
filter helps remove camera shake from hand-holding a camera, bumping a
tripod, moving on a vehicle, etc.

The filter accepts the following options:

@table @option

@item x
@item y
@item w
@item h
Specify a rectangular area where to limit the search for motion
vectors.
If desired the search for motion vectors can be limited to a
rectangular area of the frame defined by its top left corner, width
and height. These parameters have the same meaning as the drawbox
filter which can be used to visualise the position of the bounding
box.

This is useful when simultaneous movement of subjects within the frame
might be confused for camera motion by the motion vector search.

If any or all of @var{x}, @var{y}, @var{w} and @var{h} are set to -1
then the full frame is used. This allows later options to be set
without specifying the bounding box for the motion vector search.

Default - search the whole frame.

@item rx
@item ry
Specify the maximum extent of movement in x and y directions in the
range 0-64 pixels. Default 16.

@item edge
Specify how to generate pixels to fill blanks at the edge of the
frame. Available values are:
@table @samp
@item blank, 0
Fill zeroes at blank locations
@item original, 1
Original image at blank locations
@item clamp, 2
Extruded edge value at blank locations
@item mirror, 3
Mirrored edge at blank locations
@end table
Default value is @samp{mirror}.

@item blocksize
Specify the blocksize to use for motion search. Range 4-128 pixels,
default 8.

@item contrast
Specify the contrast threshold for blocks. Only blocks with more than
the specified contrast (difference between darkest and lightest
pixels) will be considered. Range 1-255, default 125.

@item search
Specify the search strategy. Available values are:
@table @samp
@item exhaustive, 0
Set exhaustive search
@item less, 1
Set less exhaustive search.
@end table
Default value is @samp{exhaustive}.

@item filename
If set then a detailed log of the motion search is written to the
specified file.

@end table

@section despill

Remove unwanted contamination of foreground colors, caused by reflected color of
greenscreen or bluescreen.

This filter accepts the following options:

@table @option
@item type
Set what type of despill to use.

@item mix
Set how spillmap will be generated.

@item expand
Set how much to get rid of still remaining spill.

@item red
Controls amount of red in spill area.

@item green
Controls amount of green in spill area.
Should be -1 for greenscreen.

@item blue
Controls amount of blue in spill area.
Should be -1 for bluescreen.

@item brightness
Controls brightness of spill area, preserving colors.

@item alpha
Modify alpha from generated spillmap.
@end table

@section detelecine

Apply an exact inverse of the telecine operation. It requires a predefined
pattern specified using the pattern option which must be the same as that passed
to the telecine filter.

This filter accepts the following options:

@table @option
@item first_field
@table @samp
@item top, t
top field first
@item bottom, b
bottom field first
The default value is @code{top}.
@end table

@item pattern
A string of numbers representing the pulldown pattern you wish to apply.
The default value is @code{23}.

@item start_frame
A number representing position of the first frame with respect to the telecine
pattern. This is to be used if the stream is cut. The default value is @code{0}.
@end table

@section dilation

Apply dilation effect to the video.

This filter replaces the pixel by the local(3x3) maximum.

It accepts the following options:

@table @option
@item threshold0
@item threshold1
@item threshold2
@item threshold3
Limit the maximum change for each plane, default is 65535.
If 0, plane will remain unchanged.

@item coordinates
Flag which specifies the pixel to refer to. Default is 255 i.e. all eight
pixels are used.

Flags to local 3x3 coordinates maps like this:

    1 2 3
    4   5
    6 7 8
@end table

@section displace

Displace pixels as indicated by second and third input stream.

It takes three input streams and outputs one stream, the first input is the
source, and second and third input are displacement maps.

The second input specifies how much to displace pixels along the
x-axis, while the third input specifies how much to displace pixels
along the y-axis.
If one of displacement map streams terminates, last frame from that
displacement map will be used.

Note that once generated, displacements maps can be reused over and over again.

A description of the accepted options follows.

@table @option
@item edge
Set displace behavior for pixels that are out of range.

Available values are:
@table @samp
@item blank
Missing pixels are replaced by black pixels.

@item smear
Adjacent pixels will spread out to replace missing pixels.

@item wrap
Out of range pixels are wrapped so they point to pixels of other side.

@item mirror
Out of range pixels will be replaced with mirrored pixels.
@end table
Default is @samp{smear}.

@end table

@subsection Examples

@itemize
@item
Add ripple effect to rgb input of video size hd720:
@example
ffmpeg -i INPUT -f lavfi -i nullsrc=s=hd720,lutrgb=128:128:128 -f lavfi -i nullsrc=s=hd720,geq='r=128+30*sin(2*PI*X/400+T):g=128+30*sin(2*PI*X/400+T):b=128+30*sin(2*PI*X/400+T)' -lavfi '[0][1][2]displace' OUTPUT
@end example

@item
Add wave effect to rgb input of video size hd720:
@example
ffmpeg -i INPUT -f lavfi -i nullsrc=hd720,geq='r=128+80*(sin(sqrt((X-W/2)*(X-W/2)+(Y-H/2)*(Y-H/2))/220*2*PI+T)):g=128+80*(sin(sqrt((X-W/2)*(X-W/2)+(Y-H/2)*(Y-H/2))/220*2*PI+T)):b=128+80*(sin(sqrt((X-W/2)*(X-W/2)+(Y-H/2)*(Y-H/2))/220*2*PI+T))' -lavfi '[1]split[x][y],[0][x][y]displace' OUTPUT
@end example
@end itemize

@section drawbox

Draw a colored box on the input image.

It accepts the following parameters:

@table @option
@item x
@item y
The expressions which specify the top left corner coordinates of the box. It defaults to 0.

@item width, w
@item height, h
The expressions which specify the width and height of the box; if 0 they are interpreted as
the input width and height. It defaults to 0.

@item color, c
Specify the color of the box to write. For the general syntax of this option,
check the @ref{color syntax,,"Color" section in the ffmpeg-utils manual,ffmpeg-utils}. If the special
value @code{invert} is used, the box edge color is the same as the
video with inverted luma.

@item thickness, t
The expression which sets the thickness of the box edge.
A value of @code{fill} will create a filled box. Default value is @code{3}.

See below for the list of accepted constants.

@item replace
Applicable if the input has alpha. With value @code{1}, the pixels of the painted box
will overwrite the video's color and alpha pixels.
Default is @code{0}, which composites the box onto the input, leaving the video's alpha intact.
@end table

The parameters for @var{x}, @var{y}, @var{w} and @var{h} and @var{t} are expressions containing the
following constants:

@table @option
@item dar
The input display aspect ratio, it is the same as (@var{w} / @var{h}) * @var{sar}.

@item hsub
@item vsub
horizontal and vertical chroma subsample values. For example for the
pixel format "yuv422p" @var{hsub} is 2 and @var{vsub} is 1.

@item in_h, ih
@item in_w, iw
The input width and height.

@item sar
The input sample aspect ratio.

@item x
@item y
The x and y offset coordinates where the box is drawn.

@item w
@item h
The width and height of the drawn box.

@item t
The thickness of the drawn box.

These constants allow the @var{x}, @var{y}, @var{w}, @var{h} and @var{t} expressions to refer to
each other, so you may for example specify @code{y=x/dar} or @code{h=w/dar}.

@end table

@subsection Examples

@itemize
@item
Draw a black box around the edge of the input image:
@example
drawbox
@end example

@item
Draw a box with color red and an opacity of 50%:
@example
drawbox=10:20:200:60:red@@0.5
@end example

The previous example can be specified as:
@example
drawbox=x=10:y=20:w=200:h=60:color=red@@0.5
@end example

@item
Fill the box with pink color:
@example
drawbox=x=10:y=10:w=100:h=100:color=pink@@0.5:t=fill
@end example

@item
Draw a 2-pixel red 2.40:1 mask:
@example
drawbox=x=-t:y=0.5*(ih-iw/2.4)-t:w=iw+t*2:h=iw/2.4+t*2:t=2:c=red
@end example
@end itemize

@section drawgrid

Draw a grid on the input image.

It accepts the following parameters:

@table @option
@item x
@item y
The expressions which specify the coordinates of some point of grid intersection (meant to configure offset). Both default to 0.

@item width, w
@item height, h
The expressions which specify the width and height of the grid cell, if 0 they are interpreted as the
input width and height, respectively, minus @code{thickness}, so image gets
framed. Default to 0.

@item color, c
Specify the color of the grid. For the general syntax of this option,
check the @ref{color syntax,,"Color" section in the ffmpeg-utils manual,ffmpeg-utils}. If the special
value @code{invert} is used, the grid color is the same as the
video with inverted luma.

@item thickness, t
The expression which sets the thickness of the grid line. Default value is @code{1}.

See below for the list of accepted constants.

@item replace
Applicable if the input has alpha. With @code{1} the pixels of the painted grid
will overwrite the video's color and alpha pixels.
Default is @code{0}, which composites the grid onto the input, leaving the video's alpha intact.
@end table

The parameters for @var{x}, @var{y}, @var{w} and @var{h} and @var{t} are expressions containing the
following constants:

@table @option
@item dar
The input display aspect ratio, it is the same as (@var{w} / @var{h}) * @var{sar}.

@item hsub
@item vsub
horizontal and vertical chroma subsample values. For example for the
pixel format "yuv422p" @var{hsub} is 2 and @var{vsub} is 1.

@item in_h, ih
@item in_w, iw
The input grid cell width and height.

@item sar
The input sample aspect ratio.

@item x
@item y
The x and y coordinates of some point of grid intersection (meant to configure offset).

@item w
@item h
The width and height of the drawn cell.

@item t
The thickness of the drawn cell.

These constants allow the @var{x}, @var{y}, @var{w}, @var{h} and @var{t} expressions to refer to
each other, so you may for example specify @code{y=x/dar} or @code{h=w/dar}.

@end table

@subsection Examples

@itemize
@item
Draw a grid with cell 100x100 pixels, thickness 2 pixels, with color red and an opacity of 50%:
@example
drawgrid=width=100:height=100:thickness=2:color=red@@0.5
@end example

@item
Draw a white 3x3 grid with an opacity of 50%:
@example
drawgrid=w=iw/3:h=ih/3:t=2:c=white@@0.5
@end example
@end itemize

@anchor{drawtext}
@section drawtext

Draw a text string or text from a specified file on top of a video, using the
libfreetype library.

To enable compilation of this filter, you need to configure FFmpeg with
@code{--enable-libfreetype}.
To enable default font fallback and the @var{font} option you need to
configure FFmpeg with @code{--enable-libfontconfig}.
To enable the @var{text_shaping} option, you need to configure FFmpeg with
@code{--enable-libfribidi}.

@subsection Syntax

It accepts the following parameters:

@table @option

@item box
Used to draw a box around text using the background color.
The value must be either 1 (enable) or 0 (disable).
The default value of @var{box} is 0.

@item boxborderw
Set the width of the border to be drawn around the box using @var{boxcolor}.
The default value of @var{boxborderw} is 0.

@item boxcolor
The color to be used for drawing box around text. For the syntax of this
option, check the @ref{color syntax,,"Color" section in the ffmpeg-utils manual,ffmpeg-utils}.

The default value of @var{boxcolor} is "white".

@item line_spacing
Set the line spacing in pixels of the border to be drawn around the box using @var{box}.
The default value of @var{line_spacing} is 0.

@item borderw
Set the width of the border to be drawn around the text using @var{bordercolor}.
The default value of @var{borderw} is 0.

@item bordercolor
Set the color to be used for drawing border around text. For the syntax of this
option, check the @ref{color syntax,,"Color" section in the ffmpeg-utils manual,ffmpeg-utils}.

The default value of @var{bordercolor} is "black".

@item expansion
Select how the @var{text} is expanded. Can be either @code{none},
@code{strftime} (deprecated) or
@code{normal} (default). See the @ref{drawtext_expansion, Text expansion} section
below for details.

@item basetime
Set a start time for the count. Value is in microseconds. Only applied
in the deprecated strftime expansion mode. To emulate in normal expansion
mode use the @code{pts} function, supplying the start time (in seconds)
as the second argument.

@item fix_bounds
If true, check and fix text coords to avoid clipping.

@item fontcolor
The color to be used for drawing fonts. For the syntax of this option, check
the @ref{color syntax,,"Color" section in the ffmpeg-utils manual,ffmpeg-utils}.

The default value of @var{fontcolor} is "black".

@item fontcolor_expr
String which is expanded the same way as @var{text} to obtain dynamic
@var{fontcolor} value. By default this option has empty value and is not
processed. When this option is set, it overrides @var{fontcolor} option.

@item font
The font family to be used for drawing text. By default Sans.

@item fontfile
The font file to be used for drawing text. The path must be included.
This parameter is mandatory if the fontconfig support is disabled.

@item alpha
Draw the text applying alpha blending. The value can
be a number between 0.0 and 1.0.
The expression accepts the same variables @var{x, y} as well.
The default value is 1.
Please see @var{fontcolor_expr}.

@item fontsize
The font size to be used for drawing text.
The default value of @var{fontsize} is 16.

@item text_shaping
If set to 1, attempt to shape the text (for example, reverse the order of
right-to-left text and join Arabic characters) before drawing it.
Otherwise, just draw the text exactly as given.
By default 1 (if supported).

@item ft_load_flags
The flags to be used for loading the fonts.

The flags map the corresponding flags supported by libfreetype, and are
a combination of the following values:
@table @var
@item default
@item no_scale
@item no_hinting
@item render
@item no_bitmap
@item vertical_layout
@item force_autohint
@item crop_bitmap
@item pedantic
@item ignore_global_advance_width
@item no_recurse
@item ignore_transform
@item monochrome
@item linear_design
@item no_autohint
@end table

Default value is "default".

For more information consult the documentation for the FT_LOAD_*
libfreetype flags.

@item shadowcolor
The color to be used for drawing a shadow behind the drawn text. For the
syntax of this option, check the @ref{color syntax,,"Color" section in the
ffmpeg-utils manual,ffmpeg-utils}.

The default value of @var{shadowcolor} is "black".

@item shadowx
@item shadowy
The x and y offsets for the text shadow position with respect to the
position of the text. They can be either positive or negative
values. The default value for both is "0".

@item start_number
The starting frame number for the n/frame_num variable. The default value
is "0".

@item tabsize
The size in number of spaces to use for rendering the tab.
Default value is 4.

@item timecode
Set the initial timecode representation in "hh:mm:ss[:;.]ff"
format. It can be used with or without text parameter. @var{timecode_rate}
option must be specified.

@item timecode_rate, rate, r
Set the timecode frame rate (timecode only). Value will be rounded to nearest
integer. Minimum value is "1".
Drop-frame timecode is supported for frame rates 30 & 60.

@item tc24hmax
If set to 1, the output of the timecode option will wrap around at 24 hours.
Default is 0 (disabled).

@item text
The text string to be drawn. The text must be a sequence of UTF-8
encoded characters.
This parameter is mandatory if no file is specified with the parameter
@var{textfile}.

@item textfile
A text file containing text to be drawn. The text must be a sequence
of UTF-8 encoded characters.

This parameter is mandatory if no text string is specified with the
parameter @var{text}.

If both @var{text} and @var{textfile} are specified, an error is thrown.

@item reload
If set to 1, the @var{textfile} will be reloaded before each frame.
Be sure to update it atomically, or it may be read partially, or even fail.

@item x
@item y
The expressions which specify the offsets where text will be drawn
within the video frame. They are relative to the top/left border of the
output image.

The default value of @var{x} and @var{y} is "0".

See below for the list of accepted constants and functions.
@end table

The parameters for @var{x} and @var{y} are expressions containing the
following constants and functions:

@table @option
@item dar
input display aspect ratio, it is the same as (@var{w} / @var{h}) * @var{sar}

@item hsub
@item vsub
horizontal and vertical chroma subsample values. For example for the
pixel format "yuv422p" @var{hsub} is 2 and @var{vsub} is 1.

@item line_h, lh
the height of each text line

@item main_h, h, H
the input height

@item main_w, w, W
the input width

@item max_glyph_a, ascent
the maximum distance from the baseline to the highest/upper grid
coordinate used to place a glyph outline point, for all the rendered
glyphs.
It is a positive value, due to the grid's orientation with the Y axis
upwards.

@item max_glyph_d, descent
the maximum distance from the baseline to the lowest grid coordinate
used to place a glyph outline point, for all the rendered glyphs.
This is a negative value, due to the grid's orientation, with the Y axis
upwards.

@item max_glyph_h
maximum glyph height, that is the maximum height for all the glyphs
contained in the rendered text, it is equivalent to @var{ascent} -
@var{descent}.

@item max_glyph_w
maximum glyph width, that is the maximum width for all the glyphs
contained in the rendered text

@item n
the number of input frame, starting from 0

@item rand(min, max)
return a random number included between @var{min} and @var{max}

@item sar
The input sample aspect ratio.

@item t
timestamp expressed in seconds, NAN if the input timestamp is unknown

@item text_h, th
the height of the rendered text

@item text_w, tw
the width of the rendered text

@item x
@item y
the x and y offset coordinates where the text is drawn.

These parameters allow the @var{x} and @var{y} expressions to refer
each other, so you can for example specify @code{y=x/dar}.
@end table

@anchor{drawtext_expansion}
@subsection Text expansion

If @option{expansion} is set to @code{strftime},
the filter recognizes strftime() sequences in the provided text and
expands them accordingly. Check the documentation of strftime(). This
feature is deprecated.

If @option{expansion} is set to @code{none}, the text is printed verbatim.

If @option{expansion} is set to @code{normal} (which is the default),
the following expansion mechanism is used.

The backslash character @samp{\}, followed by any character, always expands to
the second character.

Sequences of the form @code{%@{...@}} are expanded. The text between the
braces is a function name, possibly followed by arguments separated by ':'.
If the arguments contain special characters or delimiters (':' or '@}'),
they should be escaped.

Note that they probably must also be escaped as the value for the
@option{text} option in the filter argument string and as the filter
argument in the filtergraph description, and possibly also for the shell,
that makes up to four levels of escaping; using a text file avoids these
problems.

The following functions are available:

@table @command

@item expr, e
The expression evaluation result.

It must take one argument specifying the expression to be evaluated,
which accepts the same constants and functions as the @var{x} and
@var{y} values. Note that not all constants should be used, for
example the text size is not known when evaluating the expression, so
the constants @var{text_w} and @var{text_h} will have an undefined
value.

@item expr_int_format, eif
Evaluate the expression's value and output as formatted integer.

The first argument is the expression to be evaluated, just as for the @var{expr} function.
The second argument specifies the output format. Allowed values are @samp{x},
@samp{X}, @samp{d} and @samp{u}. They are treated exactly as in the
@code{printf} function.
The third parameter is optional and sets the number of positions taken by the output.
It can be used to add padding with zeros from the left.

@item gmtime
The time at which the filter is running, expressed in UTC.
It can accept an argument: a strftime() format string.

@item localtime
The time at which the filter is running, expressed in the local time zone.
It can accept an argument: a strftime() format string.

@item metadata
Frame metadata. Takes one or two arguments.

The first argument is mandatory and specifies the metadata key.

The second argument is optional and specifies a default value, used when the
metadata key is not found or empty.

@item n, frame_num
The frame number, starting from 0.

@item pict_type
A 1 character description of the current picture type.

@item pts
The timestamp of the current frame.
It can take up to three arguments.

The first argument is the format of the timestamp; it defaults to @code{flt}
for seconds as a decimal number with microsecond accuracy; @code{hms} stands
for a formatted @var{[-]HH:MM:SS.mmm} timestamp with millisecond accuracy.
@code{gmtime} stands for the timestamp of the frame formatted as UTC time;
@code{localtime} stands for the timestamp of the frame formatted as
local time zone time.

The second argument is an offset added to the timestamp.

If the format is set to @code{localtime} or @code{gmtime},
a third argument may be supplied: a strftime() format string.
By default, @var{YYYY-MM-DD HH:MM:SS} format will be used.
@end table

@subsection Examples

@itemize
@item
Draw "Test Text" with font FreeSerif, using the default values for the
optional parameters.

@example
drawtext="fontfile=/usr/share/fonts/truetype/freefont/FreeSerif.ttf: text='Test Text'"
@end example

@item
Draw 'Test Text' with font FreeSerif of size 24 at position x=100
and y=50 (counting from the top-left corner of the screen), text is
yellow with a red box around it. Both the text and the box have an
opacity of 20%.

@example
drawtext="fontfile=/usr/share/fonts/truetype/freefont/FreeSerif.ttf: text='Test Text':\
          x=100: y=50: fontsize=24: fontcolor=yellow@@0.2: box=1: boxcolor=red@@0.2"
@end example

Note that the double quotes are not necessary if spaces are not used
within the parameter list.

@item
Show the text at the center of the video frame:
@example
drawtext="fontsize=30:fontfile=FreeSerif.ttf:text='hello world':x=(w-text_w)/2:y=(h-text_h)/2"
@end example

@item
Show the text at a random position, switching to a new position every 30 seconds:
@example
drawtext="fontsize=30:fontfile=FreeSerif.ttf:text='hello world':x=if(eq(mod(t\,30)\,0)\,rand(0\,(w-text_w))\,x):y=if(eq(mod(t\,30)\,0)\,rand(0\,(h-text_h))\,y)"
@end example

@item
Show a text line sliding from right to left in the last row of the video
frame. The file @file{LONG_LINE} is assumed to contain a single line
with no newlines.
@example
drawtext="fontsize=15:fontfile=FreeSerif.ttf:text=LONG_LINE:y=h-line_h:x=-50*t"
@end example

@item
Show the content of file @file{CREDITS} off the bottom of the frame and scroll up.
@example
drawtext="fontsize=20:fontfile=FreeSerif.ttf:textfile=CREDITS:y=h-20*t"
@end example

@item
Draw a single green letter "g", at the center of the input video.
The glyph baseline is placed at half screen height.
@example
drawtext="fontsize=60:fontfile=FreeSerif.ttf:fontcolor=green:text=g:x=(w-max_glyph_w)/2:y=h/2-ascent"
@end example

@item
Show text for 1 second every 3 seconds:
@example
drawtext="fontfile=FreeSerif.ttf:fontcolor=white:x=100:y=x/dar:enable=lt(mod(t\,3)\,1):text='blink'"
@end example

@item
Use fontconfig to set the font. Note that the colons need to be escaped.
@example
drawtext='fontfile=Linux Libertine O-40\:style=Semibold:text=FFmpeg'
@end example

@item
Print the date of a real-time encoding (see strftime(3)):
@example
drawtext='fontfile=FreeSans.ttf:text=%@{localtime\:%a %b %d %Y@}'
@end example

@item
Show text fading in and out (appearing/disappearing):
@example
#!/bin/sh
DS=1.0 # display start
DE=10.0 # display end
FID=1.5 # fade in duration
FOD=5 # fade out duration
ffplay -f lavfi "color,drawtext=text=TEST:fontsize=50:fontfile=FreeSerif.ttf:fontcolor_expr=ff0000%@{eif\\\\: clip(255*(1*between(t\\, $DS + $FID\\, $DE - $FOD) + ((t - $DS)/$FID)*between(t\\, $DS\\, $DS + $FID) + (-(t - $DE)/$FOD)*between(t\\, $DE - $FOD\\, $DE) )\\, 0\\, 255) \\\\: x\\\\: 2 @}"
@end example

@item
Horizontally align multiple separate texts. Note that @option{max_glyph_a}
and the @option{fontsize} value are included in the @option{y} offset.
@example
drawtext=fontfile=FreeSans.ttf:text=DOG:fontsize=24:x=10:y=20+24-max_glyph_a,
drawtext=fontfile=FreeSans.ttf:text=cow:fontsize=24:x=80:y=20+24-max_glyph_a
@end example

@end itemize

For more information about libfreetype, check:
@url{http://www.freetype.org/}.

For more information about fontconfig, check:
@url{http://freedesktop.org/software/fontconfig/fontconfig-user.html}.

For more information about libfribidi, check:
@url{http://fribidi.org/}.

@section edgedetect

Detect and draw edges. The filter uses the Canny Edge Detection algorithm.

The filter accepts the following options:

@table @option
@item low
@item high
Set low and high threshold values used by the Canny thresholding
algorithm.

The high threshold selects the "strong" edge pixels, which are then
connected through 8-connectivity with the "weak" edge pixels selected
by the low threshold.

@var{low} and @var{high} threshold values must be chosen in the range
[0,1], and @var{low} should be lesser or equal to @var{high}.

Default value for @var{low} is @code{20/255}, and default value for @var{high}
is @code{50/255}.

@item mode
Define the drawing mode.

@table @samp
@item wires
Draw white/gray wires on black background.

@item colormix
Mix the colors to create a paint/cartoon effect.
@end table

Default value is @var{wires}.
@end table

@subsection Examples

@itemize
@item
Standard edge detection with custom values for the hysteresis thresholding:
@example
edgedetect=low=0.1:high=0.4
@end example

@item
Painting effect without thresholding:
@example
edgedetect=mode=colormix:high=0
@end example
@end itemize

@section eq
Set brightness, contrast, saturation and approximate gamma adjustment.

The filter accepts the following options:

@table @option
@item contrast
Set the contrast expression. The value must be a float value in range
@code{-2.0} to @code{2.0}. The default value is "1".

@item brightness
Set the brightness expression. The value must be a float value in
range @code{-1.0} to @code{1.0}. The default value is "0".

@item saturation
Set the saturation expression. The value must be a float in
range @code{0.0} to @code{3.0}. The default value is "1".

@item gamma
Set the gamma expression. The value must be a float in range
@code{0.1} to @code{10.0}.  The default value is "1".

@item gamma_r
Set the gamma expression for red. The value must be a float in
range @code{0.1} to @code{10.0}. The default value is "1".

@item gamma_g
Set the gamma expression for green. The value must be a float in range
@code{0.1} to @code{10.0}. The default value is "1".

@item gamma_b
Set the gamma expression for blue. The value must be a float in range
@code{0.1} to @code{10.0}. The default value is "1".

@item gamma_weight
Set the gamma weight expression. It can be used to reduce the effect
of a high gamma value on bright image areas, e.g. keep them from
getting overamplified and just plain white. The value must be a float
in range @code{0.0} to @code{1.0}. A value of @code{0.0} turns the
gamma correction all the way down while @code{1.0} leaves it at its
full strength. Default is "1".

@item eval
Set when the expressions for brightness, contrast, saturation and
gamma expressions are evaluated.

It accepts the following values:
@table @samp
@item init
only evaluate expressions once during the filter initialization or
when a command is processed

@item frame
evaluate expressions for each incoming frame
@end table

Default value is @samp{init}.
@end table

The expressions accept the following parameters:
@table @option
@item n
frame count of the input frame starting from 0

@item pos
byte position of the corresponding packet in the input file, NAN if
unspecified

@item r
frame rate of the input video, NAN if the input frame rate is unknown

@item t
timestamp expressed in seconds, NAN if the input timestamp is unknown
@end table

@subsection Commands
The filter supports the following commands:

@table @option
@item contrast
Set the contrast expression.

@item brightness
Set the brightness expression.

@item saturation
Set the saturation expression.

@item gamma
Set the gamma expression.

@item gamma_r
Set the gamma_r expression.

@item gamma_g
Set gamma_g expression.

@item gamma_b
Set gamma_b expression.

@item gamma_weight
Set gamma_weight expression.

The command accepts the same syntax of the corresponding option.

If the specified expression is not valid, it is kept at its current
value.

@end table

@section erosion

Apply erosion effect to the video.

This filter replaces the pixel by the local(3x3) minimum.

It accepts the following options:

@table @option
@item threshold0
@item threshold1
@item threshold2
@item threshold3
Limit the maximum change for each plane, default is 65535.
If 0, plane will remain unchanged.

@item coordinates
Flag which specifies the pixel to refer to. Default is 255 i.e. all eight
pixels are used.

Flags to local 3x3 coordinates maps like this:

    1 2 3
    4   5
    6 7 8
@end table

@section extractplanes

Extract color channel components from input video stream into
separate grayscale video streams.

The filter accepts the following option:

@table @option
@item planes
Set plane(s) to extract.

Available values for planes are:
@table @samp
@item y
@item u
@item v
@item a
@item r
@item g
@item b
@end table

Choosing planes not available in the input will result in an error.
That means you cannot select @code{r}, @code{g}, @code{b} planes
with @code{y}, @code{u}, @code{v} planes at same time.
@end table

@subsection Examples

@itemize
@item
Extract luma, u and v color channel component from input video frame
into 3 grayscale outputs:
@example
ffmpeg -i video.avi -filter_complex 'extractplanes=y+u+v[y][u][v]' -map '[y]' y.avi -map '[u]' u.avi -map '[v]' v.avi
@end example
@end itemize

@section elbg

Apply a posterize effect using the ELBG (Enhanced LBG) algorithm.

For each input image, the filter will compute the optimal mapping from
the input to the output given the codebook length, that is the number
of distinct output colors.

This filter accepts the following options.

@table @option
@item codebook_length, l
Set codebook length. The value must be a positive integer, and
represents the number of distinct output colors. Default value is 256.

@item nb_steps, n
Set the maximum number of iterations to apply for computing the optimal
mapping. The higher the value the better the result and the higher the
computation time. Default value is 1.

@item seed, s
Set a random seed, must be an integer included between 0 and
UINT32_MAX. If not specified, or if explicitly set to -1, the filter
will try to use a good random seed on a best effort basis.

@item pal8
Set pal8 output pixel format. This option does not work with codebook
length greater than 256.
@end table

@section entropy

Measure graylevel entropy in histogram of color channels of video frames.

It accepts the following parameters:

@table @option
@item mode
Can be either @var{normal} or @var{diff}. Default is @var{normal}.

@var{diff} mode measures entropy of histogram delta values, absolute differences
between neighbour histogram values.
@end table

@section fade

Apply a fade-in/out effect to the input video.

It accepts the following parameters:

@table @option
@item type, t
The effect type can be either "in" for a fade-in, or "out" for a fade-out
effect.
Default is @code{in}.

@item start_frame, s
Specify the number of the frame to start applying the fade
effect at. Default is 0.

@item nb_frames, n
The number of frames that the fade effect lasts. At the end of the
fade-in effect, the output video will have the same intensity as the input video.
At the end of the fade-out transition, the output video will be filled with the
selected @option{color}.
Default is 25.

@item alpha
If set to 1, fade only alpha channel, if one exists on the input.
Default value is 0.

@item start_time, st
Specify the timestamp (in seconds) of the frame to start to apply the fade
effect. If both start_frame and start_time are specified, the fade will start at
whichever comes last.  Default is 0.

@item duration, d
The number of seconds for which the fade effect has to last. At the end of the
fade-in effect the output video will have the same intensity as the input video,
at the end of the fade-out transition the output video will be filled with the
selected @option{color}.
If both duration and nb_frames are specified, duration is used. Default is 0
(nb_frames is used by default).

@item color, c
Specify the color of the fade. Default is "black".
@end table

@subsection Examples

@itemize
@item
Fade in the first 30 frames of video:
@example
fade=in:0:30
@end example

The command above is equivalent to:
@example
fade=t=in:s=0:n=30
@end example

@item
Fade out the last 45 frames of a 200-frame video:
@example
fade=out:155:45
fade=type=out:start_frame=155:nb_frames=45
@end example

@item
Fade in the first 25 frames and fade out the last 25 frames of a 1000-frame video:
@example
fade=in:0:25, fade=out:975:25
@end example

@item
Make the first 5 frames yellow, then fade in from frame 5-24:
@example
fade=in:5:20:color=yellow
@end example

@item
Fade in alpha over first 25 frames of video:
@example
fade=in:0:25:alpha=1
@end example

@item
Make the first 5.5 seconds black, then fade in for 0.5 seconds:
@example
fade=t=in:st=5.5:d=0.5
@end example

@end itemize

@section fftfilt
Apply arbitrary expressions to samples in frequency domain

@table @option
@item dc_Y
Adjust the dc value (gain) of the luma plane of the image. The filter
accepts an integer value in range @code{0} to @code{1000}. The default
value is set to @code{0}.

@item dc_U
Adjust the dc value (gain) of the 1st chroma plane of the image. The
filter accepts an integer value in range @code{0} to @code{1000}. The
default value is set to @code{0}.

@item dc_V
Adjust the dc value (gain) of the 2nd chroma plane of the image. The
filter accepts an integer value in range @code{0} to @code{1000}. The
default value is set to @code{0}.

@item weight_Y
Set the frequency domain weight expression for the luma plane.

@item weight_U
Set the frequency domain weight expression for the 1st chroma plane.

@item weight_V
Set the frequency domain weight expression for the 2nd chroma plane.

@item eval
Set when the expressions are evaluated.

It accepts the following values:
@table @samp
@item init
Only evaluate expressions once during the filter initialization.

@item frame
Evaluate expressions for each incoming frame.
@end table

Default value is @samp{init}.

The filter accepts the following variables:
@item X
@item Y
The coordinates of the current sample.

@item W
@item H
The width and height of the image.

@item N
The number of input frame, starting from 0.
@end table

@subsection Examples

@itemize
@item
High-pass:
@example
fftfilt=dc_Y=128:weight_Y='squish(1-(Y+X)/100)'
@end example

@item
Low-pass:
@example
fftfilt=dc_Y=0:weight_Y='squish((Y+X)/100-1)'
@end example

@item
Sharpen:
@example
fftfilt=dc_Y=0:weight_Y='1+squish(1-(Y+X)/100)'
@end example

@item
Blur:
@example
fftfilt=dc_Y=0:weight_Y='exp(-4 * ((Y+X)/(W+H)))'
@end example

@end itemize

@section field

Extract a single field from an interlaced image using stride
arithmetic to avoid wasting CPU time. The output frames are marked as
non-interlaced.

The filter accepts the following options:

@table @option
@item type
Specify whether to extract the top (if the value is @code{0} or
@code{top}) or the bottom field (if the value is @code{1} or
@code{bottom}).
@end table

@section fieldhint

Create new frames by copying the top and bottom fields from surrounding frames
supplied as numbers by the hint file.

@table @option
@item hint
Set file containing hints: absolute/relative frame numbers.

There must be one line for each frame in a clip. Each line must contain two
numbers separated by the comma, optionally followed by @code{-} or @code{+}.
Numbers supplied on each line of file can not be out of [N-1,N+1] where N
is current frame number for @code{absolute} mode or out of [-1, 1] range
for @code{relative} mode. First number tells from which frame to pick up top
field and second number tells from which frame to pick up bottom field.

If optionally followed by @code{+} output frame will be marked as interlaced,
else if followed by @code{-} output frame will be marked as progressive, else
it will be marked same as input frame.
If line starts with @code{#} or @code{;} that line is skipped.

@item mode
Can be item @code{absolute} or @code{relative}. Default is @code{absolute}.
@end table

Example of first several lines of @code{hint} file for @code{relative} mode:
@example
0,0 - # first frame
1,0 - # second frame, use third's frame top field and second's frame bottom field
1,0 - # third frame, use fourth's frame top field and third's frame bottom field
1,0 -
0,0 -
0,0 -
1,0 -
1,0 -
1,0 -
0,0 -
0,0 -
1,0 -
1,0 -
1,0 -
0,0 -
@end example

@section fieldmatch

Field matching filter for inverse telecine. It is meant to reconstruct the
progressive frames from a telecined stream. The filter does not drop duplicated
frames, so to achieve a complete inverse telecine @code{fieldmatch} needs to be
followed by a decimation filter such as @ref{decimate} in the filtergraph.

The separation of the field matching and the decimation is notably motivated by
the possibility of inserting a de-interlacing filter fallback between the two.
If the source has mixed telecined and real interlaced content,
@code{fieldmatch} will not be able to match fields for the interlaced parts.
But these remaining combed frames will be marked as interlaced, and thus can be
de-interlaced by a later filter such as @ref{yadif} before decimation.

In addition to the various configuration options, @code{fieldmatch} can take an
optional second stream, activated through the @option{ppsrc} option. If
enabled, the frames reconstruction will be based on the fields and frames from
this second stream. This allows the first input to be pre-processed in order to
help the various algorithms of the filter, while keeping the output lossless
(assuming the fields are matched properly). Typically, a field-aware denoiser,
or brightness/contrast adjustments can help.

Note that this filter uses the same algorithms as TIVTC/TFM (AviSynth project)
and VIVTC/VFM (VapourSynth project). The later is a light clone of TFM from
which @code{fieldmatch} is based on. While the semantic and usage are very
close, some behaviour and options names can differ.

The @ref{decimate} filter currently only works for constant frame rate input.
If your input has mixed telecined (30fps) and progressive content with a lower
framerate like 24fps use the following filterchain to produce the necessary cfr
stream: @code{dejudder,fps=30000/1001,fieldmatch,decimate}.

The filter accepts the following options:

@table @option
@item order
Specify the assumed field order of the input stream. Available values are:

@table @samp
@item auto
Auto detect parity (use FFmpeg's internal parity value).
@item bff
Assume bottom field first.
@item tff
Assume top field first.
@end table

Note that it is sometimes recommended not to trust the parity announced by the
stream.

Default value is @var{auto}.

@item mode
Set the matching mode or strategy to use. @option{pc} mode is the safest in the
sense that it won't risk creating jerkiness due to duplicate frames when
possible, but if there are bad edits or blended fields it will end up
outputting combed frames when a good match might actually exist. On the other
hand, @option{pcn_ub} mode is the most risky in terms of creating jerkiness,
but will almost always find a good frame if there is one. The other values are
all somewhere in between @option{pc} and @option{pcn_ub} in terms of risking
jerkiness and creating duplicate frames versus finding good matches in sections
with bad edits, orphaned fields, blended fields, etc.

More details about p/c/n/u/b are available in @ref{p/c/n/u/b meaning} section.

Available values are:

@table @samp
@item pc
2-way matching (p/c)
@item pc_n
2-way matching, and trying 3rd match if still combed (p/c + n)
@item pc_u
2-way matching, and trying 3rd match (same order) if still combed (p/c + u)
@item pc_n_ub
2-way matching, trying 3rd match if still combed, and trying 4th/5th matches if
still combed (p/c + n + u/b)
@item pcn
3-way matching (p/c/n)
@item pcn_ub
3-way matching, and trying 4th/5th matches if all 3 of the original matches are
detected as combed (p/c/n + u/b)
@end table

The parenthesis at the end indicate the matches that would be used for that
mode assuming @option{order}=@var{tff} (and @option{field} on @var{auto} or
@var{top}).

In terms of speed @option{pc} mode is by far the fastest and @option{pcn_ub} is
the slowest.

Default value is @var{pc_n}.

@item ppsrc
Mark the main input stream as a pre-processed input, and enable the secondary
input stream as the clean source to pick the fields from. See the filter
introduction for more details. It is similar to the @option{clip2} feature from
VFM/TFM.

Default value is @code{0} (disabled).

@item field
Set the field to match from. It is recommended to set this to the same value as
@option{order} unless you experience matching failures with that setting. In
certain circumstances changing the field that is used to match from can have a
large impact on matching performance. Available values are:

@table @samp
@item auto
Automatic (same value as @option{order}).
@item bottom
Match from the bottom field.
@item top
Match from the top field.
@end table

Default value is @var{auto}.

@item mchroma
Set whether or not chroma is included during the match comparisons. In most
cases it is recommended to leave this enabled. You should set this to @code{0}
only if your clip has bad chroma problems such as heavy rainbowing or other
artifacts. Setting this to @code{0} could also be used to speed things up at
the cost of some accuracy.

Default value is @code{1}.

@item y0
@item y1
These define an exclusion band which excludes the lines between @option{y0} and
@option{y1} from being included in the field matching decision. An exclusion
band can be used to ignore subtitles, a logo, or other things that may
interfere with the matching. @option{y0} sets the starting scan line and
@option{y1} sets the ending line; all lines in between @option{y0} and
@option{y1} (including @option{y0} and @option{y1}) will be ignored. Setting
@option{y0} and @option{y1} to the same value will disable the feature.
@option{y0} and @option{y1} defaults to @code{0}.

@item scthresh
Set the scene change detection threshold as a percentage of maximum change on
the luma plane. Good values are in the @code{[8.0, 14.0]} range. Scene change
detection is only relevant in case @option{combmatch}=@var{sc}.  The range for
@option{scthresh} is @code{[0.0, 100.0]}.

Default value is @code{12.0}.

@item combmatch
When @option{combatch} is not @var{none}, @code{fieldmatch} will take into
account the combed scores of matches when deciding what match to use as the
final match. Available values are:

@table @samp
@item none
No final matching based on combed scores.
@item sc
Combed scores are only used when a scene change is detected.
@item full
Use combed scores all the time.
@end table

Default is @var{sc}.

@item combdbg
Force @code{fieldmatch} to calculate the combed metrics for certain matches and
print them. This setting is known as @option{micout} in TFM/VFM vocabulary.
Available values are:

@table @samp
@item none
No forced calculation.
@item pcn
Force p/c/n calculations.
@item pcnub
Force p/c/n/u/b calculations.
@end table

Default value is @var{none}.

@item cthresh
This is the area combing threshold used for combed frame detection. This
essentially controls how "strong" or "visible" combing must be to be detected.
Larger values mean combing must be more visible and smaller values mean combing
can be less visible or strong and still be detected. Valid settings are from
@code{-1} (every pixel will be detected as combed) to @code{255} (no pixel will
be detected as combed). This is basically a pixel difference value. A good
range is @code{[8, 12]}.

Default value is @code{9}.

@item chroma
Sets whether or not chroma is considered in the combed frame decision.  Only
disable this if your source has chroma problems (rainbowing, etc.) that are
causing problems for the combed frame detection with chroma enabled. Actually,
using @option{chroma}=@var{0} is usually more reliable, except for the case
where there is chroma only combing in the source.

Default value is @code{0}.

@item blockx
@item blocky
Respectively set the x-axis and y-axis size of the window used during combed
frame detection. This has to do with the size of the area in which
@option{combpel} pixels are required to be detected as combed for a frame to be
declared combed. See the @option{combpel} parameter description for more info.
Possible values are any number that is a power of 2 starting at 4 and going up
to 512.

Default value is @code{16}.

@item combpel
The number of combed pixels inside any of the @option{blocky} by
@option{blockx} size blocks on the frame for the frame to be detected as
combed. While @option{cthresh} controls how "visible" the combing must be, this
setting controls "how much" combing there must be in any localized area (a
window defined by the @option{blockx} and @option{blocky} settings) on the
frame. Minimum value is @code{0} and maximum is @code{blocky x blockx} (at
which point no frames will ever be detected as combed). This setting is known
as @option{MI} in TFM/VFM vocabulary.

Default value is @code{80}.
@end table

@anchor{p/c/n/u/b meaning}
@subsection p/c/n/u/b meaning

@subsubsection p/c/n

We assume the following telecined stream:

@example
Top fields:     1 2 2 3 4
Bottom fields:  1 2 3 4 4
@end example

The numbers correspond to the progressive frame the fields relate to. Here, the
first two frames are progressive, the 3rd and 4th are combed, and so on.

When @code{fieldmatch} is configured to run a matching from bottom
(@option{field}=@var{bottom}) this is how this input stream get transformed:

@example
Input stream:
                T     1 2 2 3 4
                B     1 2 3 4 4   <-- matching reference

Matches:              c c n n c

Output stream:
                T     1 2 3 4 4
                B     1 2 3 4 4
@end example

As a result of the field matching, we can see that some frames get duplicated.
To perform a complete inverse telecine, you need to rely on a decimation filter
after this operation. See for instance the @ref{decimate} filter.

The same operation now matching from top fields (@option{field}=@var{top})
looks like this:

@example
Input stream:
                T     1 2 2 3 4   <-- matching reference
                B     1 2 3 4 4

Matches:              c c p p c

Output stream:
                T     1 2 2 3 4
                B     1 2 2 3 4
@end example

In these examples, we can see what @var{p}, @var{c} and @var{n} mean;
basically, they refer to the frame and field of the opposite parity:

@itemize
@item @var{p} matches the field of the opposite parity in the previous frame
@item @var{c} matches the field of the opposite parity in the current frame
@item @var{n} matches the field of the opposite parity in the next frame
@end itemize

@subsubsection u/b

The @var{u} and @var{b} matching are a bit special in the sense that they match
from the opposite parity flag. In the following examples, we assume that we are
currently matching the 2nd frame (Top:2, bottom:2). According to the match, a
'x' is placed above and below each matched fields.

With bottom matching (@option{field}=@var{bottom}):
@example
Match:           c         p           n          b          u

                 x       x               x        x          x
  Top          1 2 2     1 2 2       1 2 2      1 2 2      1 2 2
  Bottom       1 2 3     1 2 3       1 2 3      1 2 3      1 2 3
                 x         x           x        x              x

Output frames:
                 2          1          2          2          2
                 2          2          2          1          3
@end example

With top matching (@option{field}=@var{top}):
@example
Match:           c         p           n          b          u

                 x         x           x        x              x
  Top          1 2 2     1 2 2       1 2 2      1 2 2      1 2 2
  Bottom       1 2 3     1 2 3       1 2 3      1 2 3      1 2 3
                 x       x               x        x          x

Output frames:
                 2          2          2          1          2
                 2          1          3          2          2
@end example

@subsection Examples

Simple IVTC of a top field first telecined stream:
@example
fieldmatch=order=tff:combmatch=none, decimate
@end example

Advanced IVTC, with fallback on @ref{yadif} for still combed frames:
@example
fieldmatch=order=tff:combmatch=full, yadif=deint=interlaced, decimate
@end example

@section fieldorder

Transform the field order of the input video.

It accepts the following parameters:

@table @option

@item order
The output field order. Valid values are @var{tff} for top field first or @var{bff}
for bottom field first.
@end table

The default value is @samp{tff}.

The transformation is done by shifting the picture content up or down
by one line, and filling the remaining line with appropriate picture content.
This method is consistent with most broadcast field order converters.

If the input video is not flagged as being interlaced, or it is already
flagged as being of the required output field order, then this filter does
not alter the incoming video.

It is very useful when converting to or from PAL DV material,
which is bottom field first.

For example:
@example
ffmpeg -i in.vob -vf "fieldorder=bff" out.dv
@end example

@section fifo, afifo

Buffer input images and send them when they are requested.

It is mainly useful when auto-inserted by the libavfilter
framework.

It does not take parameters.

@section fillborders

Fill borders of the input video, without changing video stream dimensions.
Sometimes video can have garbage at the four edges and you may not want to
crop video input to keep size multiple of some number.

This filter accepts the following options:

@table @option
@item left
Number of pixels to fill from left border.

@item right
Number of pixels to fill from right border.

@item top
Number of pixels to fill from top border.

@item bottom
Number of pixels to fill from bottom border.

@item mode
Set fill mode.

It accepts the following values:
@table @samp
@item smear
fill pixels using outermost pixels

@item mirror
fill pixels using mirroring

@item fixed
fill pixels with constant value
@end table

Default is @var{smear}.

@item color
Set color for pixels in fixed mode. Default is @var{black}.
@end table

@section find_rect

Find a rectangular object

It accepts the following options:

@table @option
@item object
Filepath of the object image, needs to be in gray8.

@item threshold
Detection threshold, default is 0.5.

@item mipmaps
Number of mipmaps, default is 3.

@item xmin, ymin, xmax, ymax
Specifies the rectangle in which to search.
@end table

@subsection Examples

@itemize
@item
Generate a representative palette of a given video using @command{ffmpeg}:
@example
ffmpeg -i file.ts -vf find_rect=newref.pgm,cover_rect=cover.jpg:mode=cover new.mkv
@end example
@end itemize

@section cover_rect

Cover a rectangular object

It accepts the following options:

@table @option
@item cover
Filepath of the optional cover image, needs to be in yuv420.

@item mode
Set covering mode.

It accepts the following values:
@table @samp
@item cover
cover it by the supplied image
@item blur
cover it by interpolating the surrounding pixels
@end table

Default value is @var{blur}.
@end table

@subsection Examples

@itemize
@item
Generate a representative palette of a given video using @command{ffmpeg}:
@example
ffmpeg -i file.ts -vf find_rect=newref.pgm,cover_rect=cover.jpg:mode=cover new.mkv
@end example
@end itemize

@section floodfill

Flood area with values of same pixel components with another values.

It accepts the following options:
@table @option
@item x
Set pixel x coordinate.

@item y
Set pixel y coordinate.

@item s0
Set source #0 component value.

@item s1
Set source #1 component value.

@item s2
Set source #2 component value.

@item s3
Set source #3 component value.

@item d0
Set destination #0 component value.

@item d1
Set destination #1 component value.

@item d2
Set destination #2 component value.

@item d3
Set destination #3 component value.
@end table

@anchor{format}
@section format

Convert the input video to one of the specified pixel formats.
Libavfilter will try to pick one that is suitable as input to
the next filter.

It accepts the following parameters:
@table @option

@item pix_fmts
A '|'-separated list of pixel format names, such as
"pix_fmts=yuv420p|monow|rgb24".

@end table

@subsection Examples

@itemize
@item
Convert the input video to the @var{yuv420p} format
@example
format=pix_fmts=yuv420p
@end example

Convert the input video to any of the formats in the list
@example
format=pix_fmts=yuv420p|yuv444p|yuv410p
@end example
@end itemize

@anchor{fps}
@section fps

Convert the video to specified constant frame rate by duplicating or dropping
frames as necessary.

It accepts the following parameters:
@table @option

@item fps
The desired output frame rate. The default is @code{25}.

@item start_time
Assume the first PTS should be the given value, in seconds. This allows for
padding/trimming at the start of stream. By default, no assumption is made
about the first frame's expected PTS, so no padding or trimming is done.
For example, this could be set to 0 to pad the beginning with duplicates of
the first frame if a video stream starts after the audio stream or to trim any
frames with a negative PTS.

@item round
Timestamp (PTS) rounding method.

Possible values are:
@table @option
@item zero
round towards 0
@item inf
round away from 0
@item down
round towards -infinity
@item up
round towards +infinity
@item near
round to nearest
@end table
The default is @code{near}.

@item eof_action
Action performed when reading the last frame.

Possible values are:
@table @option
@item round
Use same timestamp rounding method as used for other frames.
@item pass
Pass through last frame if input duration has not been reached yet.
@end table
The default is @code{round}.

@end table

Alternatively, the options can be specified as a flat string:
@var{fps}[:@var{start_time}[:@var{round}]].

See also the @ref{setpts} filter.

@subsection Examples

@itemize
@item
A typical usage in order to set the fps to 25:
@example
fps=fps=25
@end example

@item
Sets the fps to 24, using abbreviation and rounding method to round to nearest:
@example
fps=fps=film:round=near
@end example
@end itemize

@section framepack

Pack two different video streams into a stereoscopic video, setting proper
metadata on supported codecs. The two views should have the same size and
framerate and processing will stop when the shorter video ends. Please note
that you may conveniently adjust view properties with the @ref{scale} and
@ref{fps} filters.

It accepts the following parameters:
@table @option

@item format
The desired packing format. Supported values are:

@table @option

@item sbs
The views are next to each other (default).

@item tab
The views are on top of each other.

@item lines
The views are packed by line.

@item columns
The views are packed by column.

@item frameseq
The views are temporally interleaved.

@end table

@end table

Some examples:

@example
# Convert left and right views into a frame-sequential video
ffmpeg -i LEFT -i RIGHT -filter_complex framepack=frameseq OUTPUT

# Convert views into a side-by-side video with the same output resolution as the input
ffmpeg -i LEFT -i RIGHT -filter_complex [0:v]scale=w=iw/2[left],[1:v]scale=w=iw/2[right],[left][right]framepack=sbs OUTPUT
@end example

@section framerate

Change the frame rate by interpolating new video output frames from the source
frames.

This filter is not designed to function correctly with interlaced media. If
you wish to change the frame rate of interlaced media then you are required
to deinterlace before this filter and re-interlace after this filter.

A description of the accepted options follows.

@table @option
@item fps
Specify the output frames per second. This option can also be specified
as a value alone. The default is @code{50}.

@item interp_start
Specify the start of a range where the output frame will be created as a
linear interpolation of two frames. The range is [@code{0}-@code{255}],
the default is @code{15}.

@item interp_end
Specify the end of a range where the output frame will be created as a
linear interpolation of two frames. The range is [@code{0}-@code{255}],
the default is @code{240}.

@item scene
Specify the level at which a scene change is detected as a value between
0 and 100 to indicate a new scene; a low value reflects a low
probability for the current frame to introduce a new scene, while a higher
value means the current frame is more likely to be one.
The default is @code{8.2}.

@item flags
Specify flags influencing the filter process.

Available value for @var{flags} is:

@table @option
@item scene_change_detect, scd
Enable scene change detection using the value of the option @var{scene}.
This flag is enabled by default.
@end table
@end table

@section framestep

Select one frame every N-th frame.

This filter accepts the following option:
@table @option
@item step
Select frame after every @code{step} frames.
Allowed values are positive integers higher than 0. Default value is @code{1}.
@end table

@anchor{frei0r}
@section frei0r

Apply a frei0r effect to the input video.

To enable the compilation of this filter, you need to install the frei0r
header and configure FFmpeg with @code{--enable-frei0r}.

It accepts the following parameters:

@table @option

@item filter_name
The name of the frei0r effect to load. If the environment variable
@env{FREI0R_PATH} is defined, the frei0r effect is searched for in each of the
directories specified by the colon-separated list in @env{FREI0R_PATH}.
Otherwise, the standard frei0r paths are searched, in this order:
@file{HOME/.frei0r-1/lib/}, @file{/usr/local/lib/frei0r-1/},
@file{/usr/lib/frei0r-1/}.

@item filter_params
A '|'-separated list of parameters to pass to the frei0r effect.

@end table

A frei0r effect parameter can be a boolean (its value is either
"y" or "n"), a double, a color (specified as
@var{R}/@var{G}/@var{B}, where @var{R}, @var{G}, and @var{B} are floating point
numbers between 0.0 and 1.0, inclusive) or a color description as specified in the
@ref{color syntax,,"Color" section in the ffmpeg-utils manual,ffmpeg-utils},
a position (specified as @var{X}/@var{Y}, where
@var{X} and @var{Y} are floating point numbers) and/or a string.

The number and types of parameters depend on the loaded effect. If an
effect parameter is not specified, the default value is set.

@subsection Examples

@itemize
@item
Apply the distort0r effect, setting the first two double parameters:
@example
frei0r=filter_name=distort0r:filter_params=0.5|0.01
@end example

@item
Apply the colordistance effect, taking a color as the first parameter:
@example
frei0r=colordistance:0.2/0.3/0.4
frei0r=colordistance:violet
frei0r=colordistance:0x112233
@end example

@item
Apply the perspective effect, specifying the top left and top right image
positions:
@example
frei0r=perspective:0.2/0.2|0.8/0.2
@end example
@end itemize

For more information, see
@url{http://frei0r.dyne.org}

@section fspp

Apply fast and simple postprocessing. It is a faster version of @ref{spp}.

It splits (I)DCT into horizontal/vertical passes. Unlike the simple post-
processing filter, one of them is performed once per block, not per pixel.
This allows for much higher speed.

The filter accepts the following options:

@table @option
@item quality
Set quality. This option defines the number of levels for averaging. It accepts
an integer in the range 4-5. Default value is @code{4}.

@item qp
Force a constant quantization parameter. It accepts an integer in range 0-63.
If not set, the filter will use the QP from the video stream (if available).

@item strength
Set filter strength. It accepts an integer in range -15 to 32. Lower values mean
more details but also more artifacts, while higher values make the image smoother
but also blurrier. Default value is @code{0} − PSNR optimal.

@item use_bframe_qp
Enable the use of the QP from the B-Frames if set to @code{1}. Using this
option may cause flicker since the B-Frames have often larger QP. Default is
@code{0} (not enabled).

@end table

@section gblur

Apply Gaussian blur filter.

The filter accepts the following options:

@table @option
@item sigma
Set horizontal sigma, standard deviation of Gaussian blur. Default is @code{0.5}.

@item steps
Set number of steps for Gaussian approximation. Defauls is @code{1}.

@item planes
Set which planes to filter. By default all planes are filtered.

@item sigmaV
Set vertical sigma, if negative it will be same as @code{sigma}.
Default is @code{-1}.
@end table

@section geq

The filter accepts the following options:

@table @option
@item lum_expr, lum
Set the luminance expression.
@item cb_expr, cb
Set the chrominance blue expression.
@item cr_expr, cr
Set the chrominance red expression.
@item alpha_expr, a
Set the alpha expression.
@item red_expr, r
Set the red expression.
@item green_expr, g
Set the green expression.
@item blue_expr, b
Set the blue expression.
@end table

The colorspace is selected according to the specified options. If one
of the @option{lum_expr}, @option{cb_expr}, or @option{cr_expr}
options is specified, the filter will automatically select a YCbCr
colorspace. If one of the @option{red_expr}, @option{green_expr}, or
@option{blue_expr} options is specified, it will select an RGB
colorspace.

If one of the chrominance expression is not defined, it falls back on the other
one. If no alpha expression is specified it will evaluate to opaque value.
If none of chrominance expressions are specified, they will evaluate
to the luminance expression.

The expressions can use the following variables and functions:

@table @option
@item N
The sequential number of the filtered frame, starting from @code{0}.

@item X
@item Y
The coordinates of the current sample.

@item W
@item H
The width and height of the image.

@item SW
@item SH
Width and height scale depending on the currently filtered plane. It is the
ratio between the corresponding luma plane number of pixels and the current
plane ones. E.g. for YUV4:2:0 the values are @code{1,1} for the luma plane, and
@code{0.5,0.5} for chroma planes.

@item T
Time of the current frame, expressed in seconds.

@item p(x, y)
Return the value of the pixel at location (@var{x},@var{y}) of the current
plane.

@item lum(x, y)
Return the value of the pixel at location (@var{x},@var{y}) of the luminance
plane.

@item cb(x, y)
Return the value of the pixel at location (@var{x},@var{y}) of the
blue-difference chroma plane. Return 0 if there is no such plane.

@item cr(x, y)
Return the value of the pixel at location (@var{x},@var{y}) of the
red-difference chroma plane. Return 0 if there is no such plane.

@item r(x, y)
@item g(x, y)
@item b(x, y)
Return the value of the pixel at location (@var{x},@var{y}) of the
red/green/blue component. Return 0 if there is no such component.

@item alpha(x, y)
Return the value of the pixel at location (@var{x},@var{y}) of the alpha
plane. Return 0 if there is no such plane.
@end table

For functions, if @var{x} and @var{y} are outside the area, the value will be
automatically clipped to the closer edge.

@subsection Examples

@itemize
@item
Flip the image horizontally:
@example
geq=p(W-X\,Y)
@end example

@item
Generate a bidimensional sine wave, with angle @code{PI/3} and a
wavelength of 100 pixels:
@example
geq=128 + 100*sin(2*(PI/100)*(cos(PI/3)*(X-50*T) + sin(PI/3)*Y)):128:128
@end example

@item
Generate a fancy enigmatic moving light:
@example
nullsrc=s=256x256,geq=random(1)/hypot(X-cos(N*0.07)*W/2-W/2\,Y-sin(N*0.09)*H/2-H/2)^2*1000000*sin(N*0.02):128:128
@end example

@item
Generate a quick emboss effect:
@example
format=gray,geq=lum_expr='(p(X,Y)+(256-p(X-4,Y-4)))/2'
@end example

@item
Modify RGB components depending on pixel position:
@example
geq=r='X/W*r(X,Y)':g='(1-X/W)*g(X,Y)':b='(H-Y)/H*b(X,Y)'
@end example

@item
Create a radial gradient that is the same size as the input (also see
the @ref{vignette} filter):
@example
geq=lum=255*gauss((X/W-0.5)*3)*gauss((Y/H-0.5)*3)/gauss(0)/gauss(0),format=gray
@end example
@end itemize

@section gradfun

Fix the banding artifacts that are sometimes introduced into nearly flat
regions by truncation to 8-bit color depth.
Interpolate the gradients that should go where the bands are, and
dither them.

It is designed for playback only.  Do not use it prior to
lossy compression, because compression tends to lose the dither and
bring back the bands.

It accepts the following parameters:

@table @option

@item strength
The maximum amount by which the filter will change any one pixel. This is also
the threshold for detecting nearly flat regions. Acceptable values range from
.51 to 64; the default value is 1.2. Out-of-range values will be clipped to the
valid range.

@item radius
The neighborhood to fit the gradient to. A larger radius makes for smoother
gradients, but also prevents the filter from modifying the pixels near detailed
regions. Acceptable values are 8-32; the default value is 16. Out-of-range
values will be clipped to the valid range.

@end table

Alternatively, the options can be specified as a flat string:
@var{strength}[:@var{radius}]

@subsection Examples

@itemize
@item
Apply the filter with a @code{3.5} strength and radius of @code{8}:
@example
gradfun=3.5:8
@end example

@item
Specify radius, omitting the strength (which will fall-back to the default
value):
@example
gradfun=radius=8
@end example

@end itemize

@anchor{haldclut}
@section haldclut

Apply a Hald CLUT to a video stream.

First input is the video stream to process, and second one is the Hald CLUT.
The Hald CLUT input can be a simple picture or a complete video stream.

The filter accepts the following options:

@table @option
@item shortest
Force termination when the shortest input terminates. Default is @code{0}.
@item repeatlast
Continue applying the last CLUT after the end of the stream. A value of
@code{0} disable the filter after the last frame of the CLUT is reached.
Default is @code{1}.
@end table

@code{haldclut} also has the same interpolation options as @ref{lut3d} (both
filters share the same internals).

More information about the Hald CLUT can be found on Eskil Steenberg's website
(Hald CLUT author) at @url{http://www.quelsolaar.com/technology/clut.html}.

@subsection Workflow examples

@subsubsection Hald CLUT video stream

Generate an identity Hald CLUT stream altered with various effects:
@example
ffmpeg -f lavfi -i @ref{haldclutsrc}=8 -vf "hue=H=2*PI*t:s=sin(2*PI*t)+1, curves=cross_process" -t 10 -c:v ffv1 clut.nut
@end example

Note: make sure you use a lossless codec.

Then use it with @code{haldclut} to apply it on some random stream:
@example
ffmpeg -f lavfi -i mandelbrot -i clut.nut -filter_complex '[0][1] haldclut' -t 20 mandelclut.mkv
@end example

The Hald CLUT will be applied to the 10 first seconds (duration of
@file{clut.nut}), then the latest picture of that CLUT stream will be applied
to the remaining frames of the @code{mandelbrot} stream.

@subsubsection Hald CLUT with preview

A Hald CLUT is supposed to be a squared image of @code{Level*Level*Level} by
@code{Level*Level*Level} pixels. For a given Hald CLUT, FFmpeg will select the
biggest possible square starting at the top left of the picture. The remaining
padding pixels (bottom or right) will be ignored. This area can be used to add
a preview of the Hald CLUT.

Typically, the following generated Hald CLUT will be supported by the
@code{haldclut} filter:

@example
ffmpeg -f lavfi -i @ref{haldclutsrc}=8 -vf "
   pad=iw+320 [padded_clut];
   smptebars=s=320x256, split [a][b];
   [padded_clut][a] overlay=W-320:h, curves=color_negative [main];
   [main][b] overlay=W-320" -frames:v 1 clut.png
@end example

It contains the original and a preview of the effect of the CLUT: SMPTE color
bars are displayed on the right-top, and below the same color bars processed by
the color changes.

Then, the effect of this Hald CLUT can be visualized with:
@example
ffplay input.mkv -vf "movie=clut.png, [in] haldclut"
@end example

@section hflip

Flip the input video horizontally.

For example, to horizontally flip the input video with @command{ffmpeg}:
@example
ffmpeg -i in.avi -vf "hflip" out.avi
@end example

@section histeq
This filter applies a global color histogram equalization on a
per-frame basis.

It can be used to correct video that has a compressed range of pixel
intensities.  The filter redistributes the pixel intensities to
equalize their distribution across the intensity range. It may be
viewed as an "automatically adjusting contrast filter". This filter is
useful only for correcting degraded or poorly captured source
video.

The filter accepts the following options:

@table @option
@item strength
Determine the amount of equalization to be applied.  As the strength
is reduced, the distribution of pixel intensities more-and-more
approaches that of the input frame. The value must be a float number
in the range [0,1] and defaults to 0.200.

@item intensity
Set the maximum intensity that can generated and scale the output
values appropriately.  The strength should be set as desired and then
the intensity can be limited if needed to avoid washing-out. The value
must be a float number in the range [0,1] and defaults to 0.210.

@item antibanding
Set the antibanding level. If enabled the filter will randomly vary
the luminance of output pixels by a small amount to avoid banding of
the histogram. Possible values are @code{none}, @code{weak} or
@code{strong}. It defaults to @code{none}.
@end table

@section histogram

Compute and draw a color distribution histogram for the input video.

The computed histogram is a representation of the color component
distribution in an image.

Standard histogram displays the color components distribution in an image.
Displays color graph for each color component. Shows distribution of
the Y, U, V, A or R, G, B components, depending on input format, in the
current frame. Below each graph a color component scale meter is shown.

The filter accepts the following options:

@table @option
@item level_height
Set height of level. Default value is @code{200}.
Allowed range is [50, 2048].

@item scale_height
Set height of color scale. Default value is @code{12}.
Allowed range is [0, 40].

@item display_mode
Set display mode.
It accepts the following values:
@table @samp
@item stack
Per color component graphs are placed below each other.

@item parade
Per color component graphs are placed side by side.

@item overlay
Presents information identical to that in the @code{parade}, except
that the graphs representing color components are superimposed directly
over one another.
@end table
Default is @code{stack}.

@item levels_mode
Set mode. Can be either @code{linear}, or @code{logarithmic}.
Default is @code{linear}.

@item components
Set what color components to display.
Default is @code{7}.

@item fgopacity
Set foreground opacity. Default is @code{0.7}.

@item bgopacity
Set background opacity. Default is @code{0.5}.
@end table

@subsection Examples

@itemize

@item
Calculate and draw histogram:
@example
ffplay -i input -vf histogram
@end example

@end itemize

@anchor{hqdn3d}
@section hqdn3d

This is a high precision/quality 3d denoise filter. It aims to reduce
image noise, producing smooth images and making still images really
still. It should enhance compressibility.

It accepts the following optional parameters:

@table @option
@item luma_spatial
A non-negative floating point number which specifies spatial luma strength.
It defaults to 4.0.

@item chroma_spatial
A non-negative floating point number which specifies spatial chroma strength.
It defaults to 3.0*@var{luma_spatial}/4.0.

@item luma_tmp
A floating point number which specifies luma temporal strength. It defaults to
6.0*@var{luma_spatial}/4.0.

@item chroma_tmp
A floating point number which specifies chroma temporal strength. It defaults to
@var{luma_tmp}*@var{chroma_spatial}/@var{luma_spatial}.
@end table

@section hwdownload

Download hardware frames to system memory.

The input must be in hardware frames, and the output a non-hardware format.
Not all formats will be supported on the output - it may be necessary to insert
an additional @option{format} filter immediately following in the graph to get
the output in a supported format.

@section hwmap

Map hardware frames to system memory or to another device.

This filter has several different modes of operation; which one is used depends
on the input and output formats:
@itemize
@item
Hardware frame input, normal frame output

Map the input frames to system memory and pass them to the output.  If the
original hardware frame is later required (for example, after overlaying
something else on part of it), the @option{hwmap} filter can be used again
in the next mode to retrieve it.
@item
Normal frame input, hardware frame output

If the input is actually a software-mapped hardware frame, then unmap it -
that is, return the original hardware frame.

Otherwise, a device must be provided.  Create new hardware surfaces on that
device for the output, then map them back to the software format at the input
and give those frames to the preceding filter.  This will then act like the
@option{hwupload} filter, but may be able to avoid an additional copy when
the input is already in a compatible format.
@item
Hardware frame input and output

A device must be supplied for the output, either directly or with the
@option{derive_device} option.  The input and output devices must be of
different types and compatible - the exact meaning of this is
system-dependent, but typically it means that they must refer to the same
underlying hardware context (for example, refer to the same graphics card).

If the input frames were originally created on the output device, then unmap
to retrieve the original frames.

Otherwise, map the frames to the output device - create new hardware frames
on the output corresponding to the frames on the input.
@end itemize

The following additional parameters are accepted:

@table @option
@item mode
Set the frame mapping mode.  Some combination of:
@table @var
@item read
The mapped frame should be readable.
@item write
The mapped frame should be writeable.
@item overwrite
The mapping will always overwrite the entire frame.

This may improve performance in some cases, as the original contents of the
frame need not be loaded.
@item direct
The mapping must not involve any copying.

Indirect mappings to copies of frames are created in some cases where either
direct mapping is not possible or it would have unexpected properties.
Setting this flag ensures that the mapping is direct and will fail if that is
not possible.
@end table
Defaults to @var{read+write} if not specified.

@item derive_device @var{type}
Rather than using the device supplied at initialisation, instead derive a new
device of type @var{type} from the device the input frames exist on.

@item reverse
In a hardware to hardware mapping, map in reverse - create frames in the sink
and map them back to the source.  This may be necessary in some cases where
a mapping in one direction is required but only the opposite direction is
supported by the devices being used.

This option is dangerous - it may break the preceding filter in undefined
ways if there are any additional constraints on that filter's output.
Do not use it without fully understanding the implications of its use.
@end table

@section hwupload

Upload system memory frames to hardware surfaces.

The device to upload to must be supplied when the filter is initialised.  If
using ffmpeg, select the appropriate device with the @option{-filter_hw_device}
option.

@anchor{hwupload_cuda}
@section hwupload_cuda

Upload system memory frames to a CUDA device.

It accepts the following optional parameters:

@table @option
@item device
The number of the CUDA device to use
@end table

@section hqx

Apply a high-quality magnification filter designed for pixel art. This filter
was originally created by Maxim Stepin.

It accepts the following option:

@table @option
@item n
Set the scaling dimension: @code{2} for @code{hq2x}, @code{3} for
@code{hq3x} and @code{4} for @code{hq4x}.
Default is @code{3}.
@end table

@section hstack
Stack input videos horizontally.

All streams must be of same pixel format and of same height.

Note that this filter is faster than using @ref{overlay} and @ref{pad} filter
to create same output.

The filter accept the following option:

@table @option
@item inputs
Set number of input streams. Default is 2.

@item shortest
If set to 1, force the output to terminate when the shortest input
terminates. Default value is 0.
@end table

@section hue

Modify the hue and/or the saturation of the input.

It accepts the following parameters:

@table @option
@item h
Specify the hue angle as a number of degrees. It accepts an expression,
and defaults to "0".

@item s
Specify the saturation in the [-10,10] range. It accepts an expression and
defaults to "1".

@item H
Specify the hue angle as a number of radians. It accepts an
expression, and defaults to "0".

@item b
Specify the brightness in the [-10,10] range. It accepts an expression and
defaults to "0".
@end table

@option{h} and @option{H} are mutually exclusive, and can't be
specified at the same time.

The @option{b}, @option{h}, @option{H} and @option{s} option values are
expressions containing the following constants:

@table @option
@item n
frame count of the input frame starting from 0

@item pts
presentation timestamp of the input frame expressed in time base units

@item r
frame rate of the input video, NAN if the input frame rate is unknown

@item t
timestamp expressed in seconds, NAN if the input timestamp is unknown

@item tb
time base of the input video
@end table

@subsection Examples

@itemize
@item
Set the hue to 90 degrees and the saturation to 1.0:
@example
hue=h=90:s=1
@end example

@item
Same command but expressing the hue in radians:
@example
hue=H=PI/2:s=1
@end example

@item
Rotate hue and make the saturation swing between 0
and 2 over a period of 1 second:
@example
hue="H=2*PI*t: s=sin(2*PI*t)+1"
@end example

@item
Apply a 3 seconds saturation fade-in effect starting at 0:
@example
hue="s=min(t/3\,1)"
@end example

The general fade-in expression can be written as:
@example
hue="s=min(0\, max((t-START)/DURATION\, 1))"
@end example

@item
Apply a 3 seconds saturation fade-out effect starting at 5 seconds:
@example
hue="s=max(0\, min(1\, (8-t)/3))"
@end example

The general fade-out expression can be written as:
@example
hue="s=max(0\, min(1\, (START+DURATION-t)/DURATION))"
@end example

@end itemize

@subsection Commands

This filter supports the following commands:
@table @option
@item b
@item s
@item h
@item H
Modify the hue and/or the saturation and/or brightness of the input video.
The command accepts the same syntax of the corresponding option.

If the specified expression is not valid, it is kept at its current
value.
@end table

@section hysteresis

Grow first stream into second stream by connecting components.
This makes it possible to build more robust edge masks.

This filter accepts the following options:

@table @option
@item planes
Set which planes will be processed as bitmap, unprocessed planes will be
copied from first stream.
By default value 0xf, all planes will be processed.

@item threshold
Set threshold which is used in filtering. If pixel component value is higher than
this value filter algorithm for connecting components is activated.
By default value is 0.
@end table

@section idet

Detect video interlacing type.

This filter tries to detect if the input frames are interlaced, progressive,
top or bottom field first. It will also try to detect fields that are
repeated between adjacent frames (a sign of telecine).

Single frame detection considers only immediately adjacent frames when classifying each frame.
Multiple frame detection incorporates the classification history of previous frames.

The filter will log these metadata values:

@table @option
@item single.current_frame
Detected type of current frame using single-frame detection. One of:
``tff'' (top field first), ``bff'' (bottom field first),
``progressive'', or ``undetermined''

@item single.tff
Cumulative number of frames detected as top field first using single-frame detection.

@item multiple.tff
Cumulative number of frames detected as top field first using multiple-frame detection.

@item single.bff
Cumulative number of frames detected as bottom field first using single-frame detection.

@item multiple.current_frame
Detected type of current frame using multiple-frame detection. One of:
``tff'' (top field first), ``bff'' (bottom field first),
``progressive'', or ``undetermined''

@item multiple.bff
Cumulative number of frames detected as bottom field first using multiple-frame detection.

@item single.progressive
Cumulative number of frames detected as progressive using single-frame detection.

@item multiple.progressive
Cumulative number of frames detected as progressive using multiple-frame detection.

@item single.undetermined
Cumulative number of frames that could not be classified using single-frame detection.

@item multiple.undetermined
Cumulative number of frames that could not be classified using multiple-frame detection.

@item repeated.current_frame
Which field in the current frame is repeated from the last. One of ``neither'', ``top'', or ``bottom''.

@item repeated.neither
Cumulative number of frames with no repeated field.

@item repeated.top
Cumulative number of frames with the top field repeated from the previous frame's top field.

@item repeated.bottom
Cumulative number of frames with the bottom field repeated from the previous frame's bottom field.
@end table

The filter accepts the following options:

@table @option
@item intl_thres
Set interlacing threshold.
@item prog_thres
Set progressive threshold.
@item rep_thres
Threshold for repeated field detection.
@item half_life
Number of frames after which a given frame's contribution to the
statistics is halved (i.e., it contributes only 0.5 to its
classification). The default of 0 means that all frames seen are given
full weight of 1.0 forever.
@item analyze_interlaced_flag
When this is not 0 then idet will use the specified number of frames to determine
if the interlaced flag is accurate, it will not count undetermined frames.
If the flag is found to be accurate it will be used without any further
computations, if it is found to be inaccurate it will be cleared without any
further computations. This allows inserting the idet filter as a low computational
method to clean up the interlaced flag
@end table

@section il

Deinterleave or interleave fields.

This filter allows one to process interlaced images fields without
deinterlacing them. Deinterleaving splits the input frame into 2
fields (so called half pictures). Odd lines are moved to the top
half of the output image, even lines to the bottom half.
You can process (filter) them independently and then re-interleave them.

The filter accepts the following options:

@table @option
@item luma_mode, l
@item chroma_mode, c
@item alpha_mode, a
Available values for @var{luma_mode}, @var{chroma_mode} and
@var{alpha_mode} are:

@table @samp
@item none
Do nothing.

@item deinterleave, d
Deinterleave fields, placing one above the other.

@item interleave, i
Interleave fields. Reverse the effect of deinterleaving.
@end table
Default value is @code{none}.

@item luma_swap, ls
@item chroma_swap, cs
@item alpha_swap, as
Swap luma/chroma/alpha fields. Exchange even & odd lines. Default value is @code{0}.
@end table

@section inflate

Apply inflate effect to the video.

This filter replaces the pixel by the local(3x3) average by taking into account
only values higher than the pixel.

It accepts the following options:

@table @option
@item threshold0
@item threshold1
@item threshold2
@item threshold3
Limit the maximum change for each plane, default is 65535.
If 0, plane will remain unchanged.
@end table

@section interlace

Simple interlacing filter from progressive contents. This interleaves upper (or
lower) lines from odd frames with lower (or upper) lines from even frames,
halving the frame rate and preserving image height.

@example
   Original        Original             New Frame
   Frame 'j'      Frame 'j+1'             (tff)
  ==========      ===========       ==================
    Line 0  -------------------->    Frame 'j' Line 0
    Line 1          Line 1  ---->   Frame 'j+1' Line 1
    Line 2 --------------------->    Frame 'j' Line 2
    Line 3          Line 3  ---->   Frame 'j+1' Line 3
     ...             ...                   ...
New Frame + 1 will be generated by Frame 'j+2' and Frame 'j+3' and so on
@end example

It accepts the following optional parameters:

@table @option
@item scan
This determines whether the interlaced frame is taken from the even
(tff - default) or odd (bff) lines of the progressive frame.

@item lowpass
Vertical lowpass filter to avoid twitter interlacing and
reduce moire patterns.

@table @samp
@item 0, off
Disable vertical lowpass filter

@item 1, linear
Enable linear filter (default)

@item 2, complex
Enable complex filter. This will slightly less reduce twitter and moire
but better retain detail and subjective sharpness impression.

@end table
@end table

@section kerndeint

Deinterlace input video by applying Donald Graft's adaptive kernel
deinterling. Work on interlaced parts of a video to produce
progressive frames.

The description of the accepted parameters follows.

@table @option
@item thresh
Set the threshold which affects the filter's tolerance when
determining if a pixel line must be processed. It must be an integer
in the range [0,255] and defaults to 10. A value of 0 will result in
applying the process on every pixels.

@item map
Paint pixels exceeding the threshold value to white if set to 1.
Default is 0.

@item order
Set the fields order. Swap fields if set to 1, leave fields alone if
0. Default is 0.

@item sharp
Enable additional sharpening if set to 1. Default is 0.

@item twoway
Enable twoway sharpening if set to 1. Default is 0.
@end table

@subsection Examples

@itemize
@item
Apply default values:
@example
kerndeint=thresh=10:map=0:order=0:sharp=0:twoway=0
@end example

@item
Enable additional sharpening:
@example
kerndeint=sharp=1
@end example

@item
Paint processed pixels in white:
@example
kerndeint=map=1
@end example
@end itemize

@section lenscorrection

Correct radial lens distortion

This filter can be used to correct for radial distortion as can result from the use
of wide angle lenses, and thereby re-rectify the image. To find the right parameters
one can use tools available for example as part of opencv or simply trial-and-error.
To use opencv use the calibration sample (under samples/cpp) from the opencv sources
and extract the k1 and k2 coefficients from the resulting matrix.

Note that effectively the same filter is available in the open-source tools Krita and
Digikam from the KDE project.

In contrast to the @ref{vignette} filter, which can also be used to compensate lens errors,
this filter corrects the distortion of the image, whereas @ref{vignette} corrects the
brightness distribution, so you may want to use both filters together in certain
cases, though you will have to take care of ordering, i.e. whether vignetting should
be applied before or after lens correction.

@subsection Options

The filter accepts the following options:

@table @option
@item cx
Relative x-coordinate of the focal point of the image, and thereby the center of the
distortion. This value has a range [0,1] and is expressed as fractions of the image
width. Default is 0.5.
@item cy
Relative y-coordinate of the focal point of the image, and thereby the center of the
distortion. This value has a range [0,1] and is expressed as fractions of the image
height. Default is 0.5.
@item k1
Coefficient of the quadratic correction term. This value has a range [-1,1]. 0 means
no correction. Default is 0.
@item k2
Coefficient of the double quadratic correction term. This value has a range [-1,1].
0 means no correction. Default is 0.
@end table

The formula that generates the correction is:

@var{r_src} = @var{r_tgt} * (1 + @var{k1} * (@var{r_tgt} / @var{r_0})^2 + @var{k2} * (@var{r_tgt} / @var{r_0})^4)

where @var{r_0} is halve of the image diagonal and @var{r_src} and @var{r_tgt} are the
distances from the focal point in the source and target images, respectively.

@section libvmaf

Obtain the VMAF (Video Multi-Method Assessment Fusion)
score between two input videos.

The obtained VMAF score is printed through the logging system.

It requires Netflix's vmaf library (libvmaf) as a pre-requisite.
After installing the library it can be enabled using:
@code{./configure --enable-libvmaf}.
If no model path is specified it uses the default model: @code{vmaf_v0.6.1.pkl}.

The filter has following options:

@table @option
@item model_path
Set the model path which is to be used for SVM.
Default value: @code{"vmaf_v0.6.1.pkl"}

@item log_path
Set the file path to be used to store logs.

@item log_fmt
Set the format of the log file (xml or json).

@item enable_transform
Enables transform for computing vmaf.

@item phone_model
Invokes the phone model which will generate VMAF scores higher than in the
regular model, which is more suitable for laptop, TV, etc. viewing conditions.

@item psnr
Enables computing psnr along with vmaf.

@item ssim
Enables computing ssim along with vmaf.

@item ms_ssim
Enables computing ms_ssim along with vmaf.

@item pool
Set the pool method (mean, min or harmonic mean) to be used for computing vmaf.
@end table

This filter also supports the @ref{framesync} options.

On the below examples the input file @file{main.mpg} being processed is
compared with the reference file @file{ref.mpg}.

@example
ffmpeg -i main.mpg -i ref.mpg -lavfi libvmaf -f null -
@end example

Example with options:
@example
ffmpeg -i main.mpg -i ref.mpg -lavfi libvmaf="psnr=1:enable-transform=1" -f null -
@end example

@section limiter

Limits the pixel components values to the specified range [min, max].

The filter accepts the following options:

@table @option
@item min
Lower bound. Defaults to the lowest allowed value for the input.

@item max
Upper bound. Defaults to the highest allowed value for the input.

@item planes
Specify which planes will be processed. Defaults to all available.
@end table

@section loop

Loop video frames.

The filter accepts the following options:

@table @option
@item loop
Set the number of loops. Setting this value to -1 will result in infinite loops.
Default is 0.

@item size
Set maximal size in number of frames. Default is 0.

@item start
Set first frame of loop. Default is 0.
@end table

@anchor{lut3d}
@section lut3d

Apply a 3D LUT to an input video.

The filter accepts the following options:

@table @option
@item file
Set the 3D LUT file name.

Currently supported formats:
@table @samp
@item 3dl
AfterEffects
@item cube
Iridas
@item dat
DaVinci
@item m3d
Pandora
@end table
@item interp
Select interpolation mode.

Available values are:

@table @samp
@item nearest
Use values from the nearest defined point.
@item trilinear
Interpolate values using the 8 points defining a cube.
@item tetrahedral
Interpolate values using a tetrahedron.
@end table
@end table

This filter also supports the @ref{framesync} options.

@section lumakey

Turn certain luma values into transparency.

The filter accepts the following options:

@table @option
@item threshold
Set the luma which will be used as base for transparency.
Default value is @code{0}.

@item tolerance
Set the range of luma values to be keyed out.
Default value is @code{0}.

@item softness
Set the range of softness. Default value is @code{0}.
Use this to control gradual transition from zero to full transparency.
@end table

@section lut, lutrgb, lutyuv

Compute a look-up table for binding each pixel component input value
to an output value, and apply it to the input video.

@var{lutyuv} applies a lookup table to a YUV input video, @var{lutrgb}
to an RGB input video.

These filters accept the following parameters:
@table @option
@item c0
set first pixel component expression
@item c1
set second pixel component expression
@item c2
set third pixel component expression
@item c3
set fourth pixel component expression, corresponds to the alpha component

@item r
set red component expression
@item g
set green component expression
@item b
set blue component expression
@item a
alpha component expression

@item y
set Y/luminance component expression
@item u
set U/Cb component expression
@item v
set V/Cr component expression
@end table

Each of them specifies the expression to use for computing the lookup table for
the corresponding pixel component values.

The exact component associated to each of the @var{c*} options depends on the
format in input.

The @var{lut} filter requires either YUV or RGB pixel formats in input,
@var{lutrgb} requires RGB pixel formats in input, and @var{lutyuv} requires YUV.

The expressions can contain the following constants and functions:

@table @option
@item w
@item h
The input width and height.

@item val
The input value for the pixel component.

@item clipval
The input value, clipped to the @var{minval}-@var{maxval} range.

@item maxval
The maximum value for the pixel component.

@item minval
The minimum value for the pixel component.

@item negval
The negated value for the pixel component value, clipped to the
@var{minval}-@var{maxval} range; it corresponds to the expression
"maxval-clipval+minval".

@item clip(val)
The computed value in @var{val}, clipped to the
@var{minval}-@var{maxval} range.

@item gammaval(gamma)
The computed gamma correction value of the pixel component value,
clipped to the @var{minval}-@var{maxval} range. It corresponds to the
expression
"pow((clipval-minval)/(maxval-minval)\,@var{gamma})*(maxval-minval)+minval"

@end table

All expressions default to "val".

@subsection Examples

@itemize
@item
Negate input video:
@example
lutrgb="r=maxval+minval-val:g=maxval+minval-val:b=maxval+minval-val"
lutyuv="y=maxval+minval-val:u=maxval+minval-val:v=maxval+minval-val"
@end example

The above is the same as:
@example
lutrgb="r=negval:g=negval:b=negval"
lutyuv="y=negval:u=negval:v=negval"
@end example

@item
Negate luminance:
@example
lutyuv=y=negval
@end example

@item
Remove chroma components, turning the video into a graytone image:
@example
lutyuv="u=128:v=128"
@end example

@item
Apply a luma burning effect:
@example
lutyuv="y=2*val"
@end example

@item
Remove green and blue components:
@example
lutrgb="g=0:b=0"
@end example

@item
Set a constant alpha channel value on input:
@example
format=rgba,lutrgb=a="maxval-minval/2"
@end example

@item
Correct luminance gamma by a factor of 0.5:
@example
lutyuv=y=gammaval(0.5)
@end example

@item
Discard least significant bits of luma:
@example
lutyuv=y='bitand(val, 128+64+32)'
@end example

@item
Technicolor like effect:
@example
lutyuv=u='(val-maxval/2)*2+maxval/2':v='(val-maxval/2)*2+maxval/2'
@end example
@end itemize

@section lut2, tlut2

The @code{lut2} filter takes two input streams and outputs one
stream.

The @code{tlut2} (time lut2) filter takes two consecutive frames
from one single stream.

This filter accepts the following parameters:
@table @option
@item c0
set first pixel component expression
@item c1
set second pixel component expression
@item c2
set third pixel component expression
@item c3
set fourth pixel component expression, corresponds to the alpha component
@end table

Each of them specifies the expression to use for computing the lookup table for
the corresponding pixel component values.

The exact component associated to each of the @var{c*} options depends on the
format in inputs.

The expressions can contain the following constants:

@table @option
@item w
@item h
The input width and height.

@item x
The first input value for the pixel component.

@item y
The second input value for the pixel component.

@item bdx
The first input video bit depth.

@item bdy
The second input video bit depth.
@end table

All expressions default to "x".

@subsection Examples

@itemize
@item
Highlight differences between two RGB video streams:
@example
lut2='ifnot(x-y,0,pow(2,bdx)-1):ifnot(x-y,0,pow(2,bdx)-1):ifnot(x-y,0,pow(2,bdx)-1)'
@end example

@item
Highlight differences between two YUV video streams:
@example
lut2='ifnot(x-y,0,pow(2,bdx)-1):ifnot(x-y,pow(2,bdx-1),pow(2,bdx)-1):ifnot(x-y,pow(2,bdx-1),pow(2,bdx)-1)'
@end example

@item
Show max difference between two video streams:
@example
lut2='if(lt(x,y),0,if(gt(x,y),pow(2,bdx)-1,pow(2,bdx-1))):if(lt(x,y),0,if(gt(x,y),pow(2,bdx)-1,pow(2,bdx-1))):if(lt(x,y),0,if(gt(x,y),pow(2,bdx)-1,pow(2,bdx-1)))'
@end example
@end itemize

@section maskedclamp

Clamp the first input stream with the second input and third input stream.

Returns the value of first stream to be between second input
stream - @code{undershoot} and third input stream + @code{overshoot}.

This filter accepts the following options:
@table @option
@item undershoot
Default value is @code{0}.

@item overshoot
Default value is @code{0}.

@item planes
Set which planes will be processed as bitmap, unprocessed planes will be
copied from first stream.
By default value 0xf, all planes will be processed.
@end table

@section maskedmerge

Merge the first input stream with the second input stream using per pixel
weights in the third input stream.

A value of 0 in the third stream pixel component means that pixel component
from first stream is returned unchanged, while maximum value (eg. 255 for
8-bit videos) means that pixel component from second stream is returned
unchanged. Intermediate values define the amount of merging between both
input stream's pixel components.

This filter accepts the following options:
@table @option
@item planes
Set which planes will be processed as bitmap, unprocessed planes will be
copied from first stream.
By default value 0xf, all planes will be processed.
@end table

@section mcdeint

Apply motion-compensation deinterlacing.

It needs one field per frame as input and must thus be used together
with yadif=1/3 or equivalent.

This filter accepts the following options:
@table @option
@item mode
Set the deinterlacing mode.

It accepts one of the following values:
@table @samp
@item fast
@item medium
@item slow
use iterative motion estimation
@item extra_slow
like @samp{slow}, but use multiple reference frames.
@end table
Default value is @samp{fast}.

@item parity
Set the picture field parity assumed for the input video. It must be
one of the following values:

@table @samp
@item 0, tff
assume top field first
@item 1, bff
assume bottom field first
@end table

Default value is @samp{bff}.

@item qp
Set per-block quantization parameter (QP) used by the internal
encoder.

Higher values should result in a smoother motion vector field but less
optimal individual vectors. Default value is 1.
@end table

@section mergeplanes

Merge color channel components from several video streams.

The filter accepts up to 4 input streams, and merge selected input
planes to the output video.

This filter accepts the following options:
@table @option
@item mapping
Set input to output plane mapping. Default is @code{0}.

The mappings is specified as a bitmap. It should be specified as a
hexadecimal number in the form 0xAa[Bb[Cc[Dd]]]. 'Aa' describes the
mapping for the first plane of the output stream. 'A' sets the number of
the input stream to use (from 0 to 3), and 'a' the plane number of the
corresponding input to use (from 0 to 3). The rest of the mappings is
similar, 'Bb' describes the mapping for the output stream second
plane, 'Cc' describes the mapping for the output stream third plane and
'Dd' describes the mapping for the output stream fourth plane.

@item format
Set output pixel format. Default is @code{yuva444p}.
@end table

@subsection Examples

@itemize
@item
Merge three gray video streams of same width and height into single video stream:
@example
[a0][a1][a2]mergeplanes=0x001020:yuv444p
@end example

@item
Merge 1st yuv444p stream and 2nd gray video stream into yuva444p video stream:
@example
[a0][a1]mergeplanes=0x00010210:yuva444p
@end example

@item
Swap Y and A plane in yuva444p stream:
@example
format=yuva444p,mergeplanes=0x03010200:yuva444p
@end example

@item
Swap U and V plane in yuv420p stream:
@example
format=yuv420p,mergeplanes=0x000201:yuv420p
@end example

@item
Cast a rgb24 clip to yuv444p:
@example
format=rgb24,mergeplanes=0x000102:yuv444p
@end example
@end itemize

@section mestimate

Estimate and export motion vectors using block matching algorithms.
Motion vectors are stored in frame side data to be used by other filters.

This filter accepts the following options:
@table @option
@item method
Specify the motion estimation method. Accepts one of the following values:

@table @samp
@item esa
Exhaustive search algorithm.
@item tss
Three step search algorithm.
@item tdls
Two dimensional logarithmic search algorithm.
@item ntss
New three step search algorithm.
@item fss
Four step search algorithm.
@item ds
Diamond search algorithm.
@item hexbs
Hexagon-based search algorithm.
@item epzs
Enhanced predictive zonal search algorithm.
@item umh
Uneven multi-hexagon search algorithm.
@end table
Default value is @samp{esa}.

@item mb_size
Macroblock size. Default @code{16}.

@item search_param
Search parameter. Default @code{7}.
@end table

@section midequalizer

Apply Midway Image Equalization effect using two video streams.

Midway Image Equalization adjusts a pair of images to have the same
histogram, while maintaining their dynamics as much as possible. It's
useful for e.g. matching exposures from a pair of stereo cameras.

This filter has two inputs and one output, which must be of same pixel format, but
may be of different sizes. The output of filter is first input adjusted with
midway histogram of both inputs.

This filter accepts the following option:

@table @option
@item planes
Set which planes to process. Default is @code{15}, which is all available planes.
@end table

@section minterpolate

Convert the video to specified frame rate using motion interpolation.

This filter accepts the following options:
@table @option
@item fps
Specify the output frame rate. This can be rational e.g. @code{60000/1001}. Frames are dropped if @var{fps} is lower than source fps. Default @code{60}.

@item mi_mode
Motion interpolation mode. Following values are accepted:
@table @samp
@item dup
Duplicate previous or next frame for interpolating new ones.
@item blend
Blend source frames. Interpolated frame is mean of previous and next frames.
@item mci
Motion compensated interpolation. Following options are effective when this mode is selected:

@table @samp
@item mc_mode
Motion compensation mode. Following values are accepted:
@table @samp
@item obmc
Overlapped block motion compensation.
@item aobmc
Adaptive overlapped block motion compensation. Window weighting coefficients are controlled adaptively according to the reliabilities of the neighboring motion vectors to reduce oversmoothing.
@end table
Default mode is @samp{obmc}.

@item me_mode
Motion estimation mode. Following values are accepted:
@table @samp
@item bidir
Bidirectional motion estimation. Motion vectors are estimated for each source frame in both forward and backward directions.
@item bilat
Bilateral motion estimation. Motion vectors are estimated directly for interpolated frame.
@end table
Default mode is @samp{bilat}.

@item me
The algorithm to be used for motion estimation. Following values are accepted:
@table @samp
@item esa
Exhaustive search algorithm.
@item tss
Three step search algorithm.
@item tdls
Two dimensional logarithmic search algorithm.
@item ntss
New three step search algorithm.
@item fss
Four step search algorithm.
@item ds
Diamond search algorithm.
@item hexbs
Hexagon-based search algorithm.
@item epzs
Enhanced predictive zonal search algorithm.
@item umh
Uneven multi-hexagon search algorithm.
@end table
Default algorithm is @samp{epzs}.

@item mb_size
Macroblock size. Default @code{16}.

@item search_param
Motion estimation search parameter. Default @code{32}.

@item vsbmc
Enable variable-size block motion compensation. Motion estimation is applied with smaller block sizes at object boundaries in order to make the them less blur. Default is @code{0} (disabled).
@end table
@end table

@item scd
Scene change detection method. Scene change leads motion vectors to be in random direction. Scene change detection replace interpolated frames by duplicate ones. May not be needed for other modes. Following values are accepted:
@table @samp
@item none
Disable scene change detection.
@item fdiff
Frame difference. Corresponding pixel values are compared and if it satisfies @var{scd_threshold} scene change is detected.
@end table
Default method is @samp{fdiff}.

@item scd_threshold
Scene change detection threshold. Default is @code{5.0}.
@end table

@section mix

Mix several video input streams into one video stream.

A description of the accepted options follows.

@table @option
@item nb_inputs
The number of inputs. If unspecified, it defaults to 2.

@item weights
Specify weight of each input video stream as sequence.
Each weight is separated by space.

@item duration
Specify how end of stream is determined.
@table @samp
@item longest
The duration of the longest input. (default)

@item shortest
The duration of the shortest input.

@item first
The duration of the first input.
@end table
@end table

@section mpdecimate

Drop frames that do not differ greatly from the previous frame in
order to reduce frame rate.

The main use of this filter is for very-low-bitrate encoding
(e.g. streaming over dialup modem), but it could in theory be used for
fixing movies that were inverse-telecined incorrectly.

A description of the accepted options follows.

@table @option
@item max
Set the maximum number of consecutive frames which can be dropped (if
positive), or the minimum interval between dropped frames (if
negative). If the value is 0, the frame is dropped disregarding the
number of previous sequentially dropped frames.

Default value is 0.

@item hi
@item lo
@item frac
Set the dropping threshold values.

Values for @option{hi} and @option{lo} are for 8x8 pixel blocks and
represent actual pixel value differences, so a threshold of 64
corresponds to 1 unit of difference for each pixel, or the same spread
out differently over the block.

A frame is a candidate for dropping if no 8x8 blocks differ by more
than a threshold of @option{hi}, and if no more than @option{frac} blocks (1
meaning the whole image) differ by more than a threshold of @option{lo}.

Default value for @option{hi} is 64*12, default value for @option{lo} is
64*5, and default value for @option{frac} is 0.33.
@end table


@section negate

Negate input video.

It accepts an integer in input; if non-zero it negates the
alpha component (if available). The default value in input is 0.

@section nlmeans

Denoise frames using Non-Local Means algorithm.

Each pixel is adjusted by looking for other pixels with similar contexts. This
context similarity is defined by comparing their surrounding patches of size
@option{p}x@option{p}. Patches are searched in an area of @option{r}x@option{r}
around the pixel.

Note that the research area defines centers for patches, which means some
patches will be made of pixels outside that research area.

The filter accepts the following options.

@table @option
@item s
Set denoising strength.

@item p
Set patch size.

@item pc
Same as @option{p} but for chroma planes.

The default value is @var{0} and means automatic.

@item r
Set research size.

@item rc
Same as @option{r} but for chroma planes.

The default value is @var{0} and means automatic.
@end table

@section nnedi

Deinterlace video using neural network edge directed interpolation.

This filter accepts the following options:

@table @option
@item weights
Mandatory option, without binary file filter can not work.
Currently file can be found here:
https://github.com/dubhater/vapoursynth-nnedi3/blob/master/src/nnedi3_weights.bin

@item deint
Set which frames to deinterlace, by default it is @code{all}.
Can be @code{all} or @code{interlaced}.

@item field
Set mode of operation.

Can be one of the following:

@table @samp
@item af
Use frame flags, both fields.
@item a
Use frame flags, single field.
@item t
Use top field only.
@item b
Use bottom field only.
@item tf
Use both fields, top first.
@item bf
Use both fields, bottom first.
@end table

@item planes
Set which planes to process, by default filter process all frames.

@item nsize
Set size of local neighborhood around each pixel, used by the predictor neural
network.

Can be one of the following:

@table @samp
@item s8x6
@item s16x6
@item s32x6
@item s48x6
@item s8x4
@item s16x4
@item s32x4
@end table

@item nns
Set the number of neurons in predictor neural network.
Can be one of the following:

@table @samp
@item n16
@item n32
@item n64
@item n128
@item n256
@end table

@item qual
Controls the number of different neural network predictions that are blended
together to compute the final output value. Can be @code{fast}, default or
@code{slow}.

@item etype
Set which set of weights to use in the predictor.
Can be one of the following:

@table @samp
@item a
weights trained to minimize absolute error
@item s
weights trained to minimize squared error
@end table

@item pscrn
Controls whether or not the prescreener neural network is used to decide
which pixels should be processed by the predictor neural network and which
can be handled by simple cubic interpolation.
The prescreener is trained to know whether cubic interpolation will be
sufficient for a pixel or whether it should be predicted by the predictor nn.
The computational complexity of the prescreener nn is much less than that of
the predictor nn. Since most pixels can be handled by cubic interpolation,
using the prescreener generally results in much faster processing.
The prescreener is pretty accurate, so the difference between using it and not
using it is almost always unnoticeable.

Can be one of the following:

@table @samp
@item none
@item original
@item new
@end table

Default is @code{new}.

@item fapprox
Set various debugging flags.
@end table

@section noformat

Force libavfilter not to use any of the specified pixel formats for the
input to the next filter.

It accepts the following parameters:
@table @option

@item pix_fmts
A '|'-separated list of pixel format names, such as
pix_fmts=yuv420p|monow|rgb24".

@end table

@subsection Examples

@itemize
@item
Force libavfilter to use a format different from @var{yuv420p} for the
input to the vflip filter:
@example
noformat=pix_fmts=yuv420p,vflip
@end example

@item
Convert the input video to any of the formats not contained in the list:
@example
noformat=yuv420p|yuv444p|yuv410p
@end example
@end itemize

@section noise

Add noise on video input frame.

The filter accepts the following options:

@table @option
@item all_seed
@item c0_seed
@item c1_seed
@item c2_seed
@item c3_seed
Set noise seed for specific pixel component or all pixel components in case
of @var{all_seed}. Default value is @code{123457}.

@item all_strength, alls
@item c0_strength, c0s
@item c1_strength, c1s
@item c2_strength, c2s
@item c3_strength, c3s
Set noise strength for specific pixel component or all pixel components in case
@var{all_strength}. Default value is @code{0}. Allowed range is [0, 100].

@item all_flags, allf
@item c0_flags, c0f
@item c1_flags, c1f
@item c2_flags, c2f
@item c3_flags, c3f
Set pixel component flags or set flags for all components if @var{all_flags}.
Available values for component flags are:
@table @samp
@item a
averaged temporal noise (smoother)
@item p
mix random noise with a (semi)regular pattern
@item t
temporal noise (noise pattern changes between frames)
@item u
uniform noise (gaussian otherwise)
@end table
@end table

@subsection Examples

Add temporal and uniform noise to input video:
@example
noise=alls=20:allf=t+u
@end example

@section normalize

Normalize RGB video (aka histogram stretching, contrast stretching).
See: https://en.wikipedia.org/wiki/Normalization_(image_processing)

For each channel of each frame, the filter computes the input range and maps
it linearly to the user-specified output range. The output range defaults
to the full dynamic range from pure black to pure white.

Temporal smoothing can be used on the input range to reduce flickering (rapid
changes in brightness) caused when small dark or bright objects enter or leave
the scene. This is similar to the auto-exposure (automatic gain control) on a
video camera, and, like a video camera, it may cause a period of over- or
under-exposure of the video.

The R,G,B channels can be normalized independently, which may cause some
color shifting, or linked together as a single channel, which prevents
color shifting. Linked normalization preserves hue. Independent normalization
does not, so it can be used to remove some color casts. Independent and linked
normalization can be combined in any ratio.

The normalize filter accepts the following options:

@table @option
@item blackpt
@item whitept
Colors which define the output range. The minimum input value is mapped to
the @var{blackpt}. The maximum input value is mapped to the @var{whitept}.
The defaults are black and white respectively. Specifying white for
@var{blackpt} and black for @var{whitept} will give color-inverted,
normalized video. Shades of grey can be used to reduce the dynamic range
(contrast). Specifying saturated colors here can create some interesting
effects.

@item smoothing
The number of previous frames to use for temporal smoothing. The input range
of each channel is smoothed using a rolling average over the current frame
and the @var{smoothing} previous frames. The default is 0 (no temporal
smoothing).

@item independence
Controls the ratio of independent (color shifting) channel normalization to
linked (color preserving) normalization. 0.0 is fully linked, 1.0 is fully
independent. Defaults to 1.0 (fully independent).

@item strength
Overall strength of the filter. 1.0 is full strength. 0.0 is a rather
expensive no-op. Defaults to 1.0 (full strength).

@end table

@subsection Examples

Stretch video contrast to use the full dynamic range, with no temporal
smoothing; may flicker depending on the source content:
@example
normalize=blackpt=black:whitept=white:smoothing=0
@end example

As above, but with 50 frames of temporal smoothing; flicker should be
reduced, depending on the source content:
@example
normalize=blackpt=black:whitept=white:smoothing=50
@end example

As above, but with hue-preserving linked channel normalization:
@example
normalize=blackpt=black:whitept=white:smoothing=50:independence=0
@end example

As above, but with half strength:
@example
normalize=blackpt=black:whitept=white:smoothing=50:independence=0:strength=0.5
@end example

Map the darkest input color to red, the brightest input color to cyan:
@example
normalize=blackpt=red:whitept=cyan
@end example

@section null

Pass the video source unchanged to the output.

@section ocr
Optical Character Recognition

This filter uses Tesseract for optical character recognition.

It accepts the following options:

@table @option
@item datapath
Set datapath to tesseract data. Default is to use whatever was
set at installation.

@item language
Set language, default is "eng".

@item whitelist
Set character whitelist.

@item blacklist
Set character blacklist.
@end table

The filter exports recognized text as the frame metadata @code{lavfi.ocr.text}.

@section ocv

Apply a video transform using libopencv.

To enable this filter, install the libopencv library and headers and
configure FFmpeg with @code{--enable-libopencv}.

It accepts the following parameters:

@table @option

@item filter_name
The name of the libopencv filter to apply.

@item filter_params
The parameters to pass to the libopencv filter. If not specified, the default
values are assumed.

@end table

Refer to the official libopencv documentation for more precise
information:
@url{http://docs.opencv.org/master/modules/imgproc/doc/filtering.html}

Several libopencv filters are supported; see the following subsections.

@anchor{dilate}
@subsection dilate

Dilate an image by using a specific structuring element.
It corresponds to the libopencv function @code{cvDilate}.

It accepts the parameters: @var{struct_el}|@var{nb_iterations}.

@var{struct_el} represents a structuring element, and has the syntax:
@var{cols}x@var{rows}+@var{anchor_x}x@var{anchor_y}/@var{shape}

@var{cols} and @var{rows} represent the number of columns and rows of
the structuring element, @var{anchor_x} and @var{anchor_y} the anchor
point, and @var{shape} the shape for the structuring element. @var{shape}
must be "rect", "cross", "ellipse", or "custom".

If the value for @var{shape} is "custom", it must be followed by a
string of the form "=@var{filename}". The file with name
@var{filename} is assumed to represent a binary image, with each
printable character corresponding to a bright pixel. When a custom
@var{shape} is used, @var{cols} and @var{rows} are ignored, the number
or columns and rows of the read file are assumed instead.

The default value for @var{struct_el} is "3x3+0x0/rect".

@var{nb_iterations} specifies the number of times the transform is
applied to the image, and defaults to 1.

Some examples:
@example
# Use the default values
ocv=dilate

# Dilate using a structuring element with a 5x5 cross, iterating two times
ocv=filter_name=dilate:filter_params=5x5+2x2/cross|2

# Read the shape from the file diamond.shape, iterating two times.
# The file diamond.shape may contain a pattern of characters like this
#   *
#  ***
# *****
#  ***
#   *
# The specified columns and rows are ignored
# but the anchor point coordinates are not
ocv=dilate:0x0+2x2/custom=diamond.shape|2
@end example

@subsection erode

Erode an image by using a specific structuring element.
It corresponds to the libopencv function @code{cvErode}.

It accepts the parameters: @var{struct_el}:@var{nb_iterations},
with the same syntax and semantics as the @ref{dilate} filter.

@subsection smooth

Smooth the input video.

The filter takes the following parameters:
@var{type}|@var{param1}|@var{param2}|@var{param3}|@var{param4}.

@var{type} is the type of smooth filter to apply, and must be one of
the following values: "blur", "blur_no_scale", "median", "gaussian",
or "bilateral". The default value is "gaussian".

The meaning of @var{param1}, @var{param2}, @var{param3}, and @var{param4}
depend on the smooth type. @var{param1} and
@var{param2} accept integer positive values or 0. @var{param3} and
@var{param4} accept floating point values.

The default value for @var{param1} is 3. The default value for the
other parameters is 0.

These parameters correspond to the parameters assigned to the
libopencv function @code{cvSmooth}.

@section oscilloscope

2D Video Oscilloscope.

Useful to measure spatial impulse, step responses, chroma delays, etc.

It accepts the following parameters:

@table @option
@item x
Set scope center x position.

@item y
Set scope center y position.

@item s
Set scope size, relative to frame diagonal.

@item t
Set scope tilt/rotation.

@item o
Set trace opacity.

@item tx
Set trace center x position.

@item ty
Set trace center y position.

@item tw
Set trace width, relative to width of frame.

@item th
Set trace height, relative to height of frame.

@item c
Set which components to trace. By default it traces first three components.

@item g
Draw trace grid. By default is enabled.

@item st
Draw some statistics. By default is enabled.

@item sc
Draw scope. By default is enabled.
@end table

@subsection Examples

@itemize
@item
Inspect full first row of video frame.
@example
oscilloscope=x=0.5:y=0:s=1
@end example

@item
Inspect full last row of video frame.
@example
oscilloscope=x=0.5:y=1:s=1
@end example

@item
Inspect full 5th line of video frame of height 1080.
@example
oscilloscope=x=0.5:y=5/1080:s=1
@end example

@item
Inspect full last column of video frame.
@example
oscilloscope=x=1:y=0.5:s=1:t=1
@end example

@end itemize

@anchor{overlay}
@section overlay

Overlay one video on top of another.

It takes two inputs and has one output. The first input is the "main"
video on which the second input is overlaid.

It accepts the following parameters:

A description of the accepted options follows.

@table @option
@item x
@item y
Set the expression for the x and y coordinates of the overlaid video
on the main video. Default value is "0" for both expressions. In case
the expression is invalid, it is set to a huge value (meaning that the
overlay will not be displayed within the output visible area).

@item eof_action
See @ref{framesync}.

@item eval
Set when the expressions for @option{x}, and @option{y} are evaluated.

It accepts the following values:
@table @samp
@item init
only evaluate expressions once during the filter initialization or
when a command is processed

@item frame
evaluate expressions for each incoming frame
@end table

Default value is @samp{frame}.

@item shortest
See @ref{framesync}.

@item format
Set the format for the output video.

It accepts the following values:
@table @samp
@item yuv420
force YUV420 output

@item yuv422
force YUV422 output

@item yuv444
force YUV444 output

@item rgb
force packed RGB output

@item gbrp
force planar RGB output

@item auto
automatically pick format
@end table

Default value is @samp{yuv420}.

@item repeatlast
See @ref{framesync}.

@item alpha
Set format of alpha of the overlaid video, it can be @var{straight} or
@var{premultiplied}. Default is @var{straight}.
@end table

The @option{x}, and @option{y} expressions can contain the following
parameters.

@table @option
@item main_w, W
@item main_h, H
The main input width and height.

@item overlay_w, w
@item overlay_h, h
The overlay input width and height.

@item x
@item y
The computed values for @var{x} and @var{y}. They are evaluated for
each new frame.

@item hsub
@item vsub
horizontal and vertical chroma subsample values of the output
format. For example for the pixel format "yuv422p" @var{hsub} is 2 and
@var{vsub} is 1.

@item n
the number of input frame, starting from 0

@item pos
the position in the file of the input frame, NAN if unknown

@item t
The timestamp, expressed in seconds. It's NAN if the input timestamp is unknown.

@end table

This filter also supports the @ref{framesync} options.

Note that the @var{n}, @var{pos}, @var{t} variables are available only
when evaluation is done @emph{per frame}, and will evaluate to NAN
when @option{eval} is set to @samp{init}.

Be aware that frames are taken from each input video in timestamp
order, hence, if their initial timestamps differ, it is a good idea
to pass the two inputs through a @var{setpts=PTS-STARTPTS} filter to
have them begin in the same zero timestamp, as the example for
the @var{movie} filter does.

You can chain together more overlays but you should test the
efficiency of such approach.

@subsection Commands

This filter supports the following commands:
@table @option
@item x
@item y
Modify the x and y of the overlay input.
The command accepts the same syntax of the corresponding option.

If the specified expression is not valid, it is kept at its current
value.
@end table

@subsection Examples

@itemize
@item
Draw the overlay at 10 pixels from the bottom right corner of the main
video:
@example
overlay=main_w-overlay_w-10:main_h-overlay_h-10
@end example

Using named options the example above becomes:
@example
overlay=x=main_w-overlay_w-10:y=main_h-overlay_h-10
@end example

@item
Insert a transparent PNG logo in the bottom left corner of the input,
using the @command{ffmpeg} tool with the @code{-filter_complex} option:
@example
ffmpeg -i input -i logo -filter_complex 'overlay=10:main_h-overlay_h-10' output
@end example

@item
Insert 2 different transparent PNG logos (second logo on bottom
right corner) using the @command{ffmpeg} tool:
@example
ffmpeg -i input -i logo1 -i logo2 -filter_complex 'overlay=x=10:y=H-h-10,overlay=x=W-w-10:y=H-h-10' output
@end example

@item
Add a transparent color layer on top of the main video; @code{WxH}
must specify the size of the main input to the overlay filter:
@example
color=color=red@@.3:size=WxH [over]; [in][over] overlay [out]
@end example

@item
Play an original video and a filtered version (here with the deshake
filter) side by side using the @command{ffplay} tool:
@example
ffplay input.avi -vf 'split[a][b]; [a]pad=iw*2:ih[src]; [b]deshake[filt]; [src][filt]overlay=w'
@end example

The above command is the same as:
@example
ffplay input.avi -vf 'split[b], pad=iw*2[src], [b]deshake, [src]overlay=w'
@end example

@item
Make a sliding overlay appearing from the left to the right top part of the
screen starting since time 2:
@example
overlay=x='if(gte(t,2), -w+(t-2)*20, NAN)':y=0
@end example

@item
Compose output by putting two input videos side to side:
@example
ffmpeg -i left.avi -i right.avi -filter_complex "
nullsrc=size=200x100 [background];
[0:v] setpts=PTS-STARTPTS, scale=100x100 [left];
[1:v] setpts=PTS-STARTPTS, scale=100x100 [right];
[background][left]       overlay=shortest=1       [background+left];
[background+left][right] overlay=shortest=1:x=100 [left+right]
"
@end example

@item
Mask 10-20 seconds of a video by applying the delogo filter to a section
@example
ffmpeg -i test.avi -codec:v:0 wmv2 -ar 11025 -b:v 9000k
-vf '[in]split[split_main][split_delogo];[split_delogo]trim=start=360:end=371,delogo=0:0:640:480[delogoed];[split_main][delogoed]overlay=eof_action=pass[out]'
masked.avi
@end example

@item
Chain several overlays in cascade:
@example
nullsrc=s=200x200 [bg];
testsrc=s=100x100, split=4 [in0][in1][in2][in3];
[in0] lutrgb=r=0, [bg]   overlay=0:0     [mid0];
[in1] lutrgb=g=0, [mid0] overlay=100:0   [mid1];
[in2] lutrgb=b=0, [mid1] overlay=0:100   [mid2];
[in3] null,       [mid2] overlay=100:100 [out0]
@end example

@end itemize

@section owdenoise

Apply Overcomplete Wavelet denoiser.

The filter accepts the following options:

@table @option
@item depth
Set depth.

Larger depth values will denoise lower frequency components more, but
slow down filtering.

Must be an int in the range 8-16, default is @code{8}.

@item luma_strength, ls
Set luma strength.

Must be a double value in the range 0-1000, default is @code{1.0}.

@item chroma_strength, cs
Set chroma strength.

Must be a double value in the range 0-1000, default is @code{1.0}.
@end table

@anchor{pad}
@section pad

Add paddings to the input image, and place the original input at the
provided @var{x}, @var{y} coordinates.

It accepts the following parameters:

@table @option
@item width, w
@item height, h
Specify an expression for the size of the output image with the
paddings added. If the value for @var{width} or @var{height} is 0, the
corresponding input size is used for the output.

The @var{width} expression can reference the value set by the
@var{height} expression, and vice versa.

The default value of @var{width} and @var{height} is 0.

@item x
@item y
Specify the offsets to place the input image at within the padded area,
with respect to the top/left border of the output image.

The @var{x} expression can reference the value set by the @var{y}
expression, and vice versa.

The default value of @var{x} and @var{y} is 0.

If @var{x} or @var{y} evaluate to a negative number, they'll be changed
so the input image is centered on the padded area.

@item color
Specify the color of the padded area. For the syntax of this option,
check the @ref{color syntax,,"Color" section in the ffmpeg-utils
manual,ffmpeg-utils}.

The default value of @var{color} is "black".

@item eval
Specify when to evaluate  @var{width}, @var{height}, @var{x} and @var{y} expression.

It accepts the following values:

@table @samp
@item init
Only evaluate expressions once during the filter initialization or when
a command is processed.

@item frame
Evaluate expressions for each incoming frame.

@end table

Default value is @samp{init}.

@item aspect
Pad to aspect instead to a resolution.

@end table

The value for the @var{width}, @var{height}, @var{x}, and @var{y}
options are expressions containing the following constants:

@table @option
@item in_w
@item in_h
The input video width and height.

@item iw
@item ih
These are the same as @var{in_w} and @var{in_h}.

@item out_w
@item out_h
The output width and height (the size of the padded area), as
specified by the @var{width} and @var{height} expressions.

@item ow
@item oh
These are the same as @var{out_w} and @var{out_h}.

@item x
@item y
The x and y offsets as specified by the @var{x} and @var{y}
expressions, or NAN if not yet specified.

@item a
same as @var{iw} / @var{ih}

@item sar
input sample aspect ratio

@item dar
input display aspect ratio, it is the same as (@var{iw} / @var{ih}) * @var{sar}

@item hsub
@item vsub
The horizontal and vertical chroma subsample values. For example for the
pixel format "yuv422p" @var{hsub} is 2 and @var{vsub} is 1.
@end table

@subsection Examples

@itemize
@item
Add paddings with the color "violet" to the input video. The output video
size is 640x480, and the top-left corner of the input video is placed at
column 0, row 40
@example
pad=640:480:0:40:violet
@end example

The example above is equivalent to the following command:
@example
pad=width=640:height=480:x=0:y=40:color=violet
@end example

@item
Pad the input to get an output with dimensions increased by 3/2,
and put the input video at the center of the padded area:
@example
pad="3/2*iw:3/2*ih:(ow-iw)/2:(oh-ih)/2"
@end example

@item
Pad the input to get a squared output with size equal to the maximum
value between the input width and height, and put the input video at
the center of the padded area:
@example
pad="max(iw\,ih):ow:(ow-iw)/2:(oh-ih)/2"
@end example

@item
Pad the input to get a final w/h ratio of 16:9:
@example
pad="ih*16/9:ih:(ow-iw)/2:(oh-ih)/2"
@end example

@item
In case of anamorphic video, in order to set the output display aspect
correctly, it is necessary to use @var{sar} in the expression,
according to the relation:
@example
(ih * X / ih) * sar = output_dar
X = output_dar / sar
@end example

Thus the previous example needs to be modified to:
@example
pad="ih*16/9/sar:ih:(ow-iw)/2:(oh-ih)/2"
@end example

@item
Double the output size and put the input video in the bottom-right
corner of the output padded area:
@example
pad="2*iw:2*ih:ow-iw:oh-ih"
@end example
@end itemize

@anchor{palettegen}
@section palettegen

Generate one palette for a whole video stream.

It accepts the following options:

@table @option
@item max_colors
Set the maximum number of colors to quantize in the palette.
Note: the palette will still contain 256 colors; the unused palette entries
will be black.

@item reserve_transparent
Create a palette of 255 colors maximum and reserve the last one for
transparency. Reserving the transparency color is useful for GIF optimization.
If not set, the maximum of colors in the palette will be 256. You probably want
to disable this option for a standalone image.
Set by default.

@item transparency_color
Set the color that will be used as background for transparency.

@item stats_mode
Set statistics mode.

It accepts the following values:
@table @samp
@item full
Compute full frame histograms.
@item diff
Compute histograms only for the part that differs from previous frame. This
might be relevant to give more importance to the moving part of your input if
the background is static.
@item single
Compute new histogram for each frame.
@end table

Default value is @var{full}.
@end table

The filter also exports the frame metadata @code{lavfi.color_quant_ratio}
(@code{nb_color_in / nb_color_out}) which you can use to evaluate the degree of
color quantization of the palette. This information is also visible at
@var{info} logging level.

@subsection Examples

@itemize
@item
Generate a representative palette of a given video using @command{ffmpeg}:
@example
ffmpeg -i input.mkv -vf palettegen palette.png
@end example
@end itemize

@section paletteuse

Use a palette to downsample an input video stream.

The filter takes two inputs: one video stream and a palette. The palette must
be a 256 pixels image.

It accepts the following options:

@table @option
@item dither
Select dithering mode. Available algorithms are:
@table @samp
@item bayer
Ordered 8x8 bayer dithering (deterministic)
@item heckbert
Dithering as defined by Paul Heckbert in 1982 (simple error diffusion).
Note: this dithering is sometimes considered "wrong" and is included as a
reference.
@item floyd_steinberg
Floyd and Steingberg dithering (error diffusion)
@item sierra2
Frankie Sierra dithering v2 (error diffusion)
@item sierra2_4a
Frankie Sierra dithering v2 "Lite" (error diffusion)
@end table

Default is @var{sierra2_4a}.

@item bayer_scale
When @var{bayer} dithering is selected, this option defines the scale of the
pattern (how much the crosshatch pattern is visible). A low value means more
visible pattern for less banding, and higher value means less visible pattern
at the cost of more banding.

The option must be an integer value in the range [0,5]. Default is @var{2}.

@item diff_mode
If set, define the zone to process

@table @samp
@item rectangle
Only the changing rectangle will be reprocessed. This is similar to GIF
cropping/offsetting compression mechanism. This option can be useful for speed
if only a part of the image is changing, and has use cases such as limiting the
scope of the error diffusal @option{dither} to the rectangle that bounds the
moving scene (it leads to more deterministic output if the scene doesn't change
much, and as a result less moving noise and better GIF compression).
@end table

Default is @var{none}.

@item new
Take new palette for each output frame.

@item alpha_threshold
Sets the alpha threshold for transparency. Alpha values above this threshold
will be treated as completely opaque, and values below this threshold will be
treated as completely transparent.

The option must be an integer value in the range [0,255]. Default is @var{128}.
@end table

@subsection Examples

@itemize
@item
Use a palette (generated for example with @ref{palettegen}) to encode a GIF
using @command{ffmpeg}:
@example
ffmpeg -i input.mkv -i palette.png -lavfi paletteuse output.gif
@end example
@end itemize

@section perspective

Correct perspective of video not recorded perpendicular to the screen.

A description of the accepted parameters follows.

@table @option
@item x0
@item y0
@item x1
@item y1
@item x2
@item y2
@item x3
@item y3
Set coordinates expression for top left, top right, bottom left and bottom right corners.
Default values are @code{0:0:W:0:0:H:W:H} with which perspective will remain unchanged.
If the @code{sense} option is set to @code{source}, then the specified points will be sent
to the corners of the destination. If the @code{sense} option is set to @code{destination},
then the corners of the source will be sent to the specified coordinates.

The expressions can use the following variables:

@table @option
@item W
@item H
the width and height of video frame.
@item in
Input frame count.
@item on
Output frame count.
@end table

@item interpolation
Set interpolation for perspective correction.

It accepts the following values:
@table @samp
@item linear
@item cubic
@end table

Default value is @samp{linear}.

@item sense
Set interpretation of coordinate options.

It accepts the following values:
@table @samp
@item 0, source

Send point in the source specified by the given coordinates to
the corners of the destination.

@item 1, destination

Send the corners of the source to the point in the destination specified
by the given coordinates.

Default value is @samp{source}.
@end table

@item eval
Set when the expressions for coordinates @option{x0,y0,...x3,y3} are evaluated.

It accepts the following values:
@table @samp
@item init
only evaluate expressions once during the filter initialization or
when a command is processed

@item frame
evaluate expressions for each incoming frame
@end table

Default value is @samp{init}.
@end table

@section phase

Delay interlaced video by one field time so that the field order changes.

The intended use is to fix PAL movies that have been captured with the
opposite field order to the film-to-video transfer.

A description of the accepted parameters follows.

@table @option
@item mode
Set phase mode.

It accepts the following values:
@table @samp
@item t
Capture field order top-first, transfer bottom-first.
Filter will delay the bottom field.

@item b
Capture field order bottom-first, transfer top-first.
Filter will delay the top field.

@item p
Capture and transfer with the same field order. This mode only exists
for the documentation of the other options to refer to, but if you
actually select it, the filter will faithfully do nothing.

@item a
Capture field order determined automatically by field flags, transfer
opposite.
Filter selects among @samp{t} and @samp{b} modes on a frame by frame
basis using field flags. If no field information is available,
then this works just like @samp{u}.

@item u
Capture unknown or varying, transfer opposite.
Filter selects among @samp{t} and @samp{b} on a frame by frame basis by
analyzing the images and selecting the alternative that produces best
match between the fields.

@item T
Capture top-first, transfer unknown or varying.
Filter selects among @samp{t} and @samp{p} using image analysis.

@item B
Capture bottom-first, transfer unknown or varying.
Filter selects among @samp{b} and @samp{p} using image analysis.

@item A
Capture determined by field flags, transfer unknown or varying.
Filter selects among @samp{t}, @samp{b} and @samp{p} using field flags and
image analysis. If no field information is available, then this works just
like @samp{U}. This is the default mode.

@item U
Both capture and transfer unknown or varying.
Filter selects among @samp{t}, @samp{b} and @samp{p} using image analysis only.
@end table
@end table

@section pixdesctest

Pixel format descriptor test filter, mainly useful for internal
testing. The output video should be equal to the input video.

For example:
@example
format=monow, pixdesctest
@end example

can be used to test the monowhite pixel format descriptor definition.

@section pixscope

Display sample values of color channels. Mainly useful for checking color
and levels. Minimum supported resolution is 640x480.

The filters accept the following options:

@table @option
@item x
Set scope X position, relative offset on X axis.

@item y
Set scope Y position, relative offset on Y axis.

@item w
Set scope width.

@item h
Set scope height.

@item o
Set window opacity. This window also holds statistics about pixel area.

@item wx
Set window X position, relative offset on X axis.

@item wy
Set window Y position, relative offset on Y axis.
@end table

@section pp

Enable the specified chain of postprocessing subfilters using libpostproc. This
library should be automatically selected with a GPL build (@code{--enable-gpl}).
Subfilters must be separated by '/' and can be disabled by prepending a '-'.
Each subfilter and some options have a short and a long name that can be used
interchangeably, i.e. dr/dering are the same.

The filters accept the following options:

@table @option
@item subfilters
Set postprocessing subfilters string.
@end table

All subfilters share common options to determine their scope:

@table @option
@item a/autoq
Honor the quality commands for this subfilter.

@item c/chrom
Do chrominance filtering, too (default).

@item y/nochrom
Do luminance filtering only (no chrominance).

@item n/noluma
Do chrominance filtering only (no luminance).
@end table

These options can be appended after the subfilter name, separated by a '|'.

Available subfilters are:

@table @option
@item hb/hdeblock[|difference[|flatness]]
Horizontal deblocking filter
@table @option
@item difference
Difference factor where higher values mean more deblocking (default: @code{32}).
@item flatness
Flatness threshold where lower values mean more deblocking (default: @code{39}).
@end table

@item vb/vdeblock[|difference[|flatness]]
Vertical deblocking filter
@table @option
@item difference
Difference factor where higher values mean more deblocking (default: @code{32}).
@item flatness
Flatness threshold where lower values mean more deblocking (default: @code{39}).
@end table

@item ha/hadeblock[|difference[|flatness]]
Accurate horizontal deblocking filter
@table @option
@item difference
Difference factor where higher values mean more deblocking (default: @code{32}).
@item flatness
Flatness threshold where lower values mean more deblocking (default: @code{39}).
@end table

@item va/vadeblock[|difference[|flatness]]
Accurate vertical deblocking filter
@table @option
@item difference
Difference factor where higher values mean more deblocking (default: @code{32}).
@item flatness
Flatness threshold where lower values mean more deblocking (default: @code{39}).
@end table
@end table

The horizontal and vertical deblocking filters share the difference and
flatness values so you cannot set different horizontal and vertical
thresholds.

@table @option
@item h1/x1hdeblock
Experimental horizontal deblocking filter

@item v1/x1vdeblock
Experimental vertical deblocking filter

@item dr/dering
Deringing filter

@item tn/tmpnoise[|threshold1[|threshold2[|threshold3]]], temporal noise reducer
@table @option
@item threshold1
larger -> stronger filtering
@item threshold2
larger -> stronger filtering
@item threshold3
larger -> stronger filtering
@end table

@item al/autolevels[:f/fullyrange], automatic brightness / contrast correction
@table @option
@item f/fullyrange
Stretch luminance to @code{0-255}.
@end table

@item lb/linblenddeint
Linear blend deinterlacing filter that deinterlaces the given block by
filtering all lines with a @code{(1 2 1)} filter.

@item li/linipoldeint
Linear interpolating deinterlacing filter that deinterlaces the given block by
linearly interpolating every second line.

@item ci/cubicipoldeint
Cubic interpolating deinterlacing filter deinterlaces the given block by
cubically interpolating every second line.

@item md/mediandeint
Median deinterlacing filter that deinterlaces the given block by applying a
median filter to every second line.

@item fd/ffmpegdeint
FFmpeg deinterlacing filter that deinterlaces the given block by filtering every
second line with a @code{(-1 4 2 4 -1)} filter.

@item l5/lowpass5
Vertically applied FIR lowpass deinterlacing filter that deinterlaces the given
block by filtering all lines with a @code{(-1 2 6 2 -1)} filter.

@item fq/forceQuant[|quantizer]
Overrides the quantizer table from the input with the constant quantizer you
specify.
@table @option
@item quantizer
Quantizer to use
@end table

@item de/default
Default pp filter combination (@code{hb|a,vb|a,dr|a})

@item fa/fast
Fast pp filter combination (@code{h1|a,v1|a,dr|a})

@item ac
High quality pp filter combination (@code{ha|a|128|7,va|a,dr|a})
@end table

@subsection Examples

@itemize
@item
Apply horizontal and vertical deblocking, deringing and automatic
brightness/contrast:
@example
pp=hb/vb/dr/al
@end example

@item
Apply default filters without brightness/contrast correction:
@example
pp=de/-al
@end example

@item
Apply default filters and temporal denoiser:
@example
pp=default/tmpnoise|1|2|3
@end example

@item
Apply deblocking on luminance only, and switch vertical deblocking on or off
automatically depending on available CPU time:
@example
pp=hb|y/vb|a
@end example
@end itemize

@section pp7
Apply Postprocessing filter 7. It is variant of the @ref{spp} filter,
similar to spp = 6 with 7 point DCT, where only the center sample is
used after IDCT.

The filter accepts the following options:

@table @option
@item qp
Force a constant quantization parameter. It accepts an integer in range
0 to 63. If not set, the filter will use the QP from the video stream
(if available).

@item mode
Set thresholding mode. Available modes are:

@table @samp
@item hard
Set hard thresholding.
@item soft
Set soft thresholding (better de-ringing effect, but likely blurrier).
@item medium
Set medium thresholding (good results, default).
@end table
@end table

@section premultiply
Apply alpha premultiply effect to input video stream using first plane
of second stream as alpha.

Both streams must have same dimensions and same pixel format.

The filter accepts the following option:

@table @option
@item planes
Set which planes will be processed, unprocessed planes will be copied.
By default value 0xf, all planes will be processed.

@item inplace
Do not require 2nd input for processing, instead use alpha plane from input stream.
@end table

@section prewitt
Apply prewitt operator to input video stream.

The filter accepts the following option:

@table @option
@item planes
Set which planes will be processed, unprocessed planes will be copied.
By default value 0xf, all planes will be processed.

@item scale
Set value which will be multiplied with filtered result.

@item delta
Set value which will be added to filtered result.
@end table

@anchor{program_opencl}
@section program_opencl

Filter video using an OpenCL program.

@table @option

@item source
OpenCL program source file.

@item kernel
Kernel name in program.

@item inputs
Number of inputs to the filter.  Defaults to 1.

@item size, s
Size of output frames.  Defaults to the same as the first input.

@end table

The program source file must contain a kernel function with the given name,
which will be run once for each plane of the output.  Each run on a plane
gets enqueued as a separate 2D global NDRange with one work-item for each
pixel to be generated.  The global ID offset for each work-item is therefore
the coordinates of a pixel in the destination image.

The kernel function needs to take the following arguments:
@itemize
@item
Destination image, @var{__write_only image2d_t}.

This image will become the output; the kernel should write all of it.
@item
Frame index, @var{unsigned int}.

This is a counter starting from zero and increasing by one for each frame.
@item
Source images, @var{__read_only image2d_t}.

These are the most recent images on each input.  The kernel may read from
them to generate the output, but they can't be written to.
@end itemize

Example programs:

@itemize
@item
Copy the input to the output (output must be the same size as the input).
@verbatim
__kernel void copy(__write_only image2d_t destination,
                   unsigned int index,
                   __read_only  image2d_t source)
{
    const sampler_t sampler = CLK_NORMALIZED_COORDS_FALSE;

    int2 location = (int2)(get_global_id(0), get_global_id(1));

    float4 value = read_imagef(source, sampler, location);

    write_imagef(destination, location, value);
}
@end verbatim

@item
Apply a simple transformation, rotating the input by an amount increasing
with the index counter.  Pixel values are linearly interpolated by the
sampler, and the output need not have the same dimensions as the input.
@verbatim
__kernel void rotate_image(__write_only image2d_t dst,
                           unsigned int index,
                           __read_only  image2d_t src)
{
    const sampler_t sampler = (CLK_NORMALIZED_COORDS_FALSE |
                               CLK_FILTER_LINEAR);

    float angle = (float)index / 100.0f;

    float2 dst_dim = convert_float2(get_image_dim(dst));
    float2 src_dim = convert_float2(get_image_dim(src));

    float2 dst_cen = dst_dim / 2.0f;
    float2 src_cen = src_dim / 2.0f;

    int2   dst_loc = (int2)(get_global_id(0), get_global_id(1));

    float2 dst_pos = convert_float2(dst_loc) - dst_cen;
    float2 src_pos = {
        cos(angle) * dst_pos.x - sin(angle) * dst_pos.y,
        sin(angle) * dst_pos.x + cos(angle) * dst_pos.y
    };
    src_pos = src_pos * src_dim / dst_dim;

    float2 src_loc = src_pos + src_cen;

    if (src_loc.x < 0.0f      || src_loc.y < 0.0f ||
        src_loc.x > src_dim.x || src_loc.y > src_dim.y)
        write_imagef(dst, dst_loc, 0.5f);
    else
        write_imagef(dst, dst_loc, read_imagef(src, sampler, src_loc));
}
@end verbatim

@item
Blend two inputs together, with the amount of each input used varying
with the index counter.
@verbatim
__kernel void blend_images(__write_only image2d_t dst,
                           unsigned int index,
                           __read_only  image2d_t src1,
                           __read_only  image2d_t src2)
{
    const sampler_t sampler = (CLK_NORMALIZED_COORDS_FALSE |
                               CLK_FILTER_LINEAR);

    float blend = (cos((float)index / 50.0f) + 1.0f) / 2.0f;

    int2  dst_loc = (int2)(get_global_id(0), get_global_id(1));
    int2 src1_loc = dst_loc * get_image_dim(src1) / get_image_dim(dst);
    int2 src2_loc = dst_loc * get_image_dim(src2) / get_image_dim(dst);

    float4 val1 = read_imagef(src1, sampler, src1_loc);
    float4 val2 = read_imagef(src2, sampler, src2_loc);

    write_imagef(dst, dst_loc, val1 * blend + val2 * (1.0f - blend));
}
@end verbatim

@end itemize

@section pseudocolor

Alter frame colors in video with pseudocolors.

This filter accept the following options:

@table @option
@item c0
set pixel first component expression

@item c1
set pixel second component expression

@item c2
set pixel third component expression

@item c3
set pixel fourth component expression, corresponds to the alpha component

@item i
set component to use as base for altering colors
@end table

Each of them specifies the expression to use for computing the lookup table for
the corresponding pixel component values.

The expressions can contain the following constants and functions:

@table @option
@item w
@item h
The input width and height.

@item val
The input value for the pixel component.

@item ymin, umin, vmin, amin
The minimum allowed component value.

@item ymax, umax, vmax, amax
The maximum allowed component value.
@end table

All expressions default to "val".

@subsection Examples

@itemize
@item
Change too high luma values to gradient:
@example
pseudocolor="'if(between(val,ymax,amax),lerp(ymin,ymax,(val-ymax)/(amax-ymax)),-1):if(between(val,ymax,amax),lerp(umax,umin,(val-ymax)/(amax-ymax)),-1):if(between(val,ymax,amax),lerp(vmin,vmax,(val-ymax)/(amax-ymax)),-1):-1'"
@end example
@end itemize

@section psnr

Obtain the average, maximum and minimum PSNR (Peak Signal to Noise
Ratio) between two input videos.

This filter takes in input two input videos, the first input is
considered the "main" source and is passed unchanged to the
output. The second input is used as a "reference" video for computing
the PSNR.

Both video inputs must have the same resolution and pixel format for
this filter to work correctly. Also it assumes that both inputs
have the same number of frames, which are compared one by one.

The obtained average PSNR is printed through the logging system.

The filter stores the accumulated MSE (mean squared error) of each
frame, and at the end of the processing it is averaged across all frames
equally, and the following formula is applied to obtain the PSNR:

@example
PSNR = 10*log10(MAX^2/MSE)
@end example

Where MAX is the average of the maximum values of each component of the
image.

The description of the accepted parameters follows.

@table @option
@item stats_file, f
If specified the filter will use the named file to save the PSNR of
each individual frame. When filename equals "-" the data is sent to
standard output.

@item stats_version
Specifies which version of the stats file format to use. Details of
each format are written below.
Default value is 1.

@item stats_add_max
Determines whether the max value is output to the stats log.
Default value is 0.
Requires stats_version >= 2. If this is set and stats_version < 2,
the filter will return an error.
@end table

This filter also supports the @ref{framesync} options.

The file printed if @var{stats_file} is selected, contains a sequence of
key/value pairs of the form @var{key}:@var{value} for each compared
couple of frames.

If a @var{stats_version} greater than 1 is specified, a header line precedes
the list of per-frame-pair stats, with key value pairs following the frame
format with the following parameters:

@table @option
@item psnr_log_version
The version of the log file format. Will match @var{stats_version}.

@item fields
A comma separated list of the per-frame-pair parameters included in
the log.
@end table

A description of each shown per-frame-pair parameter follows:

@table @option
@item n
sequential number of the input frame, starting from 1

@item mse_avg
Mean Square Error pixel-by-pixel average difference of the compared
frames, averaged over all the image components.

@item mse_y, mse_u, mse_v, mse_r, mse_g, mse_b, mse_a
Mean Square Error pixel-by-pixel average difference of the compared
frames for the component specified by the suffix.

@item psnr_y, psnr_u, psnr_v, psnr_r, psnr_g, psnr_b, psnr_a
Peak Signal to Noise ratio of the compared frames for the component
specified by the suffix.

@item max_avg, max_y, max_u, max_v
Maximum allowed value for each channel, and average over all
channels.
@end table

For example:
@example
movie=ref_movie.mpg, setpts=PTS-STARTPTS [main];
[main][ref] psnr="stats_file=stats.log" [out]
@end example

On this example the input file being processed is compared with the
reference file @file{ref_movie.mpg}. The PSNR of each individual frame
is stored in @file{stats.log}.

@anchor{pullup}
@section pullup

Pulldown reversal (inverse telecine) filter, capable of handling mixed
hard-telecine, 24000/1001 fps progressive, and 30000/1001 fps progressive
content.

The pullup filter is designed to take advantage of future context in making
its decisions. This filter is stateless in the sense that it does not lock
onto a pattern to follow, but it instead looks forward to the following
fields in order to identify matches and rebuild progressive frames.

To produce content with an even framerate, insert the fps filter after
pullup, use @code{fps=24000/1001} if the input frame rate is 29.97fps,
@code{fps=24} for 30fps and the (rare) telecined 25fps input.

The filter accepts the following options:

@table @option
@item jl
@item jr
@item jt
@item jb
These options set the amount of "junk" to ignore at the left, right, top, and
bottom of the image, respectively. Left and right are in units of 8 pixels,
while top and bottom are in units of 2 lines.
The default is 8 pixels on each side.

@item sb
Set the strict breaks. Setting this option to 1 will reduce the chances of
filter generating an occasional mismatched frame, but it may also cause an
excessive number of frames to be dropped during high motion sequences.
Conversely, setting it to -1 will make filter match fields more easily.
This may help processing of video where there is slight blurring between
the fields, but may also cause there to be interlaced frames in the output.
Default value is @code{0}.

@item mp
Set the metric plane to use. It accepts the following values:
@table @samp
@item l
Use luma plane.

@item u
Use chroma blue plane.

@item v
Use chroma red plane.
@end table

This option may be set to use chroma plane instead of the default luma plane
for doing filter's computations. This may improve accuracy on very clean
source material, but more likely will decrease accuracy, especially if there
is chroma noise (rainbow effect) or any grayscale video.
The main purpose of setting @option{mp} to a chroma plane is to reduce CPU
load and make pullup usable in realtime on slow machines.
@end table

For best results (without duplicated frames in the output file) it is
necessary to change the output frame rate. For example, to inverse
telecine NTSC input:
@example
ffmpeg -i input -vf pullup -r 24000/1001 ...
@end example

@section qp

Change video quantization parameters (QP).

The filter accepts the following option:

@table @option
@item qp
Set expression for quantization parameter.
@end table

The expression is evaluated through the eval API and can contain, among others,
the following constants:

@table @var
@item known
1 if index is not 129, 0 otherwise.

@item qp
Sequential index starting from -129 to 128.
@end table

@subsection Examples

@itemize
@item
Some equation like:
@example
qp=2+2*sin(PI*qp)
@end example
@end itemize

@section random

Flush video frames from internal cache of frames into a random order.
No frame is discarded.
Inspired by @ref{frei0r} nervous filter.

@table @option
@item frames
Set size in number of frames of internal cache, in range from @code{2} to
@code{512}. Default is @code{30}.

@item seed
Set seed for random number generator, must be an integer included between
@code{0} and @code{UINT32_MAX}. If not specified, or if explicitly set to
less than @code{0}, the filter will try to use a good random seed on a
best effort basis.
@end table

@section readeia608

Read closed captioning (EIA-608) information from the top lines of a video frame.

This filter adds frame metadata for @code{lavfi.readeia608.X.cc} and
@code{lavfi.readeia608.X.line}, where @code{X} is the number of the identified line
with EIA-608 data (starting from 0). A description of each metadata value follows:

@table @option
@item lavfi.readeia608.X.cc
The two bytes stored as EIA-608 data (printed in hexadecimal).

@item lavfi.readeia608.X.line
The number of the line on which the EIA-608 data was identified and read.
@end table

This filter accepts the following options:

@table @option
@item scan_min
Set the line to start scanning for EIA-608 data. Default is @code{0}.

@item scan_max
Set the line to end scanning for EIA-608 data. Default is @code{29}.

@item mac
Set minimal acceptable amplitude change for sync codes detection.
Default is @code{0.2}. Allowed range is @code{[0.001 - 1]}.

@item spw
Set the ratio of width reserved for sync code detection.
Default is @code{0.27}. Allowed range is @code{[0.01 - 0.7]}.

@item mhd
Set the max peaks height difference for sync code detection.
Default is @code{0.1}. Allowed range is @code{[0.0 - 0.5]}.

@item mpd
Set max peaks period difference for sync code detection.
Default is @code{0.1}. Allowed range is @code{[0.0 - 0.5]}.

@item msd
Set the first two max start code bits differences.
Default is @code{0.02}. Allowed range is @code{[0.0 - 0.5]}.

@item bhd
Set the minimum ratio of bits height compared to 3rd start code bit.
Default is @code{0.75}. Allowed range is @code{[0.01 - 1]}.

@item th_w
Set the white color threshold. Default is @code{0.35}. Allowed range is @code{[0.1 - 1]}.

@item th_b
Set the black color threshold. Default is @code{0.15}. Allowed range is @code{[0.0 - 0.5]}.

@item chp
Enable checking the parity bit. In the event of a parity error, the filter will output
@code{0x00} for that character. Default is false.
@end table

@subsection Examples

@itemize
@item
Output a csv with presentation time and the first two lines of identified EIA-608 captioning data.
@example
ffprobe -f lavfi -i movie=captioned_video.mov,readeia608 -show_entries frame=pkt_pts_time:frame_tags=lavfi.readeia608.0.cc,lavfi.readeia608.1.cc -of csv
@end example
@end itemize

@section readvitc

Read vertical interval timecode (VITC) information from the top lines of a
video frame.

The filter adds frame metadata key @code{lavfi.readvitc.tc_str} with the
timecode value, if a valid timecode has been detected. Further metadata key
@code{lavfi.readvitc.found} is set to 0/1 depending on whether
timecode data has been found or not.

This filter accepts the following options:

@table @option
@item scan_max
Set the maximum number of lines to scan for VITC data. If the value is set to
@code{-1} the full video frame is scanned. Default is @code{45}.

@item thr_b
Set the luma threshold for black. Accepts float numbers in the range [0.0,1.0],
default value is @code{0.2}. The value must be equal or less than @code{thr_w}.

@item thr_w
Set the luma threshold for white. Accepts float numbers in the range [0.0,1.0],
default value is @code{0.6}. The value must be equal or greater than @code{thr_b}.
@end table

@subsection Examples

@itemize
@item
Detect and draw VITC data onto the video frame; if no valid VITC is detected,
draw @code{--:--:--:--} as a placeholder:
@example
ffmpeg -i input.avi -filter:v 'readvitc,drawtext=fontfile=FreeMono.ttf:text=%@{metadata\\:lavfi.readvitc.tc_str\\:--\\\\\\:--\\\\\\:--\\\\\\:--@}:x=(w-tw)/2:y=400-ascent'
@end example
@end itemize

@section remap

Remap pixels using 2nd: Xmap and 3rd: Ymap input video stream.

Destination pixel at position (X, Y) will be picked from source (x, y) position
where x = Xmap(X, Y) and y = Ymap(X, Y). If mapping values are out of range, zero
value for pixel will be used for destination pixel.

Xmap and Ymap input video streams must be of same dimensions. Output video stream
will have Xmap/Ymap video stream dimensions.
Xmap and Ymap input video streams are 16bit depth, single channel.

@section removegrain

The removegrain filter is a spatial denoiser for progressive video.

@table @option
@item m0
Set mode for the first plane.

@item m1
Set mode for the second plane.

@item m2
Set mode for the third plane.

@item m3
Set mode for the fourth plane.
@end table

Range of mode is from 0 to 24. Description of each mode follows:

@table @var
@item 0
Leave input plane unchanged. Default.

@item 1
Clips the pixel with the minimum and maximum of the 8 neighbour pixels.

@item 2
Clips the pixel with the second minimum and maximum of the 8 neighbour pixels.

@item 3
Clips the pixel with the third minimum and maximum of the 8 neighbour pixels.

@item 4
Clips the pixel with the fourth minimum and maximum of the 8 neighbour pixels.
This is equivalent to a median filter.

@item 5
Line-sensitive clipping giving the minimal change.

@item 6
Line-sensitive clipping, intermediate.

@item 7
Line-sensitive clipping, intermediate.

@item 8
Line-sensitive clipping, intermediate.

@item 9
Line-sensitive clipping on a line where the neighbours pixels are the closest.

@item 10
Replaces the target pixel with the closest neighbour.

@item 11
[1 2 1] horizontal and vertical kernel blur.

@item 12
Same as mode 11.

@item 13
Bob mode, interpolates top field from the line where the neighbours
pixels are the closest.

@item 14
Bob mode, interpolates bottom field from the line where the neighbours
pixels are the closest.

@item 15
Bob mode, interpolates top field. Same as 13 but with a more complicated
interpolation formula.

@item 16
Bob mode, interpolates bottom field. Same as 14 but with a more complicated
interpolation formula.

@item 17
Clips the pixel with the minimum and maximum of respectively the maximum and
minimum of each pair of opposite neighbour pixels.

@item 18
Line-sensitive clipping using opposite neighbours whose greatest distance from
the current pixel is minimal.

@item 19
Replaces the pixel with the average of its 8 neighbours.

@item 20
Averages the 9 pixels ([1 1 1] horizontal and vertical blur).

@item 21
Clips pixels using the averages of opposite neighbour.

@item 22
Same as mode 21 but simpler and faster.

@item 23
Small edge and halo removal, but reputed useless.

@item 24
Similar as 23.
@end table

@section removelogo

Suppress a TV station logo, using an image file to determine which
pixels comprise the logo. It works by filling in the pixels that
comprise the logo with neighboring pixels.

The filter accepts the following options:

@table @option
@item filename, f
Set the filter bitmap file, which can be any image format supported by
libavformat. The width and height of the image file must match those of the
video stream being processed.
@end table

Pixels in the provided bitmap image with a value of zero are not
considered part of the logo, non-zero pixels are considered part of
the logo. If you use white (255) for the logo and black (0) for the
rest, you will be safe. For making the filter bitmap, it is
recommended to take a screen capture of a black frame with the logo
visible, and then using a threshold filter followed by the erode
filter once or twice.

If needed, little splotches can be fixed manually. Remember that if
logo pixels are not covered, the filter quality will be much
reduced. Marking too many pixels as part of the logo does not hurt as
much, but it will increase the amount of blurring needed to cover over
the image and will destroy more information than necessary, and extra
pixels will slow things down on a large logo.

@section repeatfields

This filter uses the repeat_field flag from the Video ES headers and hard repeats
fields based on its value.

@section reverse

Reverse a video clip.

Warning: This filter requires memory to buffer the entire clip, so trimming
is suggested.

@subsection Examples

@itemize
@item
Take the first 5 seconds of a clip, and reverse it.
@example
trim=end=5,reverse
@end example
@end itemize

@section roberts
Apply roberts cross operator to input video stream.

The filter accepts the following option:

@table @option
@item planes
Set which planes will be processed, unprocessed planes will be copied.
By default value 0xf, all planes will be processed.

@item scale
Set value which will be multiplied with filtered result.

@item delta
Set value which will be added to filtered result.
@end table

@section rotate

Rotate video by an arbitrary angle expressed in radians.

The filter accepts the following options:

A description of the optional parameters follows.
@table @option
@item angle, a
Set an expression for the angle by which to rotate the input video
clockwise, expressed as a number of radians. A negative value will
result in a counter-clockwise rotation. By default it is set to "0".

This expression is evaluated for each frame.

@item out_w, ow
Set the output width expression, default value is "iw".
This expression is evaluated just once during configuration.

@item out_h, oh
Set the output height expression, default value is "ih".
This expression is evaluated just once during configuration.

@item bilinear
Enable bilinear interpolation if set to 1, a value of 0 disables
it. Default value is 1.

@item fillcolor, c
Set the color used to fill the output area not covered by the rotated
image. For the general syntax of this option, check the
@ref{color syntax,,"Color" section in the ffmpeg-utils manual,ffmpeg-utils}.
If the special value "none" is selected then no
background is printed (useful for example if the background is never shown).

Default value is "black".
@end table

The expressions for the angle and the output size can contain the
following constants and functions:

@table @option
@item n
sequential number of the input frame, starting from 0. It is always NAN
before the first frame is filtered.

@item t
time in seconds of the input frame, it is set to 0 when the filter is
configured. It is always NAN before the first frame is filtered.

@item hsub
@item vsub
horizontal and vertical chroma subsample values. For example for the
pixel format "yuv422p" @var{hsub} is 2 and @var{vsub} is 1.

@item in_w, iw
@item in_h, ih
the input video width and height

@item out_w, ow
@item out_h, oh
the output width and height, that is the size of the padded area as
specified by the @var{width} and @var{height} expressions

@item rotw(a)
@item roth(a)
the minimal width/height required for completely containing the input
video rotated by @var{a} radians.

These are only available when computing the @option{out_w} and
@option{out_h} expressions.
@end table

@subsection Examples

@itemize
@item
Rotate the input by PI/6 radians clockwise:
@example
rotate=PI/6
@end example

@item
Rotate the input by PI/6 radians counter-clockwise:
@example
rotate=-PI/6
@end example

@item
Rotate the input by 45 degrees clockwise:
@example
rotate=45*PI/180
@end example

@item
Apply a constant rotation with period T, starting from an angle of PI/3:
@example
rotate=PI/3+2*PI*t/T
@end example

@item
Make the input video rotation oscillating with a period of T
seconds and an amplitude of A radians:
@example
rotate=A*sin(2*PI/T*t)
@end example

@item
Rotate the video, output size is chosen so that the whole rotating
input video is always completely contained in the output:
@example
rotate='2*PI*t:ow=hypot(iw,ih):oh=ow'
@end example

@item
Rotate the video, reduce the output size so that no background is ever
shown:
@example
rotate=2*PI*t:ow='min(iw,ih)/sqrt(2)':oh=ow:c=none
@end example
@end itemize

@subsection Commands

The filter supports the following commands:

@table @option
@item a, angle
Set the angle expression.
The command accepts the same syntax of the corresponding option.

If the specified expression is not valid, it is kept at its current
value.
@end table

@section sab

Apply Shape Adaptive Blur.

The filter accepts the following options:

@table @option
@item luma_radius, lr
Set luma blur filter strength, must be a value in range 0.1-4.0, default
value is 1.0. A greater value will result in a more blurred image, and
in slower processing.

@item luma_pre_filter_radius, lpfr
Set luma pre-filter radius, must be a value in the 0.1-2.0 range, default
value is 1.0.

@item luma_strength, ls
Set luma maximum difference between pixels to still be considered, must
be a value in the 0.1-100.0 range, default value is 1.0.

@item chroma_radius, cr
Set chroma blur filter strength, must be a value in range -0.9-4.0. A
greater value will result in a more blurred image, and in slower
processing.

@item chroma_pre_filter_radius, cpfr
Set chroma pre-filter radius, must be a value in the -0.9-2.0 range.

@item chroma_strength, cs
Set chroma maximum difference between pixels to still be considered,
must be a value in the -0.9-100.0 range.
@end table

Each chroma option value, if not explicitly specified, is set to the
corresponding luma option value.

@anchor{scale}
@section scale

Scale (resize) the input video, using the libswscale library.

The scale filter forces the output display aspect ratio to be the same
of the input, by changing the output sample aspect ratio.

If the input image format is different from the format requested by
the next filter, the scale filter will convert the input to the
requested format.

@subsection Options
The filter accepts the following options, or any of the options
supported by the libswscale scaler.

See @ref{scaler_options,,the ffmpeg-scaler manual,ffmpeg-scaler} for
the complete list of scaler options.

@table @option
@item width, w
@item height, h
Set the output video dimension expression. Default value is the input
dimension.

If the @var{width} or @var{w} value is 0, the input width is used for
the output. If the @var{height} or @var{h} value is 0, the input height
is used for the output.

If one and only one of the values is -n with n >= 1, the scale filter
will use a value that maintains the aspect ratio of the input image,
calculated from the other specified dimension. After that it will,
however, make sure that the calculated dimension is divisible by n and
adjust the value if necessary.

If both values are -n with n >= 1, the behavior will be identical to
both values being set to 0 as previously detailed.

See below for the list of accepted constants for use in the dimension
expression.

@item eval
Specify when to evaluate @var{width} and @var{height} expression. It accepts the following values:

@table @samp
@item init
Only evaluate expressions once during the filter initialization or when a command is processed.

@item frame
Evaluate expressions for each incoming frame.

@end table

Default value is @samp{init}.


@item interl
Set the interlacing mode. It accepts the following values:

@table @samp
@item 1
Force interlaced aware scaling.

@item 0
Do not apply interlaced scaling.

@item -1
Select interlaced aware scaling depending on whether the source frames
are flagged as interlaced or not.
@end table

Default value is @samp{0}.

@item flags
Set libswscale scaling flags. See
@ref{sws_flags,,the ffmpeg-scaler manual,ffmpeg-scaler} for the
complete list of values. If not explicitly specified the filter applies
the default flags.


@item param0, param1
Set libswscale input parameters for scaling algorithms that need them. See
@ref{sws_params,,the ffmpeg-scaler manual,ffmpeg-scaler} for the
complete documentation. If not explicitly specified the filter applies
empty parameters.



@item size, s
Set the video size. For the syntax of this option, check the
@ref{video size syntax,,"Video size" section in the ffmpeg-utils manual,ffmpeg-utils}.

@item in_color_matrix
@item out_color_matrix
Set in/output YCbCr color space type.

This allows the autodetected value to be overridden as well as allows forcing
a specific value used for the output and encoder.

If not specified, the color space type depends on the pixel format.

Possible values:

@table @samp
@item auto
Choose automatically.

@item bt709
Format conforming to International Telecommunication Union (ITU)
Recommendation BT.709.

@item fcc
Set color space conforming to the United States Federal Communications
Commission (FCC) Code of Federal Regulations (CFR) Title 47 (2003) 73.682 (a).

@item bt601
Set color space conforming to:

@itemize
@item
ITU Radiocommunication Sector (ITU-R) Recommendation BT.601

@item
ITU-R Rec. BT.470-6 (1998) Systems B, B1, and G

@item
Society of Motion Picture and Television Engineers (SMPTE) ST 170:2004

@end itemize

@item smpte240m
Set color space conforming to SMPTE ST 240:1999.
@end table

@item in_range
@item out_range
Set in/output YCbCr sample range.

This allows the autodetected value to be overridden as well as allows forcing
a specific value used for the output and encoder. If not specified, the
range depends on the pixel format. Possible values:

@table @samp
@item auto/unknown
Choose automatically.

@item jpeg/full/pc
Set full range (0-255 in case of 8-bit luma).

@item mpeg/limited/tv
Set "MPEG" range (16-235 in case of 8-bit luma).
@end table

@item force_original_aspect_ratio
Enable decreasing or increasing output video width or height if necessary to
keep the original aspect ratio. Possible values:

@table @samp
@item disable
Scale the video as specified and disable this feature.

@item decrease
The output video dimensions will automatically be decreased if needed.

@item increase
The output video dimensions will automatically be increased if needed.

@end table

One useful instance of this option is that when you know a specific device's
maximum allowed resolution, you can use this to limit the output video to
that, while retaining the aspect ratio. For example, device A allows
1280x720 playback, and your video is 1920x800. Using this option (set it to
decrease) and specifying 1280x720 to the command line makes the output
1280x533.

Please note that this is a different thing than specifying -1 for @option{w}
or @option{h}, you still need to specify the output resolution for this option
to work.

@end table

The values of the @option{w} and @option{h} options are expressions
containing the following constants:

@table @var
@item in_w
@item in_h
The input width and height

@item iw
@item ih
These are the same as @var{in_w} and @var{in_h}.

@item out_w
@item out_h
The output (scaled) width and height

@item ow
@item oh
These are the same as @var{out_w} and @var{out_h}

@item a
The same as @var{iw} / @var{ih}

@item sar
input sample aspect ratio

@item dar
The input display aspect ratio. Calculated from @code{(iw / ih) * sar}.

@item hsub
@item vsub
horizontal and vertical input chroma subsample values. For example for the
pixel format "yuv422p" @var{hsub} is 2 and @var{vsub} is 1.

@item ohsub
@item ovsub
horizontal and vertical output chroma subsample values. For example for the
pixel format "yuv422p" @var{hsub} is 2 and @var{vsub} is 1.
@end table

@subsection Examples

@itemize
@item
Scale the input video to a size of 200x100
@example
scale=w=200:h=100
@end example

This is equivalent to:
@example
scale=200:100
@end example

or:
@example
scale=200x100
@end example

@item
Specify a size abbreviation for the output size:
@example
scale=qcif
@end example

which can also be written as:
@example
scale=size=qcif
@end example

@item
Scale the input to 2x:
@example
scale=w=2*iw:h=2*ih
@end example

@item
The above is the same as:
@example
scale=2*in_w:2*in_h
@end example

@item
Scale the input to 2x with forced interlaced scaling:
@example
scale=2*iw:2*ih:interl=1
@end example

@item
Scale the input to half size:
@example
scale=w=iw/2:h=ih/2
@end example

@item
Increase the width, and set the height to the same size:
@example
scale=3/2*iw:ow
@end example

@item
Seek Greek harmony:
@example
scale=iw:1/PHI*iw
scale=ih*PHI:ih
@end example

@item
Increase the height, and set the width to 3/2 of the height:
@example
scale=w=3/2*oh:h=3/5*ih
@end example

@item
Increase the size, making the size a multiple of the chroma
subsample values:
@example
scale="trunc(3/2*iw/hsub)*hsub:trunc(3/2*ih/vsub)*vsub"
@end example

@item
Increase the width to a maximum of 500 pixels,
keeping the same aspect ratio as the input:
@example
scale=w='min(500\, iw*3/2):h=-1'
@end example

@item
Make pixels square by combining scale and setsar:
@example
scale='trunc(ih*dar):ih',setsar=1/1
@end example

@item
Make pixels square by combining scale and setsar,
making sure the resulting resolution is even (required by some codecs):
@example
scale='trunc(ih*dar/2)*2:trunc(ih/2)*2',setsar=1/1
@end example
@end itemize

@subsection Commands

This filter supports the following commands:
@table @option
@item width, w
@item height, h
Set the output video dimension expression.
The command accepts the same syntax of the corresponding option.

If the specified expression is not valid, it is kept at its current
value.
@end table

@section scale_npp

Use the NVIDIA Performance Primitives (libnpp) to perform scaling and/or pixel
format conversion on CUDA video frames. Setting the output width and height
works in the same way as for the @var{scale} filter.

The following additional options are accepted:
@table @option
@item format
The pixel format of the output CUDA frames. If set to the string "same" (the
default), the input format will be kept. Note that automatic format negotiation
and conversion is not yet supported for hardware frames

@item interp_algo
The interpolation algorithm used for resizing. One of the following:
@table @option
@item nn
Nearest neighbour.

@item linear
@item cubic
@item cubic2p_bspline
2-parameter cubic (B=1, C=0)

@item cubic2p_catmullrom
2-parameter cubic (B=0, C=1/2)

@item cubic2p_b05c03
2-parameter cubic (B=1/2, C=3/10)

@item super
Supersampling

@item lanczos
@end table

@end table

@section scale2ref

Scale (resize) the input video, based on a reference video.

See the scale filter for available options, scale2ref supports the same but
uses the reference video instead of the main input as basis. scale2ref also
supports the following additional constants for the @option{w} and
@option{h} options:

@table @var
@item main_w
@item main_h
The main input video's width and height

@item main_a
The same as @var{main_w} / @var{main_h}

@item main_sar
The main input video's sample aspect ratio

@item main_dar, mdar
The main input video's display aspect ratio. Calculated from
@code{(main_w / main_h) * main_sar}.

@item main_hsub
@item main_vsub
The main input video's horizontal and vertical chroma subsample values.
For example for the pixel format "yuv422p" @var{hsub} is 2 and @var{vsub}
is 1.
@end table

@subsection Examples

@itemize
@item
Scale a subtitle stream (b) to match the main video (a) in size before overlaying
@example
'scale2ref[b][a];[a][b]overlay'
@end example
@end itemize

@anchor{selectivecolor}
@section selectivecolor

Adjust cyan, magenta, yellow and black (CMYK) to certain ranges of colors (such
as "reds", "yellows", "greens", "cyans", ...). The adjustment range is defined
by the "purity" of the color (that is, how saturated it already is).

This filter is similar to the Adobe Photoshop Selective Color tool.

The filter accepts the following options:

@table @option
@item correction_method
Select color correction method.

Available values are:
@table @samp
@item absolute
Specified adjustments are applied "as-is" (added/subtracted to original pixel
component value).
@item relative
Specified adjustments are relative to the original component value.
@end table
Default is @code{absolute}.
@item reds
Adjustments for red pixels (pixels where the red component is the maximum)
@item yellows
Adjustments for yellow pixels (pixels where the blue component is the minimum)
@item greens
Adjustments for green pixels (pixels where the green component is the maximum)
@item cyans
Adjustments for cyan pixels (pixels where the red component is the minimum)
@item blues
Adjustments for blue pixels (pixels where the blue component is the maximum)
@item magentas
Adjustments for magenta pixels (pixels where the green component is the minimum)
@item whites
Adjustments for white pixels (pixels where all components are greater than 128)
@item neutrals
Adjustments for all pixels except pure black and pure white
@item blacks
Adjustments for black pixels (pixels where all components are lesser than 128)
@item psfile
Specify a Photoshop selective color file (@code{.asv}) to import the settings from.
@end table

All the adjustment settings (@option{reds}, @option{yellows}, ...) accept up to
4 space separated floating point adjustment values in the [-1,1] range,
respectively to adjust the amount of cyan, magenta, yellow and black for the
pixels of its range.

@subsection Examples

@itemize
@item
Increase cyan by 50% and reduce yellow by 33% in every green areas, and
increase magenta by 27% in blue areas:
@example
selectivecolor=greens=.5 0 -.33 0:blues=0 .27
@end example

@item
Use a Photoshop selective color preset:
@example
selectivecolor=psfile=MySelectiveColorPresets/Misty.asv
@end example
@end itemize

@anchor{separatefields}
@section separatefields

The @code{separatefields} takes a frame-based video input and splits
each frame into its components fields, producing a new half height clip
with twice the frame rate and twice the frame count.

This filter use field-dominance information in frame to decide which
of each pair of fields to place first in the output.
If it gets it wrong use @ref{setfield} filter before @code{separatefields} filter.

@section setdar, setsar

The @code{setdar} filter sets the Display Aspect Ratio for the filter
output video.

This is done by changing the specified Sample (aka Pixel) Aspect
Ratio, according to the following equation:
@example
@var{DAR} = @var{HORIZONTAL_RESOLUTION} / @var{VERTICAL_RESOLUTION} * @var{SAR}
@end example

Keep in mind that the @code{setdar} filter does not modify the pixel
dimensions of the video frame. Also, the display aspect ratio set by
this filter may be changed by later filters in the filterchain,
e.g. in case of scaling or if another "setdar" or a "setsar" filter is
applied.

The @code{setsar} filter sets the Sample (aka Pixel) Aspect Ratio for
the filter output video.

Note that as a consequence of the application of this filter, the
output display aspect ratio will change according to the equation
above.

Keep in mind that the sample aspect ratio set by the @code{setsar}
filter may be changed by later filters in the filterchain, e.g. if
another "setsar" or a "setdar" filter is applied.

It accepts the following parameters:

@table @option
@item r, ratio, dar (@code{setdar} only), sar (@code{setsar} only)
Set the aspect ratio used by the filter.

The parameter can be a floating point number string, an expression, or
a string of the form @var{num}:@var{den}, where @var{num} and
@var{den} are the numerator and denominator of the aspect ratio. If
the parameter is not specified, it is assumed the value "0".
In case the form "@var{num}:@var{den}" is used, the @code{:} character
should be escaped.

@item max
Set the maximum integer value to use for expressing numerator and
denominator when reducing the expressed aspect ratio to a rational.
Default value is @code{100}.

@end table

The parameter @var{sar} is an expression containing
the following constants:

@table @option
@item E, PI, PHI
These are approximated values for the mathematical constants e
(Euler's number), pi (Greek pi), and phi (the golden ratio).

@item w, h
The input width and height.

@item a
These are the same as @var{w} / @var{h}.

@item sar
The input sample aspect ratio.

@item dar
The input display aspect ratio. It is the same as
(@var{w} / @var{h}) * @var{sar}.

@item hsub, vsub
Horizontal and vertical chroma subsample values. For example, for the
pixel format "yuv422p" @var{hsub} is 2 and @var{vsub} is 1.
@end table

@subsection Examples

@itemize

@item
To change the display aspect ratio to 16:9, specify one of the following:
@example
setdar=dar=1.77777
setdar=dar=16/9
@end example

@item
To change the sample aspect ratio to 10:11, specify:
@example
setsar=sar=10/11
@end example

@item
To set a display aspect ratio of 16:9, and specify a maximum integer value of
1000 in the aspect ratio reduction, use the command:
@example
setdar=ratio=16/9:max=1000
@end example

@end itemize

@anchor{setfield}
@section setfield

Force field for the output video frame.

The @code{setfield} filter marks the interlace type field for the
output frames. It does not change the input frame, but only sets the
corresponding property, which affects how the frame is treated by
following filters (e.g. @code{fieldorder} or @code{yadif}).

The filter accepts the following options:

@table @option

@item mode
Available values are:

@table @samp
@item auto
Keep the same field property.

@item bff
Mark the frame as bottom-field-first.

@item tff
Mark the frame as top-field-first.

@item prog
Mark the frame as progressive.
@end table
@end table

@section showinfo

Show a line containing various information for each input video frame.
The input video is not modified.

The shown line contains a sequence of key/value pairs of the form
@var{key}:@var{value}.

The following values are shown in the output:

@table @option
@item n
The (sequential) number of the input frame, starting from 0.

@item pts
The Presentation TimeStamp of the input frame, expressed as a number of
time base units. The time base unit depends on the filter input pad.

@item pts_time
The Presentation TimeStamp of the input frame, expressed as a number of
seconds.

@item pos
The position of the frame in the input stream, or -1 if this information is
unavailable and/or meaningless (for example in case of synthetic video).

@item fmt
The pixel format name.

@item sar
The sample aspect ratio of the input frame, expressed in the form
@var{num}/@var{den}.

@item s
The size of the input frame. For the syntax of this option, check the
@ref{video size syntax,,"Video size" section in the ffmpeg-utils manual,ffmpeg-utils}.

@item i
The type of interlaced mode ("P" for "progressive", "T" for top field first, "B"
for bottom field first).

@item iskey
This is 1 if the frame is a key frame, 0 otherwise.

@item type
The picture type of the input frame ("I" for an I-frame, "P" for a
P-frame, "B" for a B-frame, or "?" for an unknown type).
Also refer to the documentation of the @code{AVPictureType} enum and of
the @code{av_get_picture_type_char} function defined in
@file{libavutil/avutil.h}.

@item checksum
The Adler-32 checksum (printed in hexadecimal) of all the planes of the input frame.

@item plane_checksum
The Adler-32 checksum (printed in hexadecimal) of each plane of the input frame,
expressed in the form "[@var{c0} @var{c1} @var{c2} @var{c3}]".
@end table

@section showpalette

Displays the 256 colors palette of each frame. This filter is only relevant for
@var{pal8} pixel format frames.

It accepts the following option:

@table @option
@item s
Set the size of the box used to represent one palette color entry. Default is
@code{30} (for a @code{30x30} pixel box).
@end table

@section shuffleframes

Reorder and/or duplicate and/or drop video frames.

It accepts the following parameters:

@table @option
@item mapping
Set the destination indexes of input frames.
This is space or '|' separated list of indexes that maps input frames to output
frames. Number of indexes also sets maximal value that each index may have.
'-1' index have special meaning and that is to drop frame.
@end table

The first frame has the index 0. The default is to keep the input unchanged.

@subsection Examples

@itemize
@item
Swap second and third frame of every three frames of the input:
@example
ffmpeg -i INPUT -vf "shuffleframes=0 2 1" OUTPUT
@end example

@item
Swap 10th and 1st frame of every ten frames of the input:
@example
ffmpeg -i INPUT -vf "shuffleframes=9 1 2 3 4 5 6 7 8 0" OUTPUT
@end example
@end itemize

@section shuffleplanes

Reorder and/or duplicate video planes.

It accepts the following parameters:

@table @option

@item map0
The index of the input plane to be used as the first output plane.

@item map1
The index of the input plane to be used as the second output plane.

@item map2
The index of the input plane to be used as the third output plane.

@item map3
The index of the input plane to be used as the fourth output plane.

@end table

The first plane has the index 0. The default is to keep the input unchanged.

@subsection Examples

@itemize
@item
Swap the second and third planes of the input:
@example
ffmpeg -i INPUT -vf shuffleplanes=0:2:1:3 OUTPUT
@end example
@end itemize

@anchor{signalstats}
@section signalstats
Evaluate various visual metrics that assist in determining issues associated
with the digitization of analog video media.

By default the filter will log these metadata values:

@table @option
@item YMIN
Display the minimal Y value contained within the input frame. Expressed in
range of [0-255].

@item YLOW
Display the Y value at the 10% percentile within the input frame. Expressed in
range of [0-255].

@item YAVG
Display the average Y value within the input frame. Expressed in range of
[0-255].

@item YHIGH
Display the Y value at the 90% percentile within the input frame. Expressed in
range of [0-255].

@item YMAX
Display the maximum Y value contained within the input frame. Expressed in
range of [0-255].

@item UMIN
Display the minimal U value contained within the input frame. Expressed in
range of [0-255].

@item ULOW
Display the U value at the 10% percentile within the input frame. Expressed in
range of [0-255].

@item UAVG
Display the average U value within the input frame. Expressed in range of
[0-255].

@item UHIGH
Display the U value at the 90% percentile within the input frame. Expressed in
range of [0-255].

@item UMAX
Display the maximum U value contained within the input frame. Expressed in
range of [0-255].

@item VMIN
Display the minimal V value contained within the input frame. Expressed in
range of [0-255].

@item VLOW
Display the V value at the 10% percentile within the input frame. Expressed in
range of [0-255].

@item VAVG
Display the average V value within the input frame. Expressed in range of
[0-255].

@item VHIGH
Display the V value at the 90% percentile within the input frame. Expressed in
range of [0-255].

@item VMAX
Display the maximum V value contained within the input frame. Expressed in
range of [0-255].

@item SATMIN
Display the minimal saturation value contained within the input frame.
Expressed in range of [0-~181.02].

@item SATLOW
Display the saturation value at the 10% percentile within the input frame.
Expressed in range of [0-~181.02].

@item SATAVG
Display the average saturation value within the input frame. Expressed in range
of [0-~181.02].

@item SATHIGH
Display the saturation value at the 90% percentile within the input frame.
Expressed in range of [0-~181.02].

@item SATMAX
Display the maximum saturation value contained within the input frame.
Expressed in range of [0-~181.02].

@item HUEMED
Display the median value for hue within the input frame. Expressed in range of
[0-360].

@item HUEAVG
Display the average value for hue within the input frame. Expressed in range of
[0-360].

@item YDIF
Display the average of sample value difference between all values of the Y
plane in the current frame and corresponding values of the previous input frame.
Expressed in range of [0-255].

@item UDIF
Display the average of sample value difference between all values of the U
plane in the current frame and corresponding values of the previous input frame.
Expressed in range of [0-255].

@item VDIF
Display the average of sample value difference between all values of the V
plane in the current frame and corresponding values of the previous input frame.
Expressed in range of [0-255].

@item YBITDEPTH
Display bit depth of Y plane in current frame.
Expressed in range of [0-16].

@item UBITDEPTH
Display bit depth of U plane in current frame.
Expressed in range of [0-16].

@item VBITDEPTH
Display bit depth of V plane in current frame.
Expressed in range of [0-16].
@end table

The filter accepts the following options:

@table @option
@item stat
@item out

@option{stat} specify an additional form of image analysis.
@option{out} output video with the specified type of pixel highlighted.

Both options accept the following values:

@table @samp
@item tout
Identify @var{temporal outliers} pixels. A @var{temporal outlier} is a pixel
unlike the neighboring pixels of the same field. Examples of temporal outliers
include the results of video dropouts, head clogs, or tape tracking issues.

@item vrep
Identify @var{vertical line repetition}. Vertical line repetition includes
similar rows of pixels within a frame. In born-digital video vertical line
repetition is common, but this pattern is uncommon in video digitized from an
analog source. When it occurs in video that results from the digitization of an
analog source it can indicate concealment from a dropout compensator.

@item brng
Identify pixels that fall outside of legal broadcast range.
@end table

@item color, c
Set the highlight color for the @option{out} option. The default color is
yellow.
@end table

@subsection Examples

@itemize
@item
Output data of various video metrics:
@example
ffprobe -f lavfi movie=example.mov,signalstats="stat=tout+vrep+brng" -show_frames
@end example

@item
Output specific data about the minimum and maximum values of the Y plane per frame:
@example
ffprobe -f lavfi movie=example.mov,signalstats -show_entries frame_tags=lavfi.signalstats.YMAX,lavfi.signalstats.YMIN
@end example

@item
Playback video while highlighting pixels that are outside of broadcast range in red.
@example
ffplay example.mov -vf signalstats="out=brng:color=red"
@end example

@item
Playback video with signalstats metadata drawn over the frame.
@example
ffplay example.mov -vf signalstats=stat=brng+vrep+tout,drawtext=fontfile=FreeSerif.ttf:textfile=signalstat_drawtext.txt
@end example

The contents of signalstat_drawtext.txt used in the command are:
@example
time %@{pts:hms@}
Y (%@{metadata:lavfi.signalstats.YMIN@}-%@{metadata:lavfi.signalstats.YMAX@})
U (%@{metadata:lavfi.signalstats.UMIN@}-%@{metadata:lavfi.signalstats.UMAX@})
V (%@{metadata:lavfi.signalstats.VMIN@}-%@{metadata:lavfi.signalstats.VMAX@})
saturation maximum: %@{metadata:lavfi.signalstats.SATMAX@}

@end example
@end itemize

@anchor{signature}
@section signature

Calculates the MPEG-7 Video Signature. The filter can handle more than one
input. In this case the matching between the inputs can be calculated additionally.
The filter always passes through the first input. The signature of each stream can
be written into a file.

It accepts the following options:

@table @option
@item detectmode
Enable or disable the matching process.

Available values are:

@table @samp
@item off
Disable the calculation of a matching (default).
@item full
Calculate the matching for the whole video and output whether the whole video
matches or only parts.
@item fast
Calculate only until a matching is found or the video ends. Should be faster in
some cases.
@end table

@item nb_inputs
Set the number of inputs. The option value must be a non negative integer.
Default value is 1.

@item filename
Set the path to which the output is written. If there is more than one input,
the path must be a prototype, i.e. must contain %d or %0nd (where n is a positive
integer), that will be replaced with the input number. If no filename is
specified, no output will be written. This is the default.

@item format
Choose the output format.

Available values are:

@table @samp
@item binary
Use the specified binary representation (default).
@item xml
Use the specified xml representation.
@end table

@item th_d
Set threshold to detect one word as similar. The option value must be an integer
greater than zero. The default value is 9000.

@item th_dc
Set threshold to detect all words as similar. The option value must be an integer
greater than zero. The default value is 60000.

@item th_xh
Set threshold to detect frames as similar. The option value must be an integer
greater than zero. The default value is 116.

@item th_di
Set the minimum length of a sequence in frames to recognize it as matching
sequence. The option value must be a non negative integer value.
The default value is 0.

@item th_it
Set the minimum relation, that matching frames to all frames must have.
The option value must be a double value between 0 and 1. The default value is 0.5.
@end table

@subsection Examples

@itemize
@item
To calculate the signature of an input video and store it in signature.bin:
@example
ffmpeg -i input.mkv -vf signature=filename=signature.bin -map 0:v -f null -
@end example

@item
To detect whether two videos match and store the signatures in XML format in
signature0.xml and signature1.xml:
@example
ffmpeg -i input1.mkv -i input2.mkv -filter_complex "[0:v][1:v] signature=nb_inputs=2:detectmode=full:format=xml:filename=signature%d.xml" -map :v -f null -
@end example

@end itemize

@anchor{smartblur}
@section smartblur

Blur the input video without impacting the outlines.

It accepts the following options:

@table @option
@item luma_radius, lr
Set the luma radius. The option value must be a float number in
the range [0.1,5.0] that specifies the variance of the gaussian filter
used to blur the image (slower if larger). Default value is 1.0.

@item luma_strength, ls
Set the luma strength. The option value must be a float number
in the range [-1.0,1.0] that configures the blurring. A value included
in [0.0,1.0] will blur the image whereas a value included in
[-1.0,0.0] will sharpen the image. Default value is 1.0.

@item luma_threshold, lt
Set the luma threshold used as a coefficient to determine
whether a pixel should be blurred or not. The option value must be an
integer in the range [-30,30]. A value of 0 will filter all the image,
a value included in [0,30] will filter flat areas and a value included
in [-30,0] will filter edges. Default value is 0.

@item chroma_radius, cr
Set the chroma radius. The option value must be a float number in
the range [0.1,5.0] that specifies the variance of the gaussian filter
used to blur the image (slower if larger). Default value is @option{luma_radius}.

@item chroma_strength, cs
Set the chroma strength. The option value must be a float number
in the range [-1.0,1.0] that configures the blurring. A value included
in [0.0,1.0] will blur the image whereas a value included in
[-1.0,0.0] will sharpen the image. Default value is @option{luma_strength}.

@item chroma_threshold, ct
Set the chroma threshold used as a coefficient to determine
whether a pixel should be blurred or not. The option value must be an
integer in the range [-30,30]. A value of 0 will filter all the image,
a value included in [0,30] will filter flat areas and a value included
in [-30,0] will filter edges. Default value is @option{luma_threshold}.
@end table

If a chroma option is not explicitly set, the corresponding luma value
is set.

@section ssim

Obtain the SSIM (Structural SImilarity Metric) between two input videos.

This filter takes in input two input videos, the first input is
considered the "main" source and is passed unchanged to the
output. The second input is used as a "reference" video for computing
the SSIM.

Both video inputs must have the same resolution and pixel format for
this filter to work correctly. Also it assumes that both inputs
have the same number of frames, which are compared one by one.

The filter stores the calculated SSIM of each frame.

The description of the accepted parameters follows.

@table @option
@item stats_file, f
If specified the filter will use the named file to save the SSIM of
each individual frame. When filename equals "-" the data is sent to
standard output.
@end table

The file printed if @var{stats_file} is selected, contains a sequence of
key/value pairs of the form @var{key}:@var{value} for each compared
couple of frames.

A description of each shown parameter follows:

@table @option
@item n
sequential number of the input frame, starting from 1

@item Y, U, V, R, G, B
SSIM of the compared frames for the component specified by the suffix.

@item All
SSIM of the compared frames for the whole frame.

@item dB
Same as above but in dB representation.
@end table

This filter also supports the @ref{framesync} options.

For example:
@example
movie=ref_movie.mpg, setpts=PTS-STARTPTS [main];
[main][ref] ssim="stats_file=stats.log" [out]
@end example

On this example the input file being processed is compared with the
reference file @file{ref_movie.mpg}. The SSIM of each individual frame
is stored in @file{stats.log}.

Another example with both psnr and ssim at same time:
@example
ffmpeg -i main.mpg -i ref.mpg -lavfi  "ssim;[0:v][1:v]psnr" -f null -
@end example

@section stereo3d

Convert between different stereoscopic image formats.

The filters accept the following options:

@table @option
@item in
Set stereoscopic image format of input.

Available values for input image formats are:
@table @samp
@item sbsl
side by side parallel (left eye left, right eye right)

@item sbsr
side by side crosseye (right eye left, left eye right)

@item sbs2l
side by side parallel with half width resolution
(left eye left, right eye right)

@item sbs2r
side by side crosseye with half width resolution
(right eye left, left eye right)

@item abl
above-below (left eye above, right eye below)

@item abr
above-below (right eye above, left eye below)

@item ab2l
above-below with half height resolution
(left eye above, right eye below)

@item ab2r
above-below with half height resolution
(right eye above, left eye below)

@item al
alternating frames (left eye first, right eye second)

@item ar
alternating frames (right eye first, left eye second)

@item irl
interleaved rows (left eye has top row, right eye starts on next row)

@item irr
interleaved rows (right eye has top row, left eye starts on next row)

@item icl
interleaved columns, left eye first

@item icr
interleaved columns, right eye first

Default value is @samp{sbsl}.
@end table

@item out
Set stereoscopic image format of output.

@table @samp
@item sbsl
side by side parallel (left eye left, right eye right)

@item sbsr
side by side crosseye (right eye left, left eye right)

@item sbs2l
side by side parallel with half width resolution
(left eye left, right eye right)

@item sbs2r
side by side crosseye with half width resolution
(right eye left, left eye right)

@item abl
above-below (left eye above, right eye below)

@item abr
above-below (right eye above, left eye below)

@item ab2l
above-below with half height resolution
(left eye above, right eye below)

@item ab2r
above-below with half height resolution
(right eye above, left eye below)

@item al
alternating frames (left eye first, right eye second)

@item ar
alternating frames (right eye first, left eye second)

@item irl
interleaved rows (left eye has top row, right eye starts on next row)

@item irr
interleaved rows (right eye has top row, left eye starts on next row)

@item arbg
anaglyph red/blue gray
(red filter on left eye, blue filter on right eye)

@item argg
anaglyph red/green gray
(red filter on left eye, green filter on right eye)

@item arcg
anaglyph red/cyan gray
(red filter on left eye, cyan filter on right eye)

@item arch
anaglyph red/cyan half colored
(red filter on left eye, cyan filter on right eye)

@item arcc
anaglyph red/cyan color
(red filter on left eye, cyan filter on right eye)

@item arcd
anaglyph red/cyan color optimized with the least squares projection of dubois
(red filter on left eye, cyan filter on right eye)

@item agmg
anaglyph green/magenta gray
(green filter on left eye, magenta filter on right eye)

@item agmh
anaglyph green/magenta half colored
(green filter on left eye, magenta filter on right eye)

@item agmc
anaglyph green/magenta colored
(green filter on left eye, magenta filter on right eye)

@item agmd
anaglyph green/magenta color optimized with the least squares projection of dubois
(green filter on left eye, magenta filter on right eye)

@item aybg
anaglyph yellow/blue gray
(yellow filter on left eye, blue filter on right eye)

@item aybh
anaglyph yellow/blue half colored
(yellow filter on left eye, blue filter on right eye)

@item aybc
anaglyph yellow/blue colored
(yellow filter on left eye, blue filter on right eye)

@item aybd
anaglyph yellow/blue color optimized with the least squares projection of dubois
(yellow filter on left eye, blue filter on right eye)

@item ml
mono output (left eye only)

@item mr
mono output (right eye only)

@item chl
checkerboard, left eye first

@item chr
checkerboard, right eye first

@item icl
interleaved columns, left eye first

@item icr
interleaved columns, right eye first

@item hdmi
HDMI frame pack
@end table

Default value is @samp{arcd}.
@end table

@subsection Examples

@itemize
@item
Convert input video from side by side parallel to anaglyph yellow/blue dubois:
@example
stereo3d=sbsl:aybd
@end example

@item
Convert input video from above below (left eye above, right eye below) to side by side crosseye.
@example
stereo3d=abl:sbsr
@end example
@end itemize

@section streamselect, astreamselect
Select video or audio streams.

The filter accepts the following options:

@table @option
@item inputs
Set number of inputs. Default is 2.

@item map
Set input indexes to remap to outputs.
@end table

@subsection Commands

The @code{streamselect} and @code{astreamselect} filter supports the following
commands:

@table @option
@item map
Set input indexes to remap to outputs.
@end table

@subsection Examples

@itemize
@item
Select first 5 seconds 1st stream and rest of time 2nd stream:
@example
sendcmd='5.0 streamselect map 1',streamselect=inputs=2:map=0
@end example

@item
Same as above, but for audio:
@example
asendcmd='5.0 astreamselect map 1',astreamselect=inputs=2:map=0
@end example
@end itemize

@section sobel
Apply sobel operator to input video stream.

The filter accepts the following option:

@table @option
@item planes
Set which planes will be processed, unprocessed planes will be copied.
By default value 0xf, all planes will be processed.

@item scale
Set value which will be multiplied with filtered result.

@item delta
Set value which will be added to filtered result.
@end table

@anchor{spp}
@section spp

Apply a simple postprocessing filter that compresses and decompresses the image
at several (or - in the case of @option{quality} level @code{6} - all) shifts
and average the results.

The filter accepts the following options:

@table @option
@item quality
Set quality. This option defines the number of levels for averaging. It accepts
an integer in the range 0-6. If set to @code{0}, the filter will have no
effect. A value of @code{6} means the higher quality. For each increment of
that value the speed drops by a factor of approximately 2.  Default value is
@code{3}.

@item qp
Force a constant quantization parameter. If not set, the filter will use the QP
from the video stream (if available).

@item mode
Set thresholding mode. Available modes are:

@table @samp
@item hard
Set hard thresholding (default).
@item soft
Set soft thresholding (better de-ringing effect, but likely blurrier).
@end table

@item use_bframe_qp
Enable the use of the QP from the B-Frames if set to @code{1}. Using this
option may cause flicker since the B-Frames have often larger QP. Default is
@code{0} (not enabled).
@end table

@anchor{subtitles}
@section subtitles

Draw subtitles on top of input video using the libass library.

To enable compilation of this filter you need to configure FFmpeg with
@code{--enable-libass}. This filter also requires a build with libavcodec and
libavformat to convert the passed subtitles file to ASS (Advanced Substation
Alpha) subtitles format.

The filter accepts the following options:

@table @option
@item filename, f
Set the filename of the subtitle file to read. It must be specified.

@item original_size
Specify the size of the original video, the video for which the ASS file
was composed. For the syntax of this option, check the
@ref{video size syntax,,"Video size" section in the ffmpeg-utils manual,ffmpeg-utils}.
Due to a misdesign in ASS aspect ratio arithmetic, this is necessary to
correctly scale the fonts if the aspect ratio has been changed.

@item fontsdir
Set a directory path containing fonts that can be used by the filter.
These fonts will be used in addition to whatever the font provider uses.

@item alpha
Process alpha channel, by default alpha channel is untouched.

@item charenc
Set subtitles input character encoding. @code{subtitles} filter only. Only
useful if not UTF-8.

@item stream_index, si
Set subtitles stream index. @code{subtitles} filter only.

@item force_style
Override default style or script info parameters of the subtitles. It accepts a
string containing ASS style format @code{KEY=VALUE} couples separated by ",".
@end table

If the first key is not specified, it is assumed that the first value
specifies the @option{filename}.

For example, to render the file @file{sub.srt} on top of the input
video, use the command:
@example
subtitles=sub.srt
@end example

which is equivalent to:
@example
subtitles=filename=sub.srt
@end example

To render the default subtitles stream from file @file{video.mkv}, use:
@example
subtitles=video.mkv
@end example

To render the second subtitles stream from that file, use:
@example
subtitles=video.mkv:si=1
@end example

To make the subtitles stream from @file{sub.srt} appear in transparent green
@code{DejaVu Serif}, use:
@example
subtitles=sub.srt:force_style='FontName=DejaVu Serif,PrimaryColour=&HAA00FF00'
@end example

@section super2xsai

Scale the input by 2x and smooth using the Super2xSaI (Scale and
Interpolate) pixel art scaling algorithm.

Useful for enlarging pixel art images without reducing sharpness.

@section swaprect

Swap two rectangular objects in video.

This filter accepts the following options:

@table @option
@item w
Set object width.

@item h
Set object height.

@item x1
Set 1st rect x coordinate.

@item y1
Set 1st rect y coordinate.

@item x2
Set 2nd rect x coordinate.

@item y2
Set 2nd rect y coordinate.

All expressions are evaluated once for each frame.
@end table

The all options are expressions containing the following constants:

@table @option
@item w
@item h
The input width and height.

@item a
same as @var{w} / @var{h}

@item sar
input sample aspect ratio

@item dar
input display aspect ratio, it is the same as (@var{w} / @var{h}) * @var{sar}

@item n
The number of the input frame, starting from 0.

@item t
The timestamp expressed in seconds. It's NAN if the input timestamp is unknown.

@item pos
the position in the file of the input frame, NAN if unknown
@end table

@section swapuv
Swap U & V plane.

@section telecine

Apply telecine process to the video.

This filter accepts the following options:

@table @option
@item first_field
@table @samp
@item top, t
top field first
@item bottom, b
bottom field first
The default value is @code{top}.
@end table

@item pattern
A string of numbers representing the pulldown pattern you wish to apply.
The default value is @code{23}.
@end table

@example
Some typical patterns:

NTSC output (30i):
27.5p: 32222
24p: 23 (classic)
24p: 2332 (preferred)
20p: 33
18p: 334
16p: 3444

PAL output (25i):
27.5p: 12222
24p: 222222222223 ("Euro pulldown")
16.67p: 33
16p: 33333334
@end example

@section threshold

Apply threshold effect to video stream.

This filter needs four video streams to perform thresholding.
First stream is stream we are filtering.
Second stream is holding threshold values, third stream is holding min values,
and last, fourth stream is holding max values.

The filter accepts the following option:

@table @option
@item planes
Set which planes will be processed, unprocessed planes will be copied.
By default value 0xf, all planes will be processed.
@end table

For example if first stream pixel's component value is less then threshold value
of pixel component from 2nd threshold stream, third stream value will picked,
otherwise fourth stream pixel component value will be picked.

Using color source filter one can perform various types of thresholding:

@subsection Examples

@itemize
@item
Binary threshold, using gray color as threshold:
@example
ffmpeg -i 320x240.avi -f lavfi -i color=gray -f lavfi -i color=black -f lavfi -i color=white -lavfi threshold output.avi
@end example

@item
Inverted binary threshold, using gray color as threshold:
@example
ffmpeg -i 320x240.avi -f lavfi -i color=gray -f lavfi -i color=white -f lavfi -i color=black -lavfi threshold output.avi
@end example

@item
Truncate binary threshold, using gray color as threshold:
@example
ffmpeg -i 320x240.avi -f lavfi -i color=gray -i 320x240.avi -f lavfi -i color=gray -lavfi threshold output.avi
@end example

@item
Threshold to zero, using gray color as threshold:
@example
ffmpeg -i 320x240.avi -f lavfi -i color=gray -f lavfi -i color=white -i 320x240.avi -lavfi threshold output.avi
@end example

@item
Inverted threshold to zero, using gray color as threshold:
@example
ffmpeg -i 320x240.avi -f lavfi -i color=gray -i 320x240.avi -f lavfi -i color=white -lavfi threshold output.avi
@end example
@end itemize

@section thumbnail
Select the most representative frame in a given sequence of consecutive frames.

The filter accepts the following options:

@table @option
@item n
Set the frames batch size to analyze; in a set of @var{n} frames, the filter
will pick one of them, and then handle the next batch of @var{n} frames until
the end. Default is @code{100}.
@end table

Since the filter keeps track of the whole frames sequence, a bigger @var{n}
value will result in a higher memory usage, so a high value is not recommended.

@subsection Examples

@itemize
@item
Extract one picture each 50 frames:
@example
thumbnail=50
@end example

@item
Complete example of a thumbnail creation with @command{ffmpeg}:
@example
ffmpeg -i in.avi -vf thumbnail,scale=300:200 -frames:v 1 out.png
@end example
@end itemize

@section tile

Tile several successive frames together.

The filter accepts the following options:

@table @option

@item layout
Set the grid size (i.e. the number of lines and columns). For the syntax of
this option, check the
@ref{video size syntax,,"Video size" section in the ffmpeg-utils manual,ffmpeg-utils}.

@item nb_frames
Set the maximum number of frames to render in the given area. It must be less
than or equal to @var{w}x@var{h}. The default value is @code{0}, meaning all
the area will be used.

@item margin
Set the outer border margin in pixels.

@item padding
Set the inner border thickness (i.e. the number of pixels between frames). For
more advanced padding options (such as having different values for the edges),
refer to the pad video filter.

@item color
Specify the color of the unused area. For the syntax of this option, check the
@ref{color syntax,,"Color" section in the ffmpeg-utils manual,ffmpeg-utils}.
The default value of @var{color} is "black".

@item overlap
Set the number of frames to overlap when tiling several successive frames together.
The value must be between @code{0} and @var{nb_frames - 1}.

@item init_padding
Set the number of frames to initially be empty before displaying first output frame.
This controls how soon will one get first output frame.
The value must be between @code{0} and @var{nb_frames - 1}.
@end table

@subsection Examples

@itemize
@item
Produce 8x8 PNG tiles of all keyframes (@option{-skip_frame nokey}) in a movie:
@example
ffmpeg -skip_frame nokey -i file.avi -vf 'scale=128:72,tile=8x8' -an -vsync 0 keyframes%03d.png
@end example
The @option{-vsync 0} is necessary to prevent @command{ffmpeg} from
duplicating each output frame to accommodate the originally detected frame
rate.

@item
Display @code{5} pictures in an area of @code{3x2} frames,
with @code{7} pixels between them, and @code{2} pixels of initial margin, using
mixed flat and named options:
@example
tile=3x2:nb_frames=5:padding=7:margin=2
@end example
@end itemize

@section tinterlace

Perform various types of temporal field interlacing.

Frames are counted starting from 1, so the first input frame is
considered odd.

The filter accepts the following options:

@table @option

@item mode
Specify the mode of the interlacing. This option can also be specified
as a value alone. See below for a list of values for this option.

Available values are:

@table @samp
@item merge, 0
Move odd frames into the upper field, even into the lower field,
generating a double height frame at half frame rate.
@example
 ------> time
Input:
Frame 1         Frame 2         Frame 3         Frame 4

11111           22222           33333           44444
11111           22222           33333           44444
11111           22222           33333           44444
11111           22222           33333           44444

Output:
11111                           33333
22222                           44444
11111                           33333
22222                           44444
11111                           33333
22222                           44444
11111                           33333
22222                           44444
@end example

@item drop_even, 1
Only output odd frames, even frames are dropped, generating a frame with
unchanged height at half frame rate.

@example
 ------> time
Input:
Frame 1         Frame 2         Frame 3         Frame 4

11111           22222           33333           44444
11111           22222           33333           44444
11111           22222           33333           44444
11111           22222           33333           44444

Output:
11111                           33333
11111                           33333
11111                           33333
11111                           33333
@end example

@item drop_odd, 2
Only output even frames, odd frames are dropped, generating a frame with
unchanged height at half frame rate.

@example
 ------> time
Input:
Frame 1         Frame 2         Frame 3         Frame 4

11111           22222           33333           44444
11111           22222           33333           44444
11111           22222           33333           44444
11111           22222           33333           44444

Output:
                22222                           44444
                22222                           44444
                22222                           44444
                22222                           44444
@end example

@item pad, 3
Expand each frame to full height, but pad alternate lines with black,
generating a frame with double height at the same input frame rate.

@example
 ------> time
Input:
Frame 1         Frame 2         Frame 3         Frame 4

11111           22222           33333           44444
11111           22222           33333           44444
11111           22222           33333           44444
11111           22222           33333           44444

Output:
11111           .....           33333           .....
.....           22222           .....           44444
11111           .....           33333           .....
.....           22222           .....           44444
11111           .....           33333           .....
.....           22222           .....           44444
11111           .....           33333           .....
.....           22222           .....           44444
@end example


@item interleave_top, 4
Interleave the upper field from odd frames with the lower field from
even frames, generating a frame with unchanged height at half frame rate.

@example
 ------> time
Input:
Frame 1         Frame 2         Frame 3         Frame 4

11111<-         22222           33333<-         44444
11111           22222<-         33333           44444<-
11111<-         22222           33333<-         44444
11111           22222<-         33333           44444<-

Output:
11111                           33333
22222                           44444
11111                           33333
22222                           44444
@end example


@item interleave_bottom, 5
Interleave the lower field from odd frames with the upper field from
even frames, generating a frame with unchanged height at half frame rate.

@example
 ------> time
Input:
Frame 1         Frame 2         Frame 3         Frame 4

11111           22222<-         33333           44444<-
11111<-         22222           33333<-         44444
11111           22222<-         33333           44444<-
11111<-         22222           33333<-         44444

Output:
22222                           44444
11111                           33333
22222                           44444
11111                           33333
@end example


@item interlacex2, 6
Double frame rate with unchanged height. Frames are inserted each
containing the second temporal field from the previous input frame and
the first temporal field from the next input frame. This mode relies on
the top_field_first flag. Useful for interlaced video displays with no
field synchronisation.

@example
 ------> time
Input:
Frame 1         Frame 2         Frame 3         Frame 4

11111           22222           33333           44444
 11111           22222           33333           44444
11111           22222           33333           44444
 11111           22222           33333           44444

Output:
11111   22222   22222   33333   33333   44444   44444
 11111   11111   22222   22222   33333   33333   44444
11111   22222   22222   33333   33333   44444   44444
 11111   11111   22222   22222   33333   33333   44444
@end example


@item mergex2, 7
Move odd frames into the upper field, even into the lower field,
generating a double height frame at same frame rate.

@example
 ------> time
Input:
Frame 1         Frame 2         Frame 3         Frame 4

11111           22222           33333           44444
11111           22222           33333           44444
11111           22222           33333           44444
11111           22222           33333           44444

Output:
11111           33333           33333           55555
22222           22222           44444           44444
11111           33333           33333           55555
22222           22222           44444           44444
11111           33333           33333           55555
22222           22222           44444           44444
11111           33333           33333           55555
22222           22222           44444           44444
@end example

@end table

Numeric values are deprecated but are accepted for backward
compatibility reasons.

Default mode is @code{merge}.

@item flags
Specify flags influencing the filter process.

Available value for @var{flags} is:

@table @option
@item low_pass_filter, vlfp
Enable linear vertical low-pass filtering in the filter.
Vertical low-pass filtering is required when creating an interlaced
destination from a progressive source which contains high-frequency
vertical detail. Filtering will reduce interlace 'twitter' and Moire
patterning.

@item complex_filter, cvlfp
Enable complex vertical low-pass filtering.
This will slightly less reduce interlace 'twitter' and Moire
patterning but better retain detail and subjective sharpness impression.

@end table

Vertical low-pass filtering can only be enabled for @option{mode}
@var{interleave_top} and @var{interleave_bottom}.

@end table

@section tonemap
Tone map colors from different dynamic ranges.

This filter expects data in single precision floating point, as it needs to
operate on (and can output) out-of-range values. Another filter, such as
@ref{zscale}, is needed to convert the resulting frame to a usable format.

The tonemapping algorithms implemented only work on linear light, so input
data should be linearized beforehand (and possibly correctly tagged).

@example
ffmpeg -i INPUT -vf zscale=transfer=linear,tonemap=clip,zscale=transfer=bt709,format=yuv420p OUTPUT
@end example

@subsection Options
The filter accepts the following options.

@table @option
@item tonemap
Set the tone map algorithm to use.

Possible values are:
@table @var
@item none
Do not apply any tone map, only desaturate overbright pixels.

@item clip
Hard-clip any out-of-range values. Use it for perfect color accuracy for
in-range values, while distorting out-of-range values.

@item linear
Stretch the entire reference gamut to a linear multiple of the display.

@item gamma
Fit a logarithmic transfer between the tone curves.

@item reinhard
Preserve overall image brightness with a simple curve, using nonlinear
contrast, which results in flattening details and degrading color accuracy.

@item hable
Preserve both dark and bright details better than @var{reinhard}, at the cost
of slightly darkening everything. Use it when detail preservation is more
important than color and brightness accuracy.

@item mobius
Smoothly map out-of-range values, while retaining contrast and colors for
in-range material as much as possible. Use it when color accuracy is more
important than detail preservation.
@end table

Default is none.

@item param
Tune the tone mapping algorithm.

This affects the following algorithms:
@table @var
@item none
Ignored.

@item linear
Specifies the scale factor to use while stretching.
Default to 1.0.

@item gamma
Specifies the exponent of the function.
Default to 1.8.

@item clip
Specify an extra linear coefficient to multiply into the signal before clipping.
Default to 1.0.

@item reinhard
Specify the local contrast coefficient at the display peak.
Default to 0.5, which means that in-gamut values will be about half as bright
as when clipping.

@item hable
Ignored.

@item mobius
Specify the transition point from linear to mobius transform. Every value
below this point is guaranteed to be mapped 1:1. The higher the value, the
more accurate the result will be, at the cost of losing bright details.
Default to 0.3, which due to the steep initial slope still preserves in-range
colors fairly accurately.
@end table

@item desat
Apply desaturation for highlights that exceed this level of brightness. The
higher the parameter, the more color information will be preserved. This
setting helps prevent unnaturally blown-out colors for super-highlights, by
(smoothly) turning into white instead. This makes images feel more natural,
at the cost of reducing information about out-of-range colors.

The default of 2.0 is somewhat conservative and will mostly just apply to
skies or directly sunlit surfaces. A setting of 0.0 disables this option.

This option works only if the input frame has a supported color tag.

@item peak
Override signal/nominal/reference peak with this value. Useful when the
embedded peak information in display metadata is not reliable or when tone
mapping from a lower range to a higher range.
@end table

@section transpose

Transpose rows with columns in the input video and optionally flip it.

It accepts the following parameters:

@table @option

@item dir
Specify the transposition direction.

Can assume the following values:
@table @samp
@item 0, 4, cclock_flip
Rotate by 90 degrees counterclockwise and vertically flip (default), that is:
@example
L.R     L.l
. . ->  . .
l.r     R.r
@end example

@item 1, 5, clock
Rotate by 90 degrees clockwise, that is:
@example
L.R     l.L
. . ->  . .
l.r     r.R
@end example

@item 2, 6, cclock
Rotate by 90 degrees counterclockwise, that is:
@example
L.R     R.r
. . ->  . .
l.r     L.l
@end example

@item 3, 7, clock_flip
Rotate by 90 degrees clockwise and vertically flip, that is:
@example
L.R     r.R
. . ->  . .
l.r     l.L
@end example
@end table

For values between 4-7, the transposition is only done if the input
video geometry is portrait and not landscape. These values are
deprecated, the @code{passthrough} option should be used instead.

Numerical values are deprecated, and should be dropped in favor of
symbolic constants.

@item passthrough
Do not apply the transposition if the input geometry matches the one
specified by the specified value. It accepts the following values:
@table @samp
@item none
Always apply transposition.
@item portrait
Preserve portrait geometry (when @var{height} >= @var{width}).
@item landscape
Preserve landscape geometry (when @var{width} >= @var{height}).
@end table

Default value is @code{none}.
@end table

For example to rotate by 90 degrees clockwise and preserve portrait
layout:
@example
transpose=dir=1:passthrough=portrait
@end example

The command above can also be specified as:
@example
transpose=1:portrait
@end example

@section trim
Trim the input so that the output contains one continuous subpart of the input.

It accepts the following parameters:
@table @option
@item start
Specify the time of the start of the kept section, i.e. the frame with the
timestamp @var{start} will be the first frame in the output.

@item end
Specify the time of the first frame that will be dropped, i.e. the frame
immediately preceding the one with the timestamp @var{end} will be the last
frame in the output.

@item start_pts
This is the same as @var{start}, except this option sets the start timestamp
in timebase units instead of seconds.

@item end_pts
This is the same as @var{end}, except this option sets the end timestamp
in timebase units instead of seconds.

@item duration
The maximum duration of the output in seconds.

@item start_frame
The number of the first frame that should be passed to the output.

@item end_frame
The number of the first frame that should be dropped.
@end table

@option{start}, @option{end}, and @option{duration} are expressed as time
duration specifications; see
@ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils}
for the accepted syntax.

Note that the first two sets of the start/end options and the @option{duration}
option look at the frame timestamp, while the _frame variants simply count the
frames that pass through the filter. Also note that this filter does not modify
the timestamps. If you wish for the output timestamps to start at zero, insert a
setpts filter after the trim filter.

If multiple start or end options are set, this filter tries to be greedy and
keep all the frames that match at least one of the specified constraints. To keep
only the part that matches all the constraints at once, chain multiple trim
filters.

The defaults are such that all the input is kept. So it is possible to set e.g.
just the end values to keep everything before the specified time.

Examples:
@itemize
@item
Drop everything except the second minute of input:
@example
ffmpeg -i INPUT -vf trim=60:120
@end example

@item
Keep only the first second:
@example
ffmpeg -i INPUT -vf trim=duration=1
@end example

@end itemize

@section unpremultiply
Apply alpha unpremultiply effect to input video stream using first plane
of second stream as alpha.

Both streams must have same dimensions and same pixel format.

The filter accepts the following option:

@table @option
@item planes
Set which planes will be processed, unprocessed planes will be copied.
By default value 0xf, all planes will be processed.

If the format has 1 or 2 components, then luma is bit 0.
If the format has 3 or 4 components:
for RGB formats bit 0 is green, bit 1 is blue and bit 2 is red;
for YUV formats bit 0 is luma, bit 1 is chroma-U and bit 2 is chroma-V.
If present, the alpha channel is always the last bit.

@item inplace
Do not require 2nd input for processing, instead use alpha plane from input stream.
@end table

@anchor{unsharp}
@section unsharp

Sharpen or blur the input video.

It accepts the following parameters:

@table @option
@item luma_msize_x, lx
Set the luma matrix horizontal size. It must be an odd integer between
3 and 23. The default value is 5.

@item luma_msize_y, ly
Set the luma matrix vertical size. It must be an odd integer between 3
and 23. The default value is 5.

@item luma_amount, la
Set the luma effect strength. It must be a floating point number, reasonable
values lay between -1.5 and 1.5.

Negative values will blur the input video, while positive values will
sharpen it, a value of zero will disable the effect.

Default value is 1.0.

@item chroma_msize_x, cx
Set the chroma matrix horizontal size. It must be an odd integer
between 3 and 23. The default value is 5.

@item chroma_msize_y, cy
Set the chroma matrix vertical size. It must be an odd integer
between 3 and 23. The default value is 5.

@item chroma_amount, ca
Set the chroma effect strength. It must be a floating point number, reasonable
values lay between -1.5 and 1.5.

Negative values will blur the input video, while positive values will
sharpen it, a value of zero will disable the effect.

Default value is 0.0.

@end table

All parameters are optional and default to the equivalent of the
string '5:5:1.0:5:5:0.0'.

@subsection Examples

@itemize
@item
Apply strong luma sharpen effect:
@example
unsharp=luma_msize_x=7:luma_msize_y=7:luma_amount=2.5
@end example

@item
Apply a strong blur of both luma and chroma parameters:
@example
unsharp=7:7:-2:7:7:-2
@end example
@end itemize

@section uspp

Apply ultra slow/simple postprocessing filter that compresses and decompresses
the image at several (or - in the case of @option{quality} level @code{8} - all)
shifts and average the results.

The way this differs from the behavior of spp is that uspp actually encodes &
decodes each case with libavcodec Snow, whereas spp uses a simplified intra only 8x8
DCT similar to MJPEG.

The filter accepts the following options:

@table @option
@item quality
Set quality. This option defines the number of levels for averaging. It accepts
an integer in the range 0-8. If set to @code{0}, the filter will have no
effect. A value of @code{8} means the higher quality. For each increment of
that value the speed drops by a factor of approximately 2.  Default value is
@code{3}.

@item qp
Force a constant quantization parameter. If not set, the filter will use the QP
from the video stream (if available).
@end table

@section vaguedenoiser

Apply a wavelet based denoiser.

It transforms each frame from the video input into the wavelet domain,
using Cohen-Daubechies-Feauveau 9/7. Then it applies some filtering to
the obtained coefficients. It does an inverse wavelet transform after.
Due to wavelet properties, it should give a nice smoothed result, and
reduced noise, without blurring picture features.

This filter accepts the following options:

@table @option
@item threshold
The filtering strength. The higher, the more filtered the video will be.
Hard thresholding can use a higher threshold than soft thresholding
before the video looks overfiltered. Default value is 2.

@item method
The filtering method the filter will use.

It accepts the following values:
@table @samp
@item hard
All values under the threshold will be zeroed.

@item soft
All values under the threshold will be zeroed. All values above will be
reduced by the threshold.

@item garrote
Scales or nullifies coefficients - intermediary between (more) soft and
(less) hard thresholding.
@end table

Default is garrote.

@item nsteps
Number of times, the wavelet will decompose the picture. Picture can't
be decomposed beyond a particular point (typically, 8 for a 640x480
frame - as 2^9 = 512 > 480). Valid values are integers between 1 and 32. Default value is 6.

@item percent
Partial of full denoising (limited coefficients shrinking), from 0 to 100. Default value is 85.

@item planes
A list of the planes to process. By default all planes are processed.
@end table

@section vectorscope

Display 2 color component values in the two dimensional graph (which is called
a vectorscope).

This filter accepts the following options:

@table @option
@item mode, m
Set vectorscope mode.

It accepts the following values:
@table @samp
@item gray
Gray values are displayed on graph, higher brightness means more pixels have
same component color value on location in graph. This is the default mode.

@item color
Gray values are displayed on graph. Surrounding pixels values which are not
present in video frame are drawn in gradient of 2 color components which are
set by option @code{x} and @code{y}. The 3rd color component is static.

@item color2
Actual color components values present in video frame are displayed on graph.

@item color3
Similar as color2 but higher frequency of same values @code{x} and @code{y}
on graph increases value of another color component, which is luminance by
default values of @code{x} and @code{y}.

@item color4
Actual colors present in video frame are displayed on graph. If two different
colors map to same position on graph then color with higher value of component
not present in graph is picked.

@item color5
Gray values are displayed on graph. Similar to @code{color} but with 3rd color
component picked from radial gradient.
@end table

@item x
Set which color component will be represented on X-axis. Default is @code{1}.

@item y
Set which color component will be represented on Y-axis. Default is @code{2}.

@item intensity, i
Set intensity, used by modes: gray, color, color3 and color5 for increasing brightness
of color component which represents frequency of (X, Y) location in graph.

@item envelope, e
@table @samp
@item none
No envelope, this is default.

@item instant
Instant envelope, even darkest single pixel will be clearly highlighted.

@item peak
Hold maximum and minimum values presented in graph over time. This way you
can still spot out of range values without constantly looking at vectorscope.

@item peak+instant
Peak and instant envelope combined together.
@end table

@item graticule, g
Set what kind of graticule to draw.
@table @samp
@item none
@item green
@item color
@end table

@item opacity, o
Set graticule opacity.

@item flags, f
Set graticule flags.

@table @samp
@item white
Draw graticule for white point.

@item black
Draw graticule for black point.

@item name
Draw color points short names.
@end table

@item bgopacity, b
Set background opacity.

@item lthreshold, l
Set low threshold for color component not represented on X or Y axis.
Values lower than this value will be ignored. Default is 0.
Note this value is multiplied with actual max possible value one pixel component
can have. So for 8-bit input and low threshold value of 0.1 actual threshold
is 0.1 * 255 = 25.

@item hthreshold, h
Set high threshold for color component not represented on X or Y axis.
Values higher than this value will be ignored. Default is 1.
Note this value is multiplied with actual max possible value one pixel component
can have. So for 8-bit input and high threshold value of 0.9 actual threshold
is 0.9 * 255 = 230.

@item colorspace, c
Set what kind of colorspace to use when drawing graticule.
@table @samp
@item auto
@item 601
@item 709
@end table
Default is auto.
@end table

@anchor{vidstabdetect}
@section vidstabdetect

Analyze video stabilization/deshaking. Perform pass 1 of 2, see
@ref{vidstabtransform} for pass 2.

This filter generates a file with relative translation and rotation
transform information about subsequent frames, which is then used by
the @ref{vidstabtransform} filter.

To enable compilation of this filter you need to configure FFmpeg with
@code{--enable-libvidstab}.

This filter accepts the following options:

@table @option
@item result
Set the path to the file used to write the transforms information.
Default value is @file{transforms.trf}.

@item shakiness
Set how shaky the video is and how quick the camera is. It accepts an
integer in the range 1-10, a value of 1 means little shakiness, a
value of 10 means strong shakiness. Default value is 5.

@item accuracy
Set the accuracy of the detection process. It must be a value in the
range 1-15. A value of 1 means low accuracy, a value of 15 means high
accuracy. Default value is 15.

@item stepsize
Set stepsize of the search process. The region around minimum is
scanned with 1 pixel resolution. Default value is 6.

@item mincontrast
Set minimum contrast. Below this value a local measurement field is
discarded. Must be a floating point value in the range 0-1. Default
value is 0.3.

@item tripod
Set reference frame number for tripod mode.

If enabled, the motion of the frames is compared to a reference frame
in the filtered stream, identified by the specified number. The idea
is to compensate all movements in a more-or-less static scene and keep
the camera view absolutely still.

If set to 0, it is disabled. The frames are counted starting from 1.

@item show
Show fields and transforms in the resulting frames. It accepts an
integer in the range 0-2. Default value is 0, which disables any
visualization.
@end table

@subsection Examples

@itemize
@item
Use default values:
@example
vidstabdetect
@end example

@item
Analyze strongly shaky movie and put the results in file
@file{mytransforms.trf}:
@example
vidstabdetect=shakiness=10:accuracy=15:result="mytransforms.trf"
@end example

@item
Visualize the result of internal transformations in the resulting
video:
@example
vidstabdetect=show=1
@end example

@item
Analyze a video with medium shakiness using @command{ffmpeg}:
@example
ffmpeg -i input -vf vidstabdetect=shakiness=5:show=1 dummy.avi
@end example
@end itemize

@anchor{vidstabtransform}
@section vidstabtransform

Video stabilization/deshaking: pass 2 of 2,
see @ref{vidstabdetect} for pass 1.

Read a file with transform information for each frame and
apply/compensate them. Together with the @ref{vidstabdetect}
filter this can be used to deshake videos. See also
@url{http://public.hronopik.de/vid.stab}. It is important to also use
the @ref{unsharp} filter, see below.

To enable compilation of this filter you need to configure FFmpeg with
@code{--enable-libvidstab}.

@subsection Options

@table @option
@item input
Set path to the file used to read the transforms. Default value is
@file{transforms.trf}.

@item smoothing
Set the number of frames (value*2 + 1) used for lowpass filtering the
camera movements. Default value is 10.

For example a number of 10 means that 21 frames are used (10 in the
past and 10 in the future) to smoothen the motion in the video. A
larger value leads to a smoother video, but limits the acceleration of
the camera (pan/tilt movements). 0 is a special case where a static
camera is simulated.

@item optalgo
Set the camera path optimization algorithm.

Accepted values are:
@table @samp
@item gauss
gaussian kernel low-pass filter on camera motion (default)
@item avg
averaging on transformations
@end table

@item maxshift
Set maximal number of pixels to translate frames. Default value is -1,
meaning no limit.

@item maxangle
Set maximal angle in radians (degree*PI/180) to rotate frames. Default
value is -1, meaning no limit.

@item crop
Specify how to deal with borders that may be visible due to movement
compensation.

Available values are:
@table @samp
@item keep
keep image information from previous frame (default)
@item black
fill the border black
@end table

@item invert
Invert transforms if set to 1. Default value is 0.

@item relative
Consider transforms as relative to previous frame if set to 1,
absolute if set to 0. Default value is 0.

@item zoom
Set percentage to zoom. A positive value will result in a zoom-in
effect, a negative value in a zoom-out effect. Default value is 0 (no
zoom).

@item optzoom
Set optimal zooming to avoid borders.

Accepted values are:
@table @samp
@item 0
disabled
@item 1
optimal static zoom value is determined (only very strong movements
will lead to visible borders) (default)
@item 2
optimal adaptive zoom value is determined (no borders will be
visible), see @option{zoomspeed}
@end table

Note that the value given at zoom is added to the one calculated here.

@item zoomspeed
Set percent to zoom maximally each frame (enabled when
@option{optzoom} is set to 2). Range is from 0 to 5, default value is
0.25.

@item interpol
Specify type of interpolation.

Available values are:
@table @samp
@item no
no interpolation
@item linear
linear only horizontal
@item bilinear
linear in both directions (default)
@item bicubic
cubic in both directions (slow)
@end table

@item tripod
Enable virtual tripod mode if set to 1, which is equivalent to
@code{relative=0:smoothing=0}. Default value is 0.

Use also @code{tripod} option of @ref{vidstabdetect}.

@item debug
Increase log verbosity if set to 1. Also the detected global motions
are written to the temporary file @file{global_motions.trf}. Default
value is 0.
@end table

@subsection Examples

@itemize
@item
Use @command{ffmpeg} for a typical stabilization with default values:
@example
ffmpeg -i inp.mpeg -vf vidstabtransform,unsharp=5:5:0.8:3:3:0.4 inp_stabilized.mpeg
@end example

Note the use of the @ref{unsharp} filter which is always recommended.

@item
Zoom in a bit more and load transform data from a given file:
@example
vidstabtransform=zoom=5:input="mytransforms.trf"
@end example

@item
Smoothen the video even more:
@example
vidstabtransform=smoothing=30
@end example
@end itemize

@section vflip

Flip the input video vertically.

For example, to vertically flip a video with @command{ffmpeg}:
@example
ffmpeg -i in.avi -vf "vflip" out.avi
@end example

@section vfrdet

Detect variable frame rate video.

This filter tries to detect if the input is variable or constant frame rate.

At end it will output number of frames detected as having variable delta pts,
and ones with constant delta pts.
If there was frames with variable delta, than it will also show min and max delta
encountered.

@anchor{vignette}
@section vignette

Make or reverse a natural vignetting effect.

The filter accepts the following options:

@table @option
@item angle, a
Set lens angle expression as a number of radians.

The value is clipped in the @code{[0,PI/2]} range.

Default value: @code{"PI/5"}

@item x0
@item y0
Set center coordinates expressions. Respectively @code{"w/2"} and @code{"h/2"}
by default.

@item mode
Set forward/backward mode.

Available modes are:
@table @samp
@item forward
The larger the distance from the central point, the darker the image becomes.

@item backward
The larger the distance from the central point, the brighter the image becomes.
This can be used to reverse a vignette effect, though there is no automatic
detection to extract the lens @option{angle} and other settings (yet). It can
also be used to create a burning effect.
@end table

Default value is @samp{forward}.

@item eval
Set evaluation mode for the expressions (@option{angle}, @option{x0}, @option{y0}).

It accepts the following values:
@table @samp
@item init
Evaluate expressions only once during the filter initialization.

@item frame
Evaluate expressions for each incoming frame. This is way slower than the
@samp{init} mode since it requires all the scalers to be re-computed, but it
allows advanced dynamic expressions.
@end table

Default value is @samp{init}.

@item dither
Set dithering to reduce the circular banding effects. Default is @code{1}
(enabled).

@item aspect
Set vignette aspect. This setting allows one to adjust the shape of the vignette.
Setting this value to the SAR of the input will make a rectangular vignetting
following the dimensions of the video.

Default is @code{1/1}.
@end table

@subsection Expressions

The @option{alpha}, @option{x0} and @option{y0} expressions can contain the
following parameters.

@table @option
@item w
@item h
input width and height

@item n
the number of input frame, starting from 0

@item pts
the PTS (Presentation TimeStamp) time of the filtered video frame, expressed in
@var{TB} units, NAN if undefined

@item r
frame rate of the input video, NAN if the input frame rate is unknown

@item t
the PTS (Presentation TimeStamp) of the filtered video frame,
expressed in seconds, NAN if undefined

@item tb
time base of the input video
@end table


@subsection Examples

@itemize
@item
Apply simple strong vignetting effect:
@example
vignette=PI/4
@end example

@item
Make a flickering vignetting:
@example
vignette='PI/4+random(1)*PI/50':eval=frame
@end example

@end itemize

@section vmafmotion

Obtain the average vmaf motion score of a video.
It is one of the component filters of VMAF.

The obtained average motion score is printed through the logging system.

In the below example the input file @file{ref.mpg} is being processed and score
is computed.

@example
ffmpeg -i ref.mpg -lavfi vmafmotion -f null -
@end example

@section vstack
Stack input videos vertically.

All streams must be of same pixel format and of same width.

Note that this filter is faster than using @ref{overlay} and @ref{pad} filter
to create same output.

The filter accept the following option:

@table @option
@item inputs
Set number of input streams. Default is 2.

@item shortest
If set to 1, force the output to terminate when the shortest input
terminates. Default value is 0.
@end table

@section w3fdif

Deinterlace the input video ("w3fdif" stands for "Weston 3 Field
Deinterlacing Filter").

Based on the process described by Martin Weston for BBC R&D, and
implemented based on the de-interlace algorithm written by Jim
Easterbrook for BBC R&D, the Weston 3 field deinterlacing filter
uses filter coefficients calculated by BBC R&D.

There are two sets of filter coefficients, so called "simple":
and "complex". Which set of filter coefficients is used can
be set by passing an optional parameter:

@table @option
@item filter
Set the interlacing filter coefficients. Accepts one of the following values:

@table @samp
@item simple
Simple filter coefficient set.
@item complex
More-complex filter coefficient set.
@end table
Default value is @samp{complex}.

@item deint
Specify which frames to deinterlace. Accept one of the following values:

@table @samp
@item all
Deinterlace all frames,
@item interlaced
Only deinterlace frames marked as interlaced.
@end table

Default value is @samp{all}.
@end table

@section waveform
Video waveform monitor.

The waveform monitor plots color component intensity. By default luminance
only. Each column of the waveform corresponds to a column of pixels in the
source video.

It accepts the following options:

@table @option
@item mode, m
Can be either @code{row}, or @code{column}. Default is @code{column}.
In row mode, the graph on the left side represents color component value 0 and
the right side represents value = 255. In column mode, the top side represents
color component value = 0 and bottom side represents value = 255.

@item intensity, i
Set intensity. Smaller values are useful to find out how many values of the same
luminance are distributed across input rows/columns.
Default value is @code{0.04}. Allowed range is [0, 1].

@item mirror, r
Set mirroring mode. @code{0} means unmirrored, @code{1} means mirrored.
In mirrored mode, higher values will be represented on the left
side for @code{row} mode and at the top for @code{column} mode. Default is
@code{1} (mirrored).

@item display, d
Set display mode.
It accepts the following values:
@table @samp
@item overlay
Presents information identical to that in the @code{parade}, except
that the graphs representing color components are superimposed directly
over one another.

This display mode makes it easier to spot relative differences or similarities
in overlapping areas of the color components that are supposed to be identical,
such as neutral whites, grays, or blacks.

@item stack
Display separate graph for the color components side by side in
@code{row} mode or one below the other in @code{column} mode.

@item parade
Display separate graph for the color components side by side in
@code{column} mode or one below the other in @code{row} mode.

Using this display mode makes it easy to spot color casts in the highlights
and shadows of an image, by comparing the contours of the top and the bottom
graphs of each waveform. Since whites, grays, and blacks are characterized
by exactly equal amounts of red, green, and blue, neutral areas of the picture
should display three waveforms of roughly equal width/height. If not, the
correction is easy to perform by making level adjustments the three waveforms.
@end table
Default is @code{stack}.

@item components, c
Set which color components to display. Default is 1, which means only luminance
or red color component if input is in RGB colorspace. If is set for example to
7 it will display all 3 (if) available color components.

@item envelope, e
@table @samp
@item none
No envelope, this is default.

@item instant
Instant envelope, minimum and maximum values presented in graph will be easily
visible even with small @code{step} value.

@item peak
Hold minimum and maximum values presented in graph across time. This way you
can still spot out of range values without constantly looking at waveforms.

@item peak+instant
Peak and instant envelope combined together.
@end table

@item filter, f
@table @samp
@item lowpass
No filtering, this is default.

@item flat
Luma and chroma combined together.

@item aflat
Similar as above, but shows difference between blue and red chroma.

@item xflat
Similar as above, but use different colors.

@item chroma
Displays only chroma.

@item color
Displays actual color value on waveform.

@item acolor
Similar as above, but with luma showing frequency of chroma values.
@end table

@item graticule, g
Set which graticule to display.

@table @samp
@item none
Do not display graticule.

@item green
Display green graticule showing legal broadcast ranges.

@item orange
Display orange graticule showing legal broadcast ranges.
@end table

@item opacity, o
Set graticule opacity.

@item flags, fl
Set graticule flags.

@table @samp
@item numbers
Draw numbers above lines. By default enabled.

@item dots
Draw dots instead of lines.
@end table

@item scale, s
Set scale used for displaying graticule.

@table @samp
@item digital
@item millivolts
@item ire
@end table
Default is digital.

@item bgopacity, b
Set background opacity.
@end table

@section weave, doubleweave

The @code{weave} takes a field-based video input and join
each two sequential fields into single frame, producing a new double
height clip with half the frame rate and half the frame count.

The @code{doubleweave} works same as @code{weave} but without
halving frame rate and frame count.

It accepts the following option:

@table @option
@item first_field
Set first field. Available values are:

@table @samp
@item top, t
Set the frame as top-field-first.

@item bottom, b
Set the frame as bottom-field-first.
@end table
@end table

@subsection Examples

@itemize
@item
Interlace video using @ref{select} and @ref{separatefields} filter:
@example
separatefields,select=eq(mod(n,4),0)+eq(mod(n,4),3),weave
@end example
@end itemize

@section xbr
Apply the xBR high-quality magnification filter which is designed for pixel
art. It follows a set of edge-detection rules, see
@url{http://www.libretro.com/forums/viewtopic.php?f=6&t=134}.

It accepts the following option:

@table @option
@item n
Set the scaling dimension: @code{2} for @code{2xBR}, @code{3} for
@code{3xBR} and @code{4} for @code{4xBR}.
Default is @code{3}.
@end table

@anchor{yadif}
@section yadif

Deinterlace the input video ("yadif" means "yet another deinterlacing
filter").

It accepts the following parameters:


@table @option

@item mode
The interlacing mode to adopt. It accepts one of the following values:

@table @option
@item 0, send_frame
Output one frame for each frame.
@item 1, send_field
Output one frame for each field.
@item 2, send_frame_nospatial
Like @code{send_frame}, but it skips the spatial interlacing check.
@item 3, send_field_nospatial
Like @code{send_field}, but it skips the spatial interlacing check.
@end table

The default value is @code{send_frame}.

@item parity
The picture field parity assumed for the input interlaced video. It accepts one
of the following values:

@table @option
@item 0, tff
Assume the top field is first.
@item 1, bff
Assume the bottom field is first.
@item -1, auto
Enable automatic detection of field parity.
@end table

The default value is @code{auto}.
If the interlacing is unknown or the decoder does not export this information,
top field first will be assumed.

@item deint
Specify which frames to deinterlace. Accept one of the following
values:

@table @option
@item 0, all
Deinterlace all frames.
@item 1, interlaced
Only deinterlace frames marked as interlaced.
@end table

The default value is @code{all}.
@end table

@section zoompan

Apply Zoom & Pan effect.

This filter accepts the following options:

@table @option
@item zoom, z
Set the zoom expression. Default is 1.

@item x
@item y
Set the x and y expression. Default is 0.

@item d
Set the duration expression in number of frames.
This sets for how many number of frames effect will last for
single input image.

@item s
Set the output image size, default is 'hd720'.

@item fps
Set the output frame rate, default is '25'.
@end table

Each expression can contain the following constants:

@table @option
@item in_w, iw
Input width.

@item in_h, ih
Input height.

@item out_w, ow
Output width.

@item out_h, oh
Output height.

@item in
Input frame count.

@item on
Output frame count.

@item x
@item y
Last calculated 'x' and 'y' position from 'x' and 'y' expression
for current input frame.

@item px
@item py
'x' and 'y' of last output frame of previous input frame or 0 when there was
not yet such frame (first input frame).

@item zoom
Last calculated zoom from 'z' expression for current input frame.

@item pzoom
Last calculated zoom of last output frame of previous input frame.

@item duration
Number of output frames for current input frame. Calculated from 'd' expression
for each input frame.

@item pduration
number of output frames created for previous input frame

@item a
Rational number: input width / input height

@item sar
sample aspect ratio

@item dar
display aspect ratio

@end table

@subsection Examples

@itemize
@item
Zoom-in up to 1.5 and pan at same time to some spot near center of picture:
@example
zoompan=z='min(zoom+0.0015,1.5)':d=700:x='if(gte(zoom,1.5),x,x+1/a)':y='if(gte(zoom,1.5),y,y+1)':s=640x360
@end example

@item
Zoom-in up to 1.5 and pan always at center of picture:
@example
zoompan=z='min(zoom+0.0015,1.5)':d=700:x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)'
@end example

@item
Same as above but without pausing:
@example
zoompan=z='min(max(zoom,pzoom)+0.0015,1.5)':d=1:x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)'
@end example
@end itemize

@anchor{zscale}
@section zscale
Scale (resize) the input video, using the z.lib library:
https://github.com/sekrit-twc/zimg.

The zscale filter forces the output display aspect ratio to be the same
as the input, by changing the output sample aspect ratio.

If the input image format is different from the format requested by
the next filter, the zscale filter will convert the input to the
requested format.

@subsection Options
The filter accepts the following options.

@table @option
@item width, w
@item height, h
Set the output video dimension expression. Default value is the input
dimension.

If the @var{width} or @var{w} value is 0, the input width is used for
the output. If the @var{height} or @var{h} value is 0, the input height
is used for the output.

If one and only one of the values is -n with n >= 1, the zscale filter
will use a value that maintains the aspect ratio of the input image,
calculated from the other specified dimension. After that it will,
however, make sure that the calculated dimension is divisible by n and
adjust the value if necessary.

If both values are -n with n >= 1, the behavior will be identical to
both values being set to 0 as previously detailed.

See below for the list of accepted constants for use in the dimension
expression.

@item size, s
Set the video size. For the syntax of this option, check the
@ref{video size syntax,,"Video size" section in the ffmpeg-utils manual,ffmpeg-utils}.

@item dither, d
Set the dither type.

Possible values are:
@table @var
@item none
@item ordered
@item random
@item error_diffusion
@end table

Default is none.

@item filter, f
Set the resize filter type.

Possible values are:
@table @var
@item point
@item bilinear
@item bicubic
@item spline16
@item spline36
@item lanczos
@end table

Default is bilinear.

@item range, r
Set the color range.

Possible values are:
@table @var
@item input
@item limited
@item full
@end table

Default is same as input.

@item primaries, p
Set the color primaries.

Possible values are:
@table @var
@item input
@item 709
@item unspecified
@item 170m
@item 240m
@item 2020
@end table

Default is same as input.

@item transfer, t
Set the transfer characteristics.

Possible values are:
@table @var
@item input
@item 709
@item unspecified
@item 601
@item linear
@item 2020_10
@item 2020_12
@item smpte2084
@item iec61966-2-1
@item arib-std-b67
@end table

Default is same as input.

@item matrix, m
Set the colorspace matrix.

Possible value are:
@table @var
@item input
@item 709
@item unspecified
@item 470bg
@item 170m
@item 2020_ncl
@item 2020_cl
@end table

Default is same as input.

@item rangein, rin
Set the input color range.

Possible values are:
@table @var
@item input
@item limited
@item full
@end table

Default is same as input.

@item primariesin, pin
Set the input color primaries.

Possible values are:
@table @var
@item input
@item 709
@item unspecified
@item 170m
@item 240m
@item 2020
@end table

Default is same as input.

@item transferin, tin
Set the input transfer characteristics.

Possible values are:
@table @var
@item input
@item 709
@item unspecified
@item 601
@item linear
@item 2020_10
@item 2020_12
@end table

Default is same as input.

@item matrixin, min
Set the input colorspace matrix.

Possible value are:
@table @var
@item input
@item 709
@item unspecified
@item 470bg
@item 170m
@item 2020_ncl
@item 2020_cl
@end table

@item chromal, c
Set the output chroma location.

Possible values are:
@table @var
@item input
@item left
@item center
@item topleft
@item top
@item bottomleft
@item bottom
@end table

@item chromalin, cin
Set the input chroma location.

Possible values are:
@table @var
@item input
@item left
@item center
@item topleft
@item top
@item bottomleft
@item bottom
@end table

@item npl
Set the nominal peak luminance.
@end table

The values of the @option{w} and @option{h} options are expressions
containing the following constants:

@table @var
@item in_w
@item in_h
The input width and height

@item iw
@item ih
These are the same as @var{in_w} and @var{in_h}.

@item out_w
@item out_h
The output (scaled) width and height

@item ow
@item oh
These are the same as @var{out_w} and @var{out_h}

@item a
The same as @var{iw} / @var{ih}

@item sar
input sample aspect ratio

@item dar
The input display aspect ratio. Calculated from @code{(iw / ih) * sar}.

@item hsub
@item vsub
horizontal and vertical input chroma subsample values. For example for the
pixel format "yuv422p" @var{hsub} is 2 and @var{vsub} is 1.

@item ohsub
@item ovsub
horizontal and vertical output chroma subsample values. For example for the
pixel format "yuv422p" @var{hsub} is 2 and @var{vsub} is 1.
@end table

@table @option
@end table

@c man end VIDEO FILTERS

@chapter Video Sources
@c man begin VIDEO SOURCES

Below is a description of the currently available video sources.

@section buffer

Buffer video frames, and make them available to the filter chain.

This source is mainly intended for a programmatic use, in particular
through the interface defined in @file{libavfilter/vsrc_buffer.h}.

It accepts the following parameters:

@table @option

@item video_size
Specify the size (width and height) of the buffered video frames. For the
syntax of this option, check the
@ref{video size syntax,,"Video size" section in the ffmpeg-utils manual,ffmpeg-utils}.

@item width
The input video width.

@item height
The input video height.

@item pix_fmt
A string representing the pixel format of the buffered video frames.
It may be a number corresponding to a pixel format, or a pixel format
name.

@item time_base
Specify the timebase assumed by the timestamps of the buffered frames.

@item frame_rate
Specify the frame rate expected for the video stream.

@item pixel_aspect, sar
The sample (pixel) aspect ratio of the input video.

@item sws_param
Specify the optional parameters to be used for the scale filter which
is automatically inserted when an input change is detected in the
input size or format.

@item hw_frames_ctx
When using a hardware pixel format, this should be a reference to an
AVHWFramesContext describing input frames.
@end table

For example:
@example
buffer=width=320:height=240:pix_fmt=yuv410p:time_base=1/24:sar=1
@end example

will instruct the source to accept video frames with size 320x240 and
with format "yuv410p", assuming 1/24 as the timestamps timebase and
square pixels (1:1 sample aspect ratio).
Since the pixel format with name "yuv410p" corresponds to the number 6
(check the enum AVPixelFormat definition in @file{libavutil/pixfmt.h}),
this example corresponds to:
@example
buffer=size=320x240:pixfmt=6:time_base=1/24:pixel_aspect=1/1
@end example

Alternatively, the options can be specified as a flat string, but this
syntax is deprecated:

@var{width}:@var{height}:@var{pix_fmt}:@var{time_base.num}:@var{time_base.den}:@var{pixel_aspect.num}:@var{pixel_aspect.den}[:@var{sws_param}]

@section cellauto

Create a pattern generated by an elementary cellular automaton.

The initial state of the cellular automaton can be defined through the
@option{filename} and @option{pattern} options. If such options are
not specified an initial state is created randomly.

At each new frame a new row in the video is filled with the result of
the cellular automaton next generation. The behavior when the whole
frame is filled is defined by the @option{scroll} option.

This source accepts the following options:

@table @option
@item filename, f
Read the initial cellular automaton state, i.e. the starting row, from
the specified file.
In the file, each non-whitespace character is considered an alive
cell, a newline will terminate the row, and further characters in the
file will be ignored.

@item pattern, p
Read the initial cellular automaton state, i.e. the starting row, from
the specified string.

Each non-whitespace character in the string is considered an alive
cell, a newline will terminate the row, and further characters in the
string will be ignored.

@item rate, r
Set the video rate, that is the number of frames generated per second.
Default is 25.

@item random_fill_ratio, ratio
Set the random fill ratio for the initial cellular automaton row. It
is a floating point number value ranging from 0 to 1, defaults to
1/PHI.

This option is ignored when a file or a pattern is specified.

@item random_seed, seed
Set the seed for filling randomly the initial row, must be an integer
included between 0 and UINT32_MAX. If not specified, or if explicitly
set to -1, the filter will try to use a good random seed on a best
effort basis.

@item rule
Set the cellular automaton rule, it is a number ranging from 0 to 255.
Default value is 110.

@item size, s
Set the size of the output video. For the syntax of this option, check the
@ref{video size syntax,,"Video size" section in the ffmpeg-utils manual,ffmpeg-utils}.

If @option{filename} or @option{pattern} is specified, the size is set
by default to the width of the specified initial state row, and the
height is set to @var{width} * PHI.

If @option{size} is set, it must contain the width of the specified
pattern string, and the specified pattern will be centered in the
larger row.

If a filename or a pattern string is not specified, the size value
defaults to "320x518" (used for a randomly generated initial state).

@item scroll
If set to 1, scroll the output upward when all the rows in the output
have been already filled. If set to 0, the new generated row will be
written over the top row just after the bottom row is filled.
Defaults to 1.

@item start_full, full
If set to 1, completely fill the output with generated rows before
outputting the first frame.
This is the default behavior, for disabling set the value to 0.

@item stitch
If set to 1, stitch the left and right row edges together.
This is the default behavior, for disabling set the value to 0.
@end table

@subsection Examples

@itemize
@item
Read the initial state from @file{pattern}, and specify an output of
size 200x400.
@example
cellauto=f=pattern:s=200x400
@end example

@item
Generate a random initial row with a width of 200 cells, with a fill
ratio of 2/3:
@example
cellauto=ratio=2/3:s=200x200
@end example

@item
Create a pattern generated by rule 18 starting by a single alive cell
centered on an initial row with width 100:
@example
cellauto=p=@@:s=100x400:full=0:rule=18
@end example

@item
Specify a more elaborated initial pattern:
@example
cellauto=p='@@@@ @@ @@@@':s=100x400:full=0:rule=18
@end example

@end itemize

@anchor{coreimagesrc}
@section coreimagesrc
Video source generated on GPU using Apple's CoreImage API on OSX.

This video source is a specialized version of the @ref{coreimage} video filter.
Use a core image generator at the beginning of the applied filterchain to
generate the content.

The coreimagesrc video source accepts the following options:
@table @option
@item list_generators
List all available generators along with all their respective options as well as
possible minimum and maximum values along with the default values.
@example
list_generators=true
@end example

@item size, s
Specify the size of the sourced video. For the syntax of this option, check the
@ref{video size syntax,,"Video size" section in the ffmpeg-utils manual,ffmpeg-utils}.
The default value is @code{320x240}.

@item rate, r
Specify the frame rate of the sourced video, as the number of frames
generated per second. It has to be a string in the format
@var{frame_rate_num}/@var{frame_rate_den}, an integer number, a floating point
number or a valid video frame rate abbreviation. The default value is
"25".

@item sar
Set the sample aspect ratio of the sourced video.

@item duration, d
Set the duration of the sourced video. See
@ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils}
for the accepted syntax.

If not specified, or the expressed duration is negative, the video is
supposed to be generated forever.
@end table

Additionally, all options of the @ref{coreimage} video filter are accepted.
A complete filterchain can be used for further processing of the
generated input without CPU-HOST transfer. See @ref{coreimage} documentation
and examples for details.

@subsection Examples

@itemize

@item
Use CIQRCodeGenerator to create a QR code for the FFmpeg homepage,
given as complete and escaped command-line for Apple's standard bash shell:
@example
ffmpeg -f lavfi -i coreimagesrc=s=100x100:filter=CIQRCodeGenerator@@inputMessage=https\\\\\://FFmpeg.org/@@inputCorrectionLevel=H -frames:v 1 QRCode.png
@end example
This example is equivalent to the QRCode example of @ref{coreimage} without the
need for a nullsrc video source.
@end itemize


@section mandelbrot

Generate a Mandelbrot set fractal, and progressively zoom towards the
point specified with @var{start_x} and @var{start_y}.

This source accepts the following options:

@table @option

@item end_pts
Set the terminal pts value. Default value is 400.

@item end_scale
Set the terminal scale value.
Must be a floating point value. Default value is 0.3.

@item inner
Set the inner coloring mode, that is the algorithm used to draw the
Mandelbrot fractal internal region.

It shall assume one of the following values:
@table @option
@item black
Set black mode.
@item convergence
Show time until convergence.
@item mincol
Set color based on point closest to the origin of the iterations.
@item period
Set period mode.
@end table

Default value is @var{mincol}.

@item bailout
Set the bailout value. Default value is 10.0.

@item maxiter
Set the maximum of iterations performed by the rendering
algorithm. Default value is 7189.

@item outer
Set outer coloring mode.
It shall assume one of following values:
@table @option
@item iteration_count
Set iteration cound mode.
@item normalized_iteration_count
set normalized iteration count mode.
@end table
Default value is @var{normalized_iteration_count}.

@item rate, r
Set frame rate, expressed as number of frames per second. Default
value is "25".

@item size, s
Set frame size. For the syntax of this option, check the @ref{video size syntax,,"Video
size" section in the ffmpeg-utils manual,ffmpeg-utils}. Default value is "640x480".

@item start_scale
Set the initial scale value. Default value is 3.0.

@item start_x
Set the initial x position. Must be a floating point value between
-100 and 100. Default value is -0.743643887037158704752191506114774.

@item start_y
Set the initial y position. Must be a floating point value between
-100 and 100. Default value is -0.131825904205311970493132056385139.
@end table

@section mptestsrc

Generate various test patterns, as generated by the MPlayer test filter.

The size of the generated video is fixed, and is 256x256.
This source is useful in particular for testing encoding features.

This source accepts the following options:

@table @option

@item rate, r
Specify the frame rate of the sourced video, as the number of frames
generated per second. It has to be a string in the format
@var{frame_rate_num}/@var{frame_rate_den}, an integer number, a floating point
number or a valid video frame rate abbreviation. The default value is
"25".

@item duration, d
Set the duration of the sourced video. See
@ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils}
for the accepted syntax.

If not specified, or the expressed duration is negative, the video is
supposed to be generated forever.

@item test, t

Set the number or the name of the test to perform. Supported tests are:
@table @option
@item dc_luma
@item dc_chroma
@item freq_luma
@item freq_chroma
@item amp_luma
@item amp_chroma
@item cbp
@item mv
@item ring1
@item ring2
@item all

@end table

Default value is "all", which will cycle through the list of all tests.
@end table

Some examples:
@example
mptestsrc=t=dc_luma
@end example

will generate a "dc_luma" test pattern.

@section frei0r_src

Provide a frei0r source.

To enable compilation of this filter you need to install the frei0r
header and configure FFmpeg with @code{--enable-frei0r}.

This source accepts the following parameters:

@table @option

@item size
The size of the video to generate. For the syntax of this option, check the
@ref{video size syntax,,"Video size" section in the ffmpeg-utils manual,ffmpeg-utils}.

@item framerate
The framerate of the generated video. It may be a string of the form
@var{num}/@var{den} or a frame rate abbreviation.

@item filter_name
The name to the frei0r source to load. For more information regarding frei0r and
how to set the parameters, read the @ref{frei0r} section in the video filters
documentation.

@item filter_params
A '|'-separated list of parameters to pass to the frei0r source.

@end table

For example, to generate a frei0r partik0l source with size 200x200
and frame rate 10 which is overlaid on the overlay filter main input:
@example
frei0r_src=size=200x200:framerate=10:filter_name=partik0l:filter_params=1234 [overlay]; [in][overlay] overlay
@end example

@section life

Generate a life pattern.

This source is based on a generalization of John Conway's life game.

The sourced input represents a life grid, each pixel represents a cell
which can be in one of two possible states, alive or dead. Every cell
interacts with its eight neighbours, which are the cells that are
horizontally, vertically, or diagonally adjacent.

At each interaction the grid evolves according to the adopted rule,
which specifies the number of neighbor alive cells which will make a
cell stay alive or born. The @option{rule} option allows one to specify
the rule to adopt.

This source accepts the following options:

@table @option
@item filename, f
Set the file from which to read the initial grid state. In the file,
each non-whitespace character is considered an alive cell, and newline
is used to delimit the end of each row.

If this option is not specified, the initial grid is generated
randomly.

@item rate, r
Set the video rate, that is the number of frames generated per second.
Default is 25.

@item random_fill_ratio, ratio
Set the random fill ratio for the initial random grid. It is a
floating point number value ranging from 0 to 1, defaults to 1/PHI.
It is ignored when a file is specified.

@item random_seed, seed
Set the seed for filling the initial random grid, must be an integer
included between 0 and UINT32_MAX. If not specified, or if explicitly
set to -1, the filter will try to use a good random seed on a best
effort basis.

@item rule
Set the life rule.

A rule can be specified with a code of the kind "S@var{NS}/B@var{NB}",
where @var{NS} and @var{NB} are sequences of numbers in the range 0-8,
@var{NS} specifies the number of alive neighbor cells which make a
live cell stay alive, and @var{NB} the number of alive neighbor cells
which make a dead cell to become alive (i.e. to "born").
"s" and "b" can be used in place of "S" and "B", respectively.

Alternatively a rule can be specified by an 18-bits integer. The 9
high order bits are used to encode the next cell state if it is alive
for each number of neighbor alive cells, the low order bits specify
the rule for "borning" new cells. Higher order bits encode for an
higher number of neighbor cells.
For example the number 6153 = @code{(12<<9)+9} specifies a stay alive
rule of 12 and a born rule of 9, which corresponds to "S23/B03".

Default value is "S23/B3", which is the original Conway's game of life
rule, and will keep a cell alive if it has 2 or 3 neighbor alive
cells, and will born a new cell if there are three alive cells around
a dead cell.

@item size, s
Set the size of the output video. For the syntax of this option, check the
@ref{video size syntax,,"Video size" section in the ffmpeg-utils manual,ffmpeg-utils}.

If @option{filename} is specified, the size is set by default to the
same size of the input file. If @option{size} is set, it must contain
the size specified in the input file, and the initial grid defined in
that file is centered in the larger resulting area.

If a filename is not specified, the size value defaults to "320x240"
(used for a randomly generated initial grid).

@item stitch
If set to 1, stitch the left and right grid edges together, and the
top and bottom edges also. Defaults to 1.

@item mold
Set cell mold speed. If set, a dead cell will go from @option{death_color} to
@option{mold_color} with a step of @option{mold}. @option{mold} can have a
value from 0 to 255.

@item life_color
Set the color of living (or new born) cells.

@item death_color
Set the color of dead cells. If @option{mold} is set, this is the first color
used to represent a dead cell.

@item mold_color
Set mold color, for definitely dead and moldy cells.

For the syntax of these 3 color options, check the @ref{color syntax,,"Color" section in the
ffmpeg-utils manual,ffmpeg-utils}.
@end table

@subsection Examples

@itemize
@item
Read a grid from @file{pattern}, and center it on a grid of size
300x300 pixels:
@example
life=f=pattern:s=300x300
@end example

@item
Generate a random grid of size 200x200, with a fill ratio of 2/3:
@example
life=ratio=2/3:s=200x200
@end example

@item
Specify a custom rule for evolving a randomly generated grid:
@example
life=rule=S14/B34
@end example

@item
Full example with slow death effect (mold) using @command{ffplay}:
@example
ffplay -f lavfi life=s=300x200:mold=10:r=60:ratio=0.1:death_color=#C83232:life_color=#00ff00,scale=1200:800:flags=16
@end example
@end itemize

@anchor{allrgb}
@anchor{allyuv}
@anchor{color}
@anchor{haldclutsrc}
@anchor{nullsrc}
@anchor{rgbtestsrc}
@anchor{smptebars}
@anchor{smptehdbars}
@anchor{testsrc}
@anchor{testsrc2}
@anchor{yuvtestsrc}
@section allrgb, allyuv, color, haldclutsrc, nullsrc, rgbtestsrc, smptebars, smptehdbars, testsrc, testsrc2, yuvtestsrc

The @code{allrgb} source returns frames of size 4096x4096 of all rgb colors.

The @code{allyuv} source returns frames of size 4096x4096 of all yuv colors.

The @code{color} source provides an uniformly colored input.

The @code{haldclutsrc} source provides an identity Hald CLUT. See also
@ref{haldclut} filter.

The @code{nullsrc} source returns unprocessed video frames. It is
mainly useful to be employed in analysis / debugging tools, or as the
source for filters which ignore the input data.

The @code{rgbtestsrc} source generates an RGB test pattern useful for
detecting RGB vs BGR issues. You should see a red, green and blue
stripe from top to bottom.

The @code{smptebars} source generates a color bars pattern, based on
the SMPTE Engineering Guideline EG 1-1990.

The @code{smptehdbars} source generates a color bars pattern, based on
the SMPTE RP 219-2002.

The @code{testsrc} source generates a test video pattern, showing a
color pattern, a scrolling gradient and a timestamp. This is mainly
intended for testing purposes.

The @code{testsrc2} source is similar to testsrc, but supports more
pixel formats instead of just @code{rgb24}. This allows using it as an
input for other tests without requiring a format conversion.

The @code{yuvtestsrc} source generates an YUV test pattern. You should
see a y, cb and cr stripe from top to bottom.

The sources accept the following parameters:

@table @option

@item level
Specify the level of the Hald CLUT, only available in the @code{haldclutsrc}
source. A level of @code{N} generates a picture of @code{N*N*N} by @code{N*N*N}
pixels to be used as identity matrix for 3D lookup tables. Each component is
coded on a @code{1/(N*N)} scale.

@item color, c
Specify the color of the source, only available in the @code{color}
source. For the syntax of this option, check the
@ref{color syntax,,"Color" section in the ffmpeg-utils manual,ffmpeg-utils}.

@item size, s
Specify the size of the sourced video. For the syntax of this option, check the
@ref{video size syntax,,"Video size" section in the ffmpeg-utils manual,ffmpeg-utils}.
The default value is @code{320x240}.

This option is not available with the @code{allrgb}, @code{allyuv}, and
@code{haldclutsrc} filters.

@item rate, r
Specify the frame rate of the sourced video, as the number of frames
generated per second. It has to be a string in the format
@var{frame_rate_num}/@var{frame_rate_den}, an integer number, a floating point
number or a valid video frame rate abbreviation. The default value is
"25".

@item duration, d
Set the duration of the sourced video. See
@ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils}
for the accepted syntax.

If not specified, or the expressed duration is negative, the video is
supposed to be generated forever.

@item sar
Set the sample aspect ratio of the sourced video.

@item alpha
Specify the alpha (opacity) of the background, only available in the
@code{testsrc2} source. The value must be between 0 (fully transparent) and
255 (fully opaque, the default).

@item decimals, n
Set the number of decimals to show in the timestamp, only available in the
@code{testsrc} source.

The displayed timestamp value will correspond to the original
timestamp value multiplied by the power of 10 of the specified
value. Default value is 0.
@end table

@subsection Examples

@itemize
@item
Generate a video with a duration of 5.3 seconds, with size
176x144 and a frame rate of 10 frames per second:
@example
testsrc=duration=5.3:size=qcif:rate=10
@end example

@item
The following graph description will generate a red source
with an opacity of 0.2, with size "qcif" and a frame rate of 10
frames per second:
@example
color=c=red@@0.2:s=qcif:r=10
@end example

@item
If the input content is to be ignored, @code{nullsrc} can be used. The
following command generates noise in the luminance plane by employing
the @code{geq} filter:
@example
nullsrc=s=256x256, geq=random(1)*255:128:128
@end example
@end itemize

@subsection Commands

The @code{color} source supports the following commands:

@table @option
@item c, color
Set the color of the created image. Accepts the same syntax of the
corresponding @option{color} option.
@end table

@section openclsrc

Generate video using an OpenCL program.

@table @option

@item source
OpenCL program source file.

@item kernel
Kernel name in program.

@item size, s
Size of frames to generate.  This must be set.

@item format
Pixel format to use for the generated frames.  This must be set.

@item rate, r
Number of frames generated every second.  Default value is '25'.

@end table

For details of how the program loading works, see the @ref{program_opencl}
filter.

Example programs:

@itemize
@item
Generate a colour ramp by setting pixel values from the position of the pixel
in the output image.  (Note that this will work with all pixel formats, but
the generated output will not be the same.)
@verbatim
__kernel void ramp(__write_only image2d_t dst,
                   unsigned int index)
{
    int2 loc = (int2)(get_global_id(0), get_global_id(1));

    float4 val;
    val.xy = val.zw = convert_float2(loc) / convert_float2(get_image_dim(dst));

    write_imagef(dst, loc, val);
}
@end verbatim

@item
Generate a Sierpinski carpet pattern, panning by a single pixel each frame.
@verbatim
__kernel void sierpinski_carpet(__write_only image2d_t dst,
                                unsigned int index)
{
    int2 loc = (int2)(get_global_id(0), get_global_id(1));

    float4 value = 0.0f;
    int x = loc.x + index;
    int y = loc.y + index;
    while (x > 0 || y > 0) {
        if (x % 3 == 1 && y % 3 == 1) {
            value = 1.0f;
            break;
        }
        x /= 3;
        y /= 3;
    }

    write_imagef(dst, loc, value);
}
@end verbatim

@end itemize

@c man end VIDEO SOURCES

@chapter Video Sinks
@c man begin VIDEO SINKS

Below is a description of the currently available video sinks.

@section buffersink

Buffer video frames, and make them available to the end of the filter
graph.

This sink is mainly intended for programmatic use, in particular
through the interface defined in @file{libavfilter/buffersink.h}
or the options system.

It accepts a pointer to an AVBufferSinkContext structure, which
defines the incoming buffers' formats, to be passed as the opaque
parameter to @code{avfilter_init_filter} for initialization.

@section nullsink

Null video sink: do absolutely nothing with the input video. It is
mainly useful as a template and for use in analysis / debugging
tools.

@c man end VIDEO SINKS

@chapter Multimedia Filters
@c man begin MULTIMEDIA FILTERS

Below is a description of the currently available multimedia filters.

@section abitscope

Convert input audio to a video output, displaying the audio bit scope.

The filter accepts the following options:

@table @option
@item rate, r
Set frame rate, expressed as number of frames per second. Default
value is "25".

@item size, s
Specify the video size for the output. For the syntax of this option, check the
@ref{video size syntax,,"Video size" section in the ffmpeg-utils manual,ffmpeg-utils}.
Default value is @code{1024x256}.

@item colors
Specify list of colors separated by space or by '|' which will be used to
draw channels. Unrecognized or missing colors will be replaced
by white color.
@end table

@section ahistogram

Convert input audio to a video output, displaying the volume histogram.

The filter accepts the following options:

@table @option
@item dmode
Specify how histogram is calculated.

It accepts the following values:
@table @samp
@item single
Use single histogram for all channels.
@item separate
Use separate histogram for each channel.
@end table
Default is @code{single}.

@item rate, r
Set frame rate, expressed as number of frames per second. Default
value is "25".

@item size, s
Specify the video size for the output. For the syntax of this option, check the
@ref{video size syntax,,"Video size" section in the ffmpeg-utils manual,ffmpeg-utils}.
Default value is @code{hd720}.

@item scale
Set display scale.

It accepts the following values:
@table @samp
@item log
logarithmic
@item sqrt
square root
@item cbrt
cubic root
@item lin
linear
@item rlog
reverse logarithmic
@end table
Default is @code{log}.

@item ascale
Set amplitude scale.

It accepts the following values:
@table @samp
@item log
logarithmic
@item lin
linear
@end table
Default is @code{log}.

@item acount
Set how much frames to accumulate in histogram.
Defauls is 1. Setting this to -1 accumulates all frames.

@item rheight
Set histogram ratio of window height.

@item slide
Set sonogram sliding.

It accepts the following values:
@table @samp
@item replace
replace old rows with new ones.
@item scroll
scroll from top to bottom.
@end table
Default is @code{replace}.
@end table

@section aphasemeter

Convert input audio to a video output, displaying the audio phase.

The filter accepts the following options:

@table @option
@item rate, r
Set the output frame rate. Default value is @code{25}.

@item size, s
Set the video size for the output. For the syntax of this option, check the
@ref{video size syntax,,"Video size" section in the ffmpeg-utils manual,ffmpeg-utils}.
Default value is @code{800x400}.

@item rc
@item gc
@item bc
Specify the red, green, blue contrast. Default values are @code{2},
@code{7} and @code{1}.
Allowed range is @code{[0, 255]}.

@item mpc
Set color which will be used for drawing median phase. If color is
@code{none} which is default, no median phase value will be drawn.

@item video
Enable video output. Default is enabled.
@end table

The filter also exports the frame metadata @code{lavfi.aphasemeter.phase} which
represents mean phase of current audio frame. Value is in range @code{[-1, 1]}.
The @code{-1} means left and right channels are completely out of phase and
@code{1} means channels are in phase.

@section avectorscope

Convert input audio to a video output, representing the audio vector
scope.

The filter is used to measure the difference between channels of stereo
audio stream. A monoaural signal, consisting of identical left and right
signal, results in straight vertical line. Any stereo separation is visible
as a deviation from this line, creating a Lissajous figure.
If the straight (or deviation from it) but horizontal line appears this
indicates that the left and right channels are out of phase.

The filter accepts the following options:

@table @option
@item mode, m
Set the vectorscope mode.

Available values are:
@table @samp
@item lissajous
Lissajous rotated by 45 degrees.

@item lissajous_xy
Same as above but not rotated.

@item polar
Shape resembling half of circle.
@end table

Default value is @samp{lissajous}.

@item size, s
Set the video size for the output. For the syntax of this option, check the
@ref{video size syntax,,"Video size" section in the ffmpeg-utils manual,ffmpeg-utils}.
Default value is @code{400x400}.

@item rate, r
Set the output frame rate. Default value is @code{25}.

@item rc
@item gc
@item bc
@item ac
Specify the red, green, blue and alpha contrast. Default values are @code{40},
@code{160}, @code{80} and @code{255}.
Allowed range is @code{[0, 255]}.

@item rf
@item gf
@item bf
@item af
Specify the red, green, blue and alpha fade. Default values are @code{15},
@code{10}, @code{5} and @code{5}.
Allowed range is @code{[0, 255]}.

@item zoom
Set the zoom factor. Default value is @code{1}. Allowed range is @code{[0, 10]}.
Values lower than @var{1} will auto adjust zoom factor to maximal possible value.

@item draw
Set the vectorscope drawing mode.

Available values are:
@table @samp
@item dot
Draw dot for each sample.

@item line
Draw line between previous and current sample.
@end table

Default value is @samp{dot}.

@item scale
Specify amplitude scale of audio samples.

Available values are:
@table @samp
@item lin
Linear.

@item sqrt
Square root.

@item cbrt
Cubic root.

@item log
Logarithmic.
@end table

@item swap
Swap left channel axis with right channel axis.

@item mirror
Mirror axis.

@table @samp
@item none
No mirror.

@item x
Mirror only x axis.

@item y
Mirror only y axis.

@item xy
Mirror both axis.
@end table

@end table

@subsection Examples

@itemize
@item
Complete example using @command{ffplay}:
@example
ffplay -f lavfi 'amovie=input.mp3, asplit [a][out1];
             [a] avectorscope=zoom=1.3:rc=2:gc=200:bc=10:rf=1:gf=8:bf=7 [out0]'
@end example
@end itemize

@section bench, abench

Benchmark part of a filtergraph.

The filter accepts the following options:

@table @option
@item action
Start or stop a timer.

Available values are:
@table @samp
@item start
Get the current time, set it as frame metadata (using the key
@code{lavfi.bench.start_time}), and forward the frame to the next filter.

@item stop
Get the current time and fetch the @code{lavfi.bench.start_time} metadata from
the input frame metadata to get the time difference. Time difference, average,
maximum and minimum time (respectively @code{t}, @code{avg}, @code{max} and
@code{min}) are then printed. The timestamps are expressed in seconds.
@end table
@end table

@subsection Examples

@itemize
@item
Benchmark @ref{selectivecolor} filter:
@example
bench=start,selectivecolor=reds=-.2 .12 -.49,bench=stop
@end example
@end itemize

@section concat

Concatenate audio and video streams, joining them together one after the
other.

The filter works on segments of synchronized video and audio streams. All
segments must have the same number of streams of each type, and that will
also be the number of streams at output.

The filter accepts the following options:

@table @option

@item n
Set the number of segments. Default is 2.

@item v
Set the number of output video streams, that is also the number of video
streams in each segment. Default is 1.

@item a
Set the number of output audio streams, that is also the number of audio
streams in each segment. Default is 0.

@item unsafe
Activate unsafe mode: do not fail if segments have a different format.

@end table

The filter has @var{v}+@var{a} outputs: first @var{v} video outputs, then
@var{a} audio outputs.

There are @var{n}x(@var{v}+@var{a}) inputs: first the inputs for the first
segment, in the same order as the outputs, then the inputs for the second
segment, etc.

Related streams do not always have exactly the same duration, for various
reasons including codec frame size or sloppy authoring. For that reason,
related synchronized streams (e.g. a video and its audio track) should be
concatenated at once. The concat filter will use the duration of the longest
stream in each segment (except the last one), and if necessary pad shorter
audio streams with silence.

For this filter to work correctly, all segments must start at timestamp 0.

All corresponding streams must have the same parameters in all segments; the
filtering system will automatically select a common pixel format for video
streams, and a common sample format, sample rate and channel layout for
audio streams, but other settings, such as resolution, must be converted
explicitly by the user.

Different frame rates are acceptable but will result in variable frame rate
at output; be sure to configure the output file to handle it.

@subsection Examples

@itemize
@item
Concatenate an opening, an episode and an ending, all in bilingual version
(video in stream 0, audio in streams 1 and 2):
@example
ffmpeg -i opening.mkv -i episode.mkv -i ending.mkv -filter_complex \
  '[0:0] [0:1] [0:2] [1:0] [1:1] [1:2] [2:0] [2:1] [2:2]
   concat=n=3:v=1:a=2 [v] [a1] [a2]' \
  -map '[v]' -map '[a1]' -map '[a2]' output.mkv
@end example

@item
Concatenate two parts, handling audio and video separately, using the
(a)movie sources, and adjusting the resolution:
@example
movie=part1.mp4, scale=512:288 [v1] ; amovie=part1.mp4 [a1] ;
movie=part2.mp4, scale=512:288 [v2] ; amovie=part2.mp4 [a2] ;
[v1] [v2] concat [outv] ; [a1] [a2] concat=v=0:a=1 [outa]
@end example
Note that a desync will happen at the stitch if the audio and video streams
do not have exactly the same duration in the first file.

@end itemize

@subsection Commands

This filter supports the following commands:
@table @option
@item next
Close the current segment and step to the next one
@end table

@section drawgraph, adrawgraph

Draw a graph using input video or audio metadata.

It accepts the following parameters:

@table @option
@item m1
Set 1st frame metadata key from which metadata values will be used to draw a graph.

@item fg1
Set 1st foreground color expression.

@item m2
Set 2nd frame metadata key from which metadata values will be used to draw a graph.

@item fg2
Set 2nd foreground color expression.

@item m3
Set 3rd frame metadata key from which metadata values will be used to draw a graph.

@item fg3
Set 3rd foreground color expression.

@item m4
Set 4th frame metadata key from which metadata values will be used to draw a graph.

@item fg4
Set 4th foreground color expression.

@item min
Set minimal value of metadata value.

@item max
Set maximal value of metadata value.

@item bg
Set graph background color. Default is white.

@item mode
Set graph mode.

Available values for mode is:
@table @samp
@item bar
@item dot
@item line
@end table

Default is @code{line}.

@item slide
Set slide mode.

Available values for slide is:
@table @samp
@item frame
Draw new frame when right border is reached.

@item replace
Replace old columns with new ones.

@item scroll
Scroll from right to left.

@item rscroll
Scroll from left to right.

@item picture
Draw single picture.
@end table

Default is @code{frame}.

@item size
Set size of graph video. For the syntax of this option, check the
@ref{video size syntax,,"Video size" section in the ffmpeg-utils manual,ffmpeg-utils}.
The default value is @code{900x256}.

The foreground color expressions can use the following variables:
@table @option
@item MIN
Minimal value of metadata value.

@item MAX
Maximal value of metadata value.

@item VAL
Current metadata key value.
@end table

The color is defined as 0xAABBGGRR.
@end table

Example using metadata from @ref{signalstats} filter:
@example
signalstats,drawgraph=lavfi.signalstats.YAVG:min=0:max=255
@end example

Example using metadata from @ref{ebur128} filter:
@example
ebur128=metadata=1,adrawgraph=lavfi.r128.M:min=-120:max=5
@end example

@anchor{ebur128}
@section ebur128

EBU R128 scanner filter. This filter takes an audio stream as input and outputs
it unchanged. By default, it logs a message at a frequency of 10Hz with the
Momentary loudness (identified by @code{M}), Short-term loudness (@code{S}),
Integrated loudness (@code{I}) and Loudness Range (@code{LRA}).

The filter also has a video output (see the @var{video} option) with a real
time graph to observe the loudness evolution. The graphic contains the logged
message mentioned above, so it is not printed anymore when this option is set,
unless the verbose logging is set. The main graphing area contains the
short-term loudness (3 seconds of analysis), and the gauge on the right is for
the momentary loudness (400 milliseconds).

More information about the Loudness Recommendation EBU R128 on
@url{http://tech.ebu.ch/loudness}.

The filter accepts the following options:

@table @option

@item video
Activate the video output. The audio stream is passed unchanged whether this
option is set or no. The video stream will be the first output stream if
activated. Default is @code{0}.

@item size
Set the video size. This option is for video only. For the syntax of this
option, check the
@ref{video size syntax,,"Video size" section in the ffmpeg-utils manual,ffmpeg-utils}.
Default and minimum resolution is @code{640x480}.

@item meter
Set the EBU scale meter. Default is @code{9}. Common values are @code{9} and
@code{18}, respectively for EBU scale meter +9 and EBU scale meter +18. Any
other integer value between this range is allowed.

@item metadata
Set metadata injection. If set to @code{1}, the audio input will be segmented
into 100ms output frames, each of them containing various loudness information
in metadata.  All the metadata keys are prefixed with @code{lavfi.r128.}.

Default is @code{0}.

@item framelog
Force the frame logging level.

Available values are:
@table @samp
@item info
information logging level
@item verbose
verbose logging level
@end table

By default, the logging level is set to @var{info}. If the @option{video} or
the @option{metadata} options are set, it switches to @var{verbose}.

@item peak
Set peak mode(s).

Available modes can be cumulated (the option is a @code{flag} type). Possible
values are:
@table @samp
@item none
Disable any peak mode (default).
@item sample
Enable sample-peak mode.

Simple peak mode looking for the higher sample value. It logs a message
for sample-peak (identified by @code{SPK}).
@item true
Enable true-peak mode.

If enabled, the peak lookup is done on an over-sampled version of the input
stream for better peak accuracy. It logs a message for true-peak.
(identified by @code{TPK}) and true-peak per frame (identified by @code{FTPK}).
This mode requires a build with @code{libswresample}.
@end table

@item dualmono
Treat mono input files as "dual mono". If a mono file is intended for playback
on a stereo system, its EBU R128 measurement will be perceptually incorrect.
If set to @code{true}, this option will compensate for this effect.
Multi-channel input files are not affected by this option.

@item panlaw
Set a specific pan law to be used for the measurement of dual mono files.
This parameter is optional, and has a default value of -3.01dB.
@end table

@subsection Examples

@itemize
@item
Real-time graph using @command{ffplay}, with a EBU scale meter +18:
@example
ffplay -f lavfi -i "amovie=input.mp3,ebur128=video=1:meter=18 [out0][out1]"
@end example

@item
Run an analysis with @command{ffmpeg}:
@example
ffmpeg -nostats -i input.mp3 -filter_complex ebur128 -f null -
@end example
@end itemize

@section interleave, ainterleave

Temporally interleave frames from several inputs.

@code{interleave} works with video inputs, @code{ainterleave} with audio.

These filters read frames from several inputs and send the oldest
queued frame to the output.

Input streams must have well defined, monotonically increasing frame
timestamp values.

In order to submit one frame to output, these filters need to enqueue
at least one frame for each input, so they cannot work in case one
input is not yet terminated and will not receive incoming frames.

For example consider the case when one input is a @code{select} filter
which always drops input frames. The @code{interleave} filter will keep
reading from that input, but it will never be able to send new frames
to output until the input sends an end-of-stream signal.

Also, depending on inputs synchronization, the filters will drop
frames in case one input receives more frames than the other ones, and
the queue is already filled.

These filters accept the following options:

@table @option
@item nb_inputs, n
Set the number of different inputs, it is 2 by default.
@end table

@subsection Examples

@itemize
@item
Interleave frames belonging to different streams using @command{ffmpeg}:
@example
ffmpeg -i bambi.avi -i pr0n.mkv -filter_complex "[0:v][1:v] interleave" out.avi
@end example

@item
Add flickering blur effect:
@example
select='if(gt(random(0), 0.2), 1, 2)':n=2 [tmp], boxblur=2:2, [tmp] interleave
@end example
@end itemize

@section metadata, ametadata

Manipulate frame metadata.

This filter accepts the following options:

@table @option
@item mode
Set mode of operation of the filter.

Can be one of the following:

@table @samp
@item select
If both @code{value} and @code{key} is set, select frames
which have such metadata. If only @code{key} is set, select
every frame that has such key in metadata.

@item add
Add new metadata @code{key} and @code{value}. If key is already available
do nothing.

@item modify
Modify value of already present key.

@item delete
If @code{value} is set, delete only keys that have such value.
Otherwise, delete key. If @code{key} is not set, delete all metadata values in
the frame.

@item print
Print key and its value if metadata was found. If @code{key} is not set print all
metadata values available in frame.
@end table

@item key
Set key used with all modes. Must be set for all modes except @code{print} and @code{delete}.

@item value
Set metadata value which will be used. This option is mandatory for
@code{modify} and @code{add} mode.

@item function
Which function to use when comparing metadata value and @code{value}.

Can be one of following:

@table @samp
@item same_str
Values are interpreted as strings, returns true if metadata value is same as @code{value}.

@item starts_with
Values are interpreted as strings, returns true if metadata value starts with
the @code{value} option string.

@item less
Values are interpreted as floats, returns true if metadata value is less than @code{value}.

@item equal
Values are interpreted as floats, returns true if @code{value} is equal with metadata value.

@item greater
Values are interpreted as floats, returns true if metadata value is greater than @code{value}.

@item expr
Values are interpreted as floats, returns true if expression from option @code{expr}
evaluates to true.
@end table

@item expr
Set expression which is used when @code{function} is set to @code{expr}.
The expression is evaluated through the eval API and can contain the following
constants:

@table @option
@item VALUE1
Float representation of @code{value} from metadata key.

@item VALUE2
Float representation of @code{value} as supplied by user in @code{value} option.
@end table

@item file
If specified in @code{print} mode, output is written to the named file. Instead of
plain filename any writable url can be specified. Filename ``-'' is a shorthand
for standard output. If @code{file} option is not set, output is written to the log
with AV_LOG_INFO loglevel.

@end table

@subsection Examples

@itemize
@item
Print all metadata values for frames with key @code{lavfi.signalstats.YDIF} with values
between 0 and 1.
@example
signalstats,metadata=print:key=lavfi.signalstats.YDIF:value=0:function=expr:expr='between(VALUE1,0,1)'
@end example
@item
Print silencedetect output to file @file{metadata.txt}.
@example
silencedetect,ametadata=mode=print:file=metadata.txt
@end example
@item
Direct all metadata to a pipe with file descriptor 4.
@example
metadata=mode=print:file='pipe\:4'
@end example
@end itemize

@section perms, aperms

Set read/write permissions for the output frames.

These filters are mainly aimed at developers to test direct path in the
following filter in the filtergraph.

The filters accept the following options:

@table @option
@item mode
Select the permissions mode.

It accepts the following values:
@table @samp
@item none
Do nothing. This is the default.
@item ro
Set all the output frames read-only.
@item rw
Set all the output frames directly writable.
@item toggle
Make the frame read-only if writable, and writable if read-only.
@item random
Set each output frame read-only or writable randomly.
@end table

@item seed
Set the seed for the @var{random} mode, must be an integer included between
@code{0} and @code{UINT32_MAX}. If not specified, or if explicitly set to
@code{-1}, the filter will try to use a good random seed on a best effort
basis.
@end table

Note: in case of auto-inserted filter between the permission filter and the
following one, the permission might not be received as expected in that
following filter. Inserting a @ref{format} or @ref{aformat} filter before the
perms/aperms filter can avoid this problem.

@section realtime, arealtime

Slow down filtering to match real time approximately.

These filters will pause the filtering for a variable amount of time to
match the output rate with the input timestamps.
They are similar to the @option{re} option to @code{ffmpeg}.

They accept the following options:

@table @option
@item limit
Time limit for the pauses. Any pause longer than that will be considered
a timestamp discontinuity and reset the timer. Default is 2 seconds.
@end table

@anchor{select}
@section select, aselect

Select frames to pass in output.

This filter accepts the following options:

@table @option

@item expr, e
Set expression, which is evaluated for each input frame.

If the expression is evaluated to zero, the frame is discarded.

If the evaluation result is negative or NaN, the frame is sent to the
first output; otherwise it is sent to the output with index
@code{ceil(val)-1}, assuming that the input index starts from 0.

For example a value of @code{1.2} corresponds to the output with index
@code{ceil(1.2)-1 = 2-1 = 1}, that is the second output.

@item outputs, n
Set the number of outputs. The output to which to send the selected
frame is based on the result of the evaluation. Default value is 1.
@end table

The expression can contain the following constants:

@table @option
@item n
The (sequential) number of the filtered frame, starting from 0.

@item selected_n
The (sequential) number of the selected frame, starting from 0.

@item prev_selected_n
The sequential number of the last selected frame. It's NAN if undefined.

@item TB
The timebase of the input timestamps.

@item pts
The PTS (Presentation TimeStamp) of the filtered video frame,
expressed in @var{TB} units. It's NAN if undefined.

@item t
The PTS of the filtered video frame,
expressed in seconds. It's NAN if undefined.

@item prev_pts
The PTS of the previously filtered video frame. It's NAN if undefined.

@item prev_selected_pts
The PTS of the last previously filtered video frame. It's NAN if undefined.

@item prev_selected_t
The PTS of the last previously selected video frame, expressed in seconds. It's NAN if undefined.

@item start_pts
The PTS of the first video frame in the video. It's NAN if undefined.

@item start_t
The time of the first video frame in the video. It's NAN if undefined.

@item pict_type @emph{(video only)}
The type of the filtered frame. It can assume one of the following
values:
@table @option
@item I
@item P
@item B
@item S
@item SI
@item SP
@item BI
@end table

@item interlace_type @emph{(video only)}
The frame interlace type. It can assume one of the following values:
@table @option
@item PROGRESSIVE
The frame is progressive (not interlaced).
@item TOPFIRST
The frame is top-field-first.
@item BOTTOMFIRST
The frame is bottom-field-first.
@end table

@item consumed_sample_n @emph{(audio only)}
the number of selected samples before the current frame

@item samples_n @emph{(audio only)}
the number of samples in the current frame

@item sample_rate @emph{(audio only)}
the input sample rate

@item key
This is 1 if the filtered frame is a key-frame, 0 otherwise.

@item pos
the position in the file of the filtered frame, -1 if the information
is not available (e.g. for synthetic video)

@item scene @emph{(video only)}
value between 0 and 1 to indicate a new scene; a low value reflects a low
probability for the current frame to introduce a new scene, while a higher
value means the current frame is more likely to be one (see the example below)

@item concatdec_select
The concat demuxer can select only part of a concat input file by setting an
inpoint and an outpoint, but the output packets may not be entirely contained
in the selected interval. By using this variable, it is possible to skip frames
generated by the concat demuxer which are not exactly contained in the selected
interval.

This works by comparing the frame pts against the @var{lavf.concat.start_time}
and the @var{lavf.concat.duration} packet metadata values which are also
present in the decoded frames.

The @var{concatdec_select} variable is -1 if the frame pts is at least
start_time and either the duration metadata is missing or the frame pts is less
than start_time + duration, 0 otherwise, and NaN if the start_time metadata is
missing.

That basically means that an input frame is selected if its pts is within the
interval set by the concat demuxer.

@end table

The default value of the select expression is "1".

@subsection Examples

@itemize
@item
Select all frames in input:
@example
select
@end example

The example above is the same as:
@example
select=1
@end example

@item
Skip all frames:
@example
select=0
@end example

@item
Select only I-frames:
@example
select='eq(pict_type\,I)'
@end example

@item
Select one frame every 100:
@example
select='not(mod(n\,100))'
@end example

@item
Select only frames contained in the 10-20 time interval:
@example
select=between(t\,10\,20)
@end example

@item
Select only I-frames contained in the 10-20 time interval:
@example
select=between(t\,10\,20)*eq(pict_type\,I)
@end example

@item
Select frames with a minimum distance of 10 seconds:
@example
select='isnan(prev_selected_t)+gte(t-prev_selected_t\,10)'
@end example

@item
Use aselect to select only audio frames with samples number > 100:
@example
aselect='gt(samples_n\,100)'
@end example

@item
Create a mosaic of the first scenes:
@example
ffmpeg -i video.avi -vf select='gt(scene\,0.4)',scale=160:120,tile -frames:v 1 preview.png
@end example

Comparing @var{scene} against a value between 0.3 and 0.5 is generally a sane
choice.

@item
Send even and odd frames to separate outputs, and compose them:
@example
select=n=2:e='mod(n, 2)+1' [odd][even]; [odd] pad=h=2*ih [tmp]; [tmp][even] overlay=y=h
@end example

@item
Select useful frames from an ffconcat file which is using inpoints and
outpoints but where the source files are not intra frame only.
@example
ffmpeg -copyts -vsync 0 -segment_time_metadata 1 -i input.ffconcat -vf select=concatdec_select -af aselect=concatdec_select output.avi
@end example
@end itemize

@section sendcmd, asendcmd

Send commands to filters in the filtergraph.

These filters read commands to be sent to other filters in the
filtergraph.

@code{sendcmd} must be inserted between two video filters,
@code{asendcmd} must be inserted between two audio filters, but apart
from that they act the same way.

The specification of commands can be provided in the filter arguments
with the @var{commands} option, or in a file specified by the
@var{filename} option.

These filters accept the following options:
@table @option
@item commands, c
Set the commands to be read and sent to the other filters.
@item filename, f
Set the filename of the commands to be read and sent to the other
filters.
@end table

@subsection Commands syntax

A commands description consists of a sequence of interval
specifications, comprising a list of commands to be executed when a
particular event related to that interval occurs. The occurring event
is typically the current frame time entering or leaving a given time
interval.

An interval is specified by the following syntax:
@example
@var{START}[-@var{END}] @var{COMMANDS};
@end example

The time interval is specified by the @var{START} and @var{END} times.
@var{END} is optional and defaults to the maximum time.

The current frame time is considered within the specified interval if
it is included in the interval [@var{START}, @var{END}), that is when
the time is greater or equal to @var{START} and is lesser than
@var{END}.

@var{COMMANDS} consists of a sequence of one or more command
specifications, separated by ",", relating to that interval.  The
syntax of a command specification is given by:
@example
[@var{FLAGS}] @var{TARGET} @var{COMMAND} @var{ARG}
@end example

@var{FLAGS} is optional and specifies the type of events relating to
the time interval which enable sending the specified command, and must
be a non-null sequence of identifier flags separated by "+" or "|" and
enclosed between "[" and "]".

The following flags are recognized:
@table @option
@item enter
The command is sent when the current frame timestamp enters the
specified interval. In other words, the command is sent when the
previous frame timestamp was not in the given interval, and the
current is.

@item leave
The command is sent when the current frame timestamp leaves the
specified interval. In other words, the command is sent when the
previous frame timestamp was in the given interval, and the
current is not.
@end table

If @var{FLAGS} is not specified, a default value of @code{[enter]} is
assumed.

@var{TARGET} specifies the target of the command, usually the name of
the filter class or a specific filter instance name.

@var{COMMAND} specifies the name of the command for the target filter.

@var{ARG} is optional and specifies the optional list of argument for
the given @var{COMMAND}.

Between one interval specification and another, whitespaces, or
sequences of characters starting with @code{#} until the end of line,
are ignored and can be used to annotate comments.

A simplified BNF description of the commands specification syntax
follows:
@example
@var{COMMAND_FLAG}  ::= "enter" | "leave"
@var{COMMAND_FLAGS} ::= @var{COMMAND_FLAG} [(+|"|")@var{COMMAND_FLAG}]
@var{COMMAND}       ::= ["[" @var{COMMAND_FLAGS} "]"] @var{TARGET} @var{COMMAND} [@var{ARG}]
@var{COMMANDS}      ::= @var{COMMAND} [,@var{COMMANDS}]
@var{INTERVAL}      ::= @var{START}[-@var{END}] @var{COMMANDS}
@var{INTERVALS}     ::= @var{INTERVAL}[;@var{INTERVALS}]
@end example

@subsection Examples

@itemize
@item
Specify audio tempo change at second 4:
@example
asendcmd=c='4.0 atempo tempo 1.5',atempo
@end example

@item
Target a specific filter instance:
@example
asendcmd=c='4.0 atempo@@my tempo 1.5',atempo@@my
@end example

@item
Specify a list of drawtext and hue commands in a file.
@example
# show text in the interval 5-10
5.0-10.0 [enter] drawtext reinit 'fontfile=FreeSerif.ttf:text=hello world',
         [leave] drawtext reinit 'fontfile=FreeSerif.ttf:text=';

# desaturate the image in the interval 15-20
15.0-20.0 [enter] hue s 0,
          [enter] drawtext reinit 'fontfile=FreeSerif.ttf:text=nocolor',
          [leave] hue s 1,
          [leave] drawtext reinit 'fontfile=FreeSerif.ttf:text=color';

# apply an exponential saturation fade-out effect, starting from time 25
25 [enter] hue s exp(25-t)
@end example

A filtergraph allowing to read and process the above command list
stored in a file @file{test.cmd}, can be specified with:
@example
sendcmd=f=test.cmd,drawtext=fontfile=FreeSerif.ttf:text='',hue
@end example
@end itemize

@anchor{setpts}
@section setpts, asetpts

Change the PTS (presentation timestamp) of the input frames.

@code{setpts} works on video frames, @code{asetpts} on audio frames.

This filter accepts the following options:

@table @option

@item expr
The expression which is evaluated for each frame to construct its timestamp.

@end table

The expression is evaluated through the eval API and can contain the following
constants:

@table @option
@item FRAME_RATE
frame rate, only defined for constant frame-rate video

@item PTS
The presentation timestamp in input

@item N
The count of the input frame for video or the number of consumed samples,
not including the current frame for audio, starting from 0.

@item NB_CONSUMED_SAMPLES
The number of consumed samples, not including the current frame (only
audio)

@item NB_SAMPLES, S
The number of samples in the current frame (only audio)

@item SAMPLE_RATE, SR
The audio sample rate.

@item STARTPTS
The PTS of the first frame.

@item STARTT
the time in seconds of the first frame

@item INTERLACED
State whether the current frame is interlaced.

@item T
the time in seconds of the current frame

@item POS
original position in the file of the frame, or undefined if undefined
for the current frame

@item PREV_INPTS
The previous input PTS.

@item PREV_INT
previous input time in seconds

@item PREV_OUTPTS
The previous output PTS.

@item PREV_OUTT
previous output time in seconds

@item RTCTIME
The wallclock (RTC) time in microseconds. This is deprecated, use time(0)
instead.

@item RTCSTART
The wallclock (RTC) time at the start of the movie in microseconds.

@item TB
The timebase of the input timestamps.

@end table

@subsection Examples

@itemize
@item
Start counting PTS from zero
@example
setpts=PTS-STARTPTS
@end example

@item
Apply fast motion effect:
@example
setpts=0.5*PTS
@end example

@item
Apply slow motion effect:
@example
setpts=2.0*PTS
@end example

@item
Set fixed rate of 25 frames per second:
@example
setpts=N/(25*TB)
@end example

@item
Set fixed rate 25 fps with some jitter:
@example
setpts='1/(25*TB) * (N + 0.05 * sin(N*2*PI/25))'
@end example

@item
Apply an offset of 10 seconds to the input PTS:
@example
setpts=PTS+10/TB
@end example

@item
Generate timestamps from a "live source" and rebase onto the current timebase:
@example
setpts='(RTCTIME - RTCSTART) / (TB * 1000000)'
@end example

@item
Generate timestamps by counting samples:
@example
asetpts=N/SR/TB
@end example

@end itemize

@section setrange

Force color range for the output video frame.

The @code{setrange} filter marks the color range property for the
output frames. It does not change the input frame, but only sets the
corresponding property, which affects how the frame is treated by
following filters.

The filter accepts the following options:

@table @option

@item range
Available values are:

@table @samp
@item auto
Keep the same color range property.

@item unspecified, unknown
Set the color range as unspecified.

@item limited, tv, mpeg
Set the color range as limited.

@item full, pc, jpeg
Set the color range as full.
@end table
@end table

@section settb, asettb

Set the timebase to use for the output frames timestamps.
It is mainly useful for testing timebase configuration.

It accepts the following parameters:

@table @option

@item expr, tb
The expression which is evaluated into the output timebase.

@end table

The value for @option{tb} is an arithmetic expression representing a
rational. The expression can contain the constants "AVTB" (the default
timebase), "intb" (the input timebase) and "sr" (the sample rate,
audio only). Default value is "intb".

@subsection Examples

@itemize
@item
Set the timebase to 1/25:
@example
settb=expr=1/25
@end example

@item
Set the timebase to 1/10:
@example
settb=expr=0.1
@end example

@item
Set the timebase to 1001/1000:
@example
settb=1+0.001
@end example

@item
Set the timebase to 2*intb:
@example
settb=2*intb
@end example

@item
Set the default timebase value:
@example
settb=AVTB
@end example
@end itemize

@section showcqt
Convert input audio to a video output representing frequency spectrum
logarithmically using Brown-Puckette constant Q transform algorithm with
direct frequency domain coefficient calculation (but the transform itself
is not really constant Q, instead the Q factor is actually variable/clamped),
with musical tone scale, from E0 to D#10.

The filter accepts the following options:

@table @option
@item size, s
Specify the video size for the output. It must be even. For the syntax of this option,
check the @ref{video size syntax,,"Video size" section in the ffmpeg-utils manual,ffmpeg-utils}.
Default value is @code{1920x1080}.

@item fps, rate, r
Set the output frame rate. Default value is @code{25}.

@item bar_h
Set the bargraph height. It must be even. Default value is @code{-1} which
computes the bargraph height automatically.

@item axis_h
Set the axis height. It must be even. Default value is @code{-1} which computes
the axis height automatically.

@item sono_h
Set the sonogram height. It must be even. Default value is @code{-1} which
computes the sonogram height automatically.

@item fullhd
Set the fullhd resolution. This option is deprecated, use @var{size}, @var{s}
instead. Default value is @code{1}.

@item sono_v, volume
Specify the sonogram volume expression. It can contain variables:
@table @option
@item bar_v
the @var{bar_v} evaluated expression
@item frequency, freq, f
the frequency where it is evaluated
@item timeclamp, tc
the value of @var{timeclamp} option
@end table
and functions:
@table @option
@item a_weighting(f)
A-weighting of equal loudness
@item b_weighting(f)
B-weighting of equal loudness
@item c_weighting(f)
C-weighting of equal loudness.
@end table
Default value is @code{16}.

@item bar_v, volume2
Specify the bargraph volume expression. It can contain variables:
@table @option
@item sono_v
the @var{sono_v} evaluated expression
@item frequency, freq, f
the frequency where it is evaluated
@item timeclamp, tc
the value of @var{timeclamp} option
@end table
and functions:
@table @option
@item a_weighting(f)
A-weighting of equal loudness
@item b_weighting(f)
B-weighting of equal loudness
@item c_weighting(f)
C-weighting of equal loudness.
@end table
Default value is @code{sono_v}.

@item sono_g, gamma
Specify the sonogram gamma. Lower gamma makes the spectrum more contrast,
higher gamma makes the spectrum having more range. Default value is @code{3}.
Acceptable range is @code{[1, 7]}.

@item bar_g, gamma2
Specify the bargraph gamma. Default value is @code{1}. Acceptable range is
@code{[1, 7]}.

@item bar_t
Specify the bargraph transparency level. Lower value makes the bargraph sharper.
Default value is @code{1}. Acceptable range is @code{[0, 1]}.

@item timeclamp, tc
Specify the transform timeclamp. At low frequency, there is trade-off between
accuracy in time domain and frequency domain. If timeclamp is lower,
event in time domain is represented more accurately (such as fast bass drum),
otherwise event in frequency domain is represented more accurately
(such as bass guitar). Acceptable range is @code{[0.002, 1]}. Default value is @code{0.17}.

@item attack
Set attack time in seconds. The default is @code{0} (disabled). Otherwise, it
limits future samples by applying asymmetric windowing in time domain, useful
when low latency is required. Accepted range is @code{[0, 1]}.

@item basefreq
Specify the transform base frequency. Default value is @code{20.01523126408007475},
which is frequency 50 cents below E0. Acceptable range is @code{[10, 100000]}.

@item endfreq
Specify the transform end frequency. Default value is @code{20495.59681441799654},
which is frequency 50 cents above D#10. Acceptable range is @code{[10, 100000]}.

@item coeffclamp
This option is deprecated and ignored.

@item tlength
Specify the transform length in time domain. Use this option to control accuracy
trade-off between time domain and frequency domain at every frequency sample.
It can contain variables:
@table @option
@item frequency, freq, f
the frequency where it is evaluated
@item timeclamp, tc
the value of @var{timeclamp} option.
@end table
Default value is @code{384*tc/(384+tc*f)}.

@item count
Specify the transform count for every video frame. Default value is @code{6}.
Acceptable range is @code{[1, 30]}.

@item fcount
Specify the transform count for every single pixel. Default value is @code{0},
which makes it computed automatically. Acceptable range is @code{[0, 10]}.

@item fontfile
Specify font file for use with freetype to draw the axis. If not specified,
use embedded font. Note that drawing with font file or embedded font is not
implemented with custom @var{basefreq} and @var{endfreq}, use @var{axisfile}
option instead.

@item font
Specify fontconfig pattern. This has lower priority than @var{fontfile}.
The : in the pattern may be replaced by | to avoid unnecessary escaping.

@item fontcolor
Specify font color expression. This is arithmetic expression that should return
integer value 0xRRGGBB. It can contain variables:
@table @option
@item frequency, freq, f
the frequency where it is evaluated
@item timeclamp, tc
the value of @var{timeclamp} option
@end table
and functions:
@table @option
@item midi(f)
midi number of frequency f, some midi numbers: E0(16), C1(24), C2(36), A4(69)
@item r(x), g(x), b(x)
red, green, and blue value of intensity x.
@end table
Default value is @code{st(0, (midi(f)-59.5)/12);
st(1, if(between(ld(0),0,1), 0.5-0.5*cos(2*PI*ld(0)), 0));
r(1-ld(1)) + b(ld(1))}.

@item axisfile
Specify image file to draw the axis. This option override @var{fontfile} and
@var{fontcolor} option.

@item axis, text
Enable/disable drawing text to the axis. If it is set to @code{0}, drawing to
the axis is disabled, ignoring @var{fontfile} and @var{axisfile} option.
Default value is @code{1}.

@item csp
Set colorspace. The accepted values are:
@table @samp
@item unspecified
Unspecified (default)

@item bt709
BT.709

@item fcc
FCC

@item bt470bg
BT.470BG or BT.601-6 625

@item smpte170m
SMPTE-170M or BT.601-6 525

@item smpte240m
SMPTE-240M

@item bt2020ncl
BT.2020 with non-constant luminance

@end table

@item cscheme
Set spectrogram color scheme. This is list of floating point values with format
@code{left_r|left_g|left_b|right_r|right_g|right_b}.
The default is @code{1|0.5|0|0|0.5|1}.

@end table

@subsection Examples

@itemize
@item
Playing audio while showing the spectrum:
@example
ffplay -f lavfi 'amovie=a.mp3, asplit [a][out1]; [a] showcqt [out0]'
@end example

@item
Same as above, but with frame rate 30 fps:
@example
ffplay -f lavfi 'amovie=a.mp3, asplit [a][out1]; [a] showcqt=fps=30:count=5 [out0]'
@end example

@item
Playing at 1280x720:
@example
ffplay -f lavfi 'amovie=a.mp3, asplit [a][out1]; [a] showcqt=s=1280x720:count=4 [out0]'
@end example

@item
Disable sonogram display:
@example
sono_h=0
@end example

@item
A1 and its harmonics: A1, A2, (near)E3, A3:
@example
ffplay -f lavfi 'aevalsrc=0.1*sin(2*PI*55*t)+0.1*sin(4*PI*55*t)+0.1*sin(6*PI*55*t)+0.1*sin(8*PI*55*t),
                 asplit[a][out1]; [a] showcqt [out0]'
@end example

@item
Same as above, but with more accuracy in frequency domain:
@example
ffplay -f lavfi 'aevalsrc=0.1*sin(2*PI*55*t)+0.1*sin(4*PI*55*t)+0.1*sin(6*PI*55*t)+0.1*sin(8*PI*55*t),
                 asplit[a][out1]; [a] showcqt=timeclamp=0.5 [out0]'
@end example

@item
Custom volume:
@example
bar_v=10:sono_v=bar_v*a_weighting(f)
@end example

@item
Custom gamma, now spectrum is linear to the amplitude.
@example
bar_g=2:sono_g=2
@end example

@item
Custom tlength equation:
@example
tc=0.33:tlength='st(0,0.17); 384*tc / (384 / ld(0) + tc*f /(1-ld(0))) + 384*tc / (tc*f / ld(0) + 384 /(1-ld(0)))'
@end example

@item
Custom fontcolor and fontfile, C-note is colored green, others are colored blue:
@example
fontcolor='if(mod(floor(midi(f)+0.5),12), 0x0000FF, g(1))':fontfile=myfont.ttf
@end example

@item
Custom font using fontconfig:
@example
font='Courier New,Monospace,mono|bold'
@end example

@item
Custom frequency range with custom axis using image file:
@example
axisfile=myaxis.png:basefreq=40:endfreq=10000
@end example
@end itemize

@section showfreqs

Convert input audio to video output representing the audio power spectrum.
Audio amplitude is on Y-axis while frequency is on X-axis.

The filter accepts the following options:

@table @option
@item size, s
Specify size of video. For the syntax of this option, check the
@ref{video size syntax,,"Video size" section in the ffmpeg-utils manual,ffmpeg-utils}.
Default is @code{1024x512}.

@item mode
Set display mode.
This set how each frequency bin will be represented.

It accepts the following values:
@table @samp
@item line
@item bar
@item dot
@end table
Default is @code{bar}.

@item ascale
Set amplitude scale.

It accepts the following values:
@table @samp
@item lin
Linear scale.

@item sqrt
Square root scale.

@item cbrt
Cubic root scale.

@item log
Logarithmic scale.
@end table
Default is @code{log}.

@item fscale
Set frequency scale.

It accepts the following values:
@table @samp
@item lin
Linear scale.

@item log
Logarithmic scale.

@item rlog
Reverse logarithmic scale.
@end table
Default is @code{lin}.

@item win_size
Set window size.

It accepts the following values:
@table @samp
@item w16
@item w32
@item w64
@item w128
@item w256
@item w512
@item w1024
@item w2048
@item w4096
@item w8192
@item w16384
@item w32768
@item w65536
@end table
Default is @code{w2048}

@item win_func
Set windowing function.

It accepts the following values:
@table @samp
@item rect
@item bartlett
@item hanning
@item hamming
@item blackman
@item welch
@item flattop
@item bharris
@item bnuttall
@item bhann
@item sine
@item nuttall
@item lanczos
@item gauss
@item tukey
@item dolph
@item cauchy
@item parzen
@item poisson
@end table
Default is @code{hanning}.

@item overlap
Set window overlap. In range @code{[0, 1]}. Default is @code{1},
which means optimal overlap for selected window function will be picked.

@item averaging
Set time averaging. Setting this to 0 will display current maximal peaks.
Default is @code{1}, which means time averaging is disabled.

@item colors
Specify list of colors separated by space or by '|' which will be used to
draw channel frequencies. Unrecognized or missing colors will be replaced
by white color.

@item cmode
Set channel display mode.

It accepts the following values:
@table @samp
@item combined
@item separate
@end table
Default is @code{combined}.

@item minamp
Set minimum amplitude used in @code{log} amplitude scaler.

@end table

@anchor{showspectrum}
@section showspectrum

Convert input audio to a video output, representing the audio frequency
spectrum.

The filter accepts the following options:

@table @option
@item size, s
Specify the video size for the output. For the syntax of this option, check the
@ref{video size syntax,,"Video size" section in the ffmpeg-utils manual,ffmpeg-utils}.
Default value is @code{640x512}.

@item slide
Specify how the spectrum should slide along the window.

It accepts the following values:
@table @samp
@item replace
the samples start again on the left when they reach the right
@item scroll
the samples scroll from right to left
@item fullframe
frames are only produced when the samples reach the right
@item rscroll
the samples scroll from left to right
@end table

Default value is @code{replace}.

@item mode
Specify display mode.

It accepts the following values:
@table @samp
@item combined
all channels are displayed in the same row
@item separate
all channels are displayed in separate rows
@end table

Default value is @samp{combined}.

@item color
Specify display color mode.

It accepts the following values:
@table @samp
@item channel
each channel is displayed in a separate color
@item intensity
each channel is displayed using the same color scheme
@item rainbow
each channel is displayed using the rainbow color scheme
@item moreland
each channel is displayed using the moreland color scheme
@item nebulae
each channel is displayed using the nebulae color scheme
@item fire
each channel is displayed using the fire color scheme
@item fiery
each channel is displayed using the fiery color scheme
@item fruit
each channel is displayed using the fruit color scheme
@item cool
each channel is displayed using the cool color scheme
@end table

Default value is @samp{channel}.

@item scale
Specify scale used for calculating intensity color values.

It accepts the following values:
@table @samp
@item lin
linear
@item sqrt
square root, default
@item cbrt
cubic root
@item log
logarithmic
@item 4thrt
4th root
@item 5thrt
5th root
@end table

Default value is @samp{sqrt}.

@item saturation
Set saturation modifier for displayed colors. Negative values provide
alternative color scheme. @code{0} is no saturation at all.
Saturation must be in [-10.0, 10.0] range.
Default value is @code{1}.

@item win_func
Set window function.

It accepts the following values:
@table @samp
@item rect
@item bartlett
@item hann
@item hanning
@item hamming
@item blackman
@item welch
@item flattop
@item bharris
@item bnuttall
@item bhann
@item sine
@item nuttall
@item lanczos
@item gauss
@item tukey
@item dolph
@item cauchy
@item parzen
@item poisson
@end table

Default value is @code{hann}.

@item orientation
Set orientation of time vs frequency axis. Can be @code{vertical} or
@code{horizontal}. Default is @code{vertical}.

@item overlap
Set ratio of overlap window. Default value is @code{0}.
When value is @code{1} overlap is set to recommended size for specific
window function currently used.

@item gain
Set scale gain for calculating intensity color values.
Default value is @code{1}.

@item data
Set which data to display. Can be @code{magnitude}, default or @code{phase}.

@item rotation
Set color rotation, must be in [-1.0, 1.0] range.
Default value is @code{0}.
@end table

The usage is very similar to the showwaves filter; see the examples in that
section.

@subsection Examples

@itemize
@item
Large window with logarithmic color scaling:
@example
showspectrum=s=1280x480:scale=log
@end example

@item
Complete example for a colored and sliding spectrum per channel using @command{ffplay}:
@example
ffplay -f lavfi 'amovie=input.mp3, asplit [a][out1];
             [a] showspectrum=mode=separate:color=intensity:slide=1:scale=cbrt [out0]'
@end example
@end itemize

@section showspectrumpic

Convert input audio to a single video frame, representing the audio frequency
spectrum.

The filter accepts the following options:

@table @option
@item size, s
Specify the video size for the output. For the syntax of this option, check the
@ref{video size syntax,,"Video size" section in the ffmpeg-utils manual,ffmpeg-utils}.
Default value is @code{4096x2048}.

@item mode
Specify display mode.

It accepts the following values:
@table @samp
@item combined
all channels are displayed in the same row
@item separate
all channels are displayed in separate rows
@end table
Default value is @samp{combined}.

@item color
Specify display color mode.

It accepts the following values:
@table @samp
@item channel
each channel is displayed in a separate color
@item intensity
each channel is displayed using the same color scheme
@item rainbow
each channel is displayed using the rainbow color scheme
@item moreland
each channel is displayed using the moreland color scheme
@item nebulae
each channel is displayed using the nebulae color scheme
@item fire
each channel is displayed using the fire color scheme
@item fiery
each channel is displayed using the fiery color scheme
@item fruit
each channel is displayed using the fruit color scheme
@item cool
each channel is displayed using the cool color scheme
@end table
Default value is @samp{intensity}.

@item scale
Specify scale used for calculating intensity color values.

It accepts the following values:
@table @samp
@item lin
linear
@item sqrt
square root, default
@item cbrt
cubic root
@item log
logarithmic
@item 4thrt
4th root
@item 5thrt
5th root
@end table
Default value is @samp{log}.

@item saturation
Set saturation modifier for displayed colors. Negative values provide
alternative color scheme. @code{0} is no saturation at all.
Saturation must be in [-10.0, 10.0] range.
Default value is @code{1}.

@item win_func
Set window function.

It accepts the following values:
@table @samp
@item rect
@item bartlett
@item hann
@item hanning
@item hamming
@item blackman
@item welch
@item flattop
@item bharris
@item bnuttall
@item bhann
@item sine
@item nuttall
@item lanczos
@item gauss
@item tukey
@item dolph
@item cauchy
@item parzen
@item poisson
@end table
Default value is @code{hann}.

@item orientation
Set orientation of time vs frequency axis. Can be @code{vertical} or
@code{horizontal}. Default is @code{vertical}.

@item gain
Set scale gain for calculating intensity color values.
Default value is @code{1}.

@item legend
Draw time and frequency axes and legends. Default is enabled.

@item rotation
Set color rotation, must be in [-1.0, 1.0] range.
Default value is @code{0}.
@end table

@subsection Examples

@itemize
@item
Extract an audio spectrogram of a whole audio track
in a 1024x1024 picture using @command{ffmpeg}:
@example
ffmpeg -i audio.flac -lavfi showspectrumpic=s=1024x1024 spectrogram.png
@end example
@end itemize

@section showvolume

Convert input audio volume to a video output.

The filter accepts the following options:

@table @option
@item rate, r
Set video rate.

@item b
Set border width, allowed range is [0, 5]. Default is 1.

@item w
Set channel width, allowed range is [80, 8192]. Default is 400.

@item h
Set channel height, allowed range is [1, 900]. Default is 20.

@item f
Set fade, allowed range is [0, 1]. Default is 0.95.

@item c
Set volume color expression.

The expression can use the following variables:

@table @option
@item VOLUME
Current max volume of channel in dB.

@item PEAK
Current peak.

@item CHANNEL
Current channel number, starting from 0.
@end table

@item t
If set, displays channel names. Default is enabled.

@item v
If set, displays volume values. Default is enabled.

@item o
Set orientation, can be horizontal: @code{h} or vertical: @code{v},
default is @code{h}.

@item s
Set step size, allowed range is [0, 5]. Default is 0, which means
step is disabled.

@item p
Set background opacity, allowed range is [0, 1]. Default is 0.

@item m
Set metering mode, can be peak: @code{p} or rms: @code{r},
default is @code{p}.

@item ds
Set display scale, can be linear: @code{lin} or log: @code{log},
default is @code{lin}.

@item dm
In second.
If set to > 0., display a line for the max level
in the previous seconds.
default is disabled: @code{0.}

@item dmc
The color of the max line. Use when @code{dm} option is set to > 0.
default is: @code{orange}
@end table

@section showwaves

Convert input audio to a video output, representing the samples waves.

The filter accepts the following options:

@table @option
@item size, s
Specify the video size for the output. For the syntax of this option, check the
@ref{video size syntax,,"Video size" section in the ffmpeg-utils manual,ffmpeg-utils}.
Default value is @code{600x240}.

@item mode
Set display mode.

Available values are:
@table @samp
@item point
Draw a point for each sample.

@item line
Draw a vertical line for each sample.

@item p2p
Draw a point for each sample and a line between them.

@item cline
Draw a centered vertical line for each sample.
@end table

Default value is @code{point}.

@item n
Set the number of samples which are printed on the same column. A
larger value will decrease the frame rate. Must be a positive
integer. This option can be set only if the value for @var{rate}
is not explicitly specified.

@item rate, r
Set the (approximate) output frame rate. This is done by setting the
option @var{n}. Default value is "25".

@item split_channels
Set if channels should be drawn separately or overlap. Default value is 0.

@item colors
Set colors separated by '|' which are going to be used for drawing of each channel.

@item scale
Set amplitude scale.

Available values are:
@table @samp
@item lin
Linear.

@item log
Logarithmic.

@item sqrt
Square root.

@item cbrt
Cubic root.
@end table

Default is linear.

@item draw
Set the draw mode. This is mostly useful to set for high @var{n}.

Available values are:
@table @samp
@item scale
Scale pixel values for each drawn sample.

@item full
Draw every sample directly.
@end table

Default value is @code{scale}.
@end table

@subsection Examples

@itemize
@item
Output the input file audio and the corresponding video representation
at the same time:
@example
amovie=a.mp3,asplit[out0],showwaves[out1]
@end example

@item
Create a synthetic signal and show it with showwaves, forcing a
frame rate of 30 frames per second:
@example
aevalsrc=sin(1*2*PI*t)*sin(880*2*PI*t):cos(2*PI*200*t),asplit[out0],showwaves=r=30[out1]
@end example
@end itemize

@section showwavespic

Convert input audio to a single video frame, representing the samples waves.

The filter accepts the following options:

@table @option
@item size, s
Specify the video size for the output. For the syntax of this option, check the
@ref{video size syntax,,"Video size" section in the ffmpeg-utils manual,ffmpeg-utils}.
Default value is @code{600x240}.

@item split_channels
Set if channels should be drawn separately or overlap. Default value is 0.

@item colors
Set colors separated by '|' which are going to be used for drawing of each channel.

@item scale
Set amplitude scale.

Available values are:
@table @samp
@item lin
Linear.

@item log
Logarithmic.

@item sqrt
Square root.

@item cbrt
Cubic root.
@end table

Default is linear.
@end table

@subsection Examples

@itemize
@item
Extract a channel split representation of the wave form of a whole audio track
in a 1024x800 picture using @command{ffmpeg}:
@example
ffmpeg -i audio.flac -lavfi showwavespic=split_channels=1:s=1024x800 waveform.png
@end example
@end itemize

@section sidedata, asidedata

Delete frame side data, or select frames based on it.

This filter accepts the following options:

@table @option
@item mode
Set mode of operation of the filter.

Can be one of the following:

@table @samp
@item select
Select every frame with side data of @code{type}.

@item delete
Delete side data of @code{type}. If @code{type} is not set, delete all side
data in the frame.

@end table

@item type
Set side data type used with all modes. Must be set for @code{select} mode. For
the list of frame side data types, refer to the @code{AVFrameSideDataType} enum
in @file{libavutil/frame.h}. For example, to choose
@code{AV_FRAME_DATA_PANSCAN} side data, you must specify @code{PANSCAN}.

@end table

@section spectrumsynth

Sythesize audio from 2 input video spectrums, first input stream represents
magnitude across time and second represents phase across time.
The filter will transform from frequency domain as displayed in videos back
to time domain as presented in audio output.

This filter is primarily created for reversing processed @ref{showspectrum}
filter outputs, but can synthesize sound from other spectrograms too.
But in such case results are going to be poor if the phase data is not
available, because in such cases phase data need to be recreated, usually
its just recreated from random noise.
For best results use gray only output (@code{channel} color mode in
@ref{showspectrum} filter) and @code{log} scale for magnitude video and
@code{lin} scale for phase video. To produce phase, for 2nd video, use
@code{data} option. Inputs videos should generally use @code{fullframe}
slide mode as that saves resources needed for decoding video.

The filter accepts the following options:

@table @option
@item sample_rate
Specify sample rate of output audio, the sample rate of audio from which
spectrum was generated may differ.

@item channels
Set number of channels represented in input video spectrums.

@item scale
Set scale which was used when generating magnitude input spectrum.
Can be @code{lin} or @code{log}. Default is @code{log}.

@item slide
Set slide which was used when generating inputs spectrums.
Can be @code{replace}, @code{scroll}, @code{fullframe} or @code{rscroll}.
Default is @code{fullframe}.

@item win_func
Set window function used for resynthesis.

@item overlap
Set window overlap. In range @code{[0, 1]}. Default is @code{1},
which means optimal overlap for selected window function will be picked.

@item orientation
Set orientation of input videos. Can be @code{vertical} or @code{horizontal}.
Default is @code{vertical}.
@end table

@subsection Examples

@itemize
@item
First create magnitude and phase videos from audio, assuming audio is stereo with 44100 sample rate,
then resynthesize videos back to audio with spectrumsynth:
@example
ffmpeg -i input.flac -lavfi showspectrum=mode=separate:scale=log:overlap=0.875:color=channel:slide=fullframe:data=magnitude -an -c:v rawvideo magnitude.nut
ffmpeg -i input.flac -lavfi showspectrum=mode=separate:scale=lin:overlap=0.875:color=channel:slide=fullframe:data=phase -an -c:v rawvideo phase.nut
ffmpeg -i magnitude.nut -i phase.nut -lavfi spectrumsynth=channels=2:sample_rate=44100:win_func=hann:overlap=0.875:slide=fullframe output.flac
@end example
@end itemize

@section split, asplit

Split input into several identical outputs.

@code{asplit} works with audio input, @code{split} with video.

The filter accepts a single parameter which specifies the number of outputs. If
unspecified, it defaults to 2.

@subsection Examples

@itemize
@item
Create two separate outputs from the same input:
@example
[in] split [out0][out1]
@end example

@item
To create 3 or more outputs, you need to specify the number of
outputs, like in:
@example
[in] asplit=3 [out0][out1][out2]
@end example

@item
Create two separate outputs from the same input, one cropped and
one padded:
@example
[in] split [splitout1][splitout2];
[splitout1] crop=100:100:0:0    [cropout];
[splitout2] pad=200:200:100:100 [padout];
@end example

@item
Create 5 copies of the input audio with @command{ffmpeg}:
@example
ffmpeg -i INPUT -filter_complex asplit=5 OUTPUT
@end example
@end itemize

@section zmq, azmq

Receive commands sent through a libzmq client, and forward them to
filters in the filtergraph.

@code{zmq} and @code{azmq} work as a pass-through filters. @code{zmq}
must be inserted between two video filters, @code{azmq} between two
audio filters. Both are capable to send messages to any filter type.

To enable these filters you need to install the libzmq library and
headers and configure FFmpeg with @code{--enable-libzmq}.

For more information about libzmq see:
@url{http://www.zeromq.org/}

The @code{zmq} and @code{azmq} filters work as a libzmq server, which
receives messages sent through a network interface defined by the
@option{bind_address} (or the abbreviation "@option{b}") option.
Default value of this option is @file{tcp://localhost:5555}. You may
want to alter this value to your needs, but do not forget to escape any
':' signs (see @ref{filtergraph escaping}).

The received message must be in the form:
@example
@var{TARGET} @var{COMMAND} [@var{ARG}]
@end example

@var{TARGET} specifies the target of the command, usually the name of
the filter class or a specific filter instance name. The default
filter instance name uses the pattern @samp{Parsed_<filter_name>_<index>},
but you can override this by using the @samp{filter_name@@id} syntax
(see @ref{Filtergraph syntax}).

@var{COMMAND} specifies the name of the command for the target filter.

@var{ARG} is optional and specifies the optional argument list for the
given @var{COMMAND}.

Upon reception, the message is processed and the corresponding command
is injected into the filtergraph. Depending on the result, the filter
will send a reply to the client, adopting the format:
@example
@var{ERROR_CODE} @var{ERROR_REASON}
@var{MESSAGE}
@end example

@var{MESSAGE} is optional.

@subsection Examples

Look at @file{tools/zmqsend} for an example of a zmq client which can
be used to send commands processed by these filters.

Consider the following filtergraph generated by @command{ffplay}.
In this example the last overlay filter has an instance name. All other
filters will have default instance names.

@example
ffplay -dumpgraph 1 -f lavfi "
color=s=100x100:c=red  [l];
color=s=100x100:c=blue [r];
nullsrc=s=200x100, zmq [bg];
[bg][l]   overlay     [bg+l];
[bg+l][r] overlay@@my=x=100 "
@end example

To change the color of the left side of the video, the following
command can be used:
@example
echo Parsed_color_0 c yellow | tools/zmqsend
@end example

To change the right side:
@example
echo Parsed_color_1 c pink | tools/zmqsend
@end example

To change the position of the right side:
@example
echo overlay@@my x 150 | tools/zmqsend
@end example


@c man end MULTIMEDIA FILTERS

@chapter Multimedia Sources
@c man begin MULTIMEDIA SOURCES

Below is a description of the currently available multimedia sources.

@section amovie

This is the same as @ref{movie} source, except it selects an audio
stream by default.

@anchor{movie}
@section movie

Read audio and/or video stream(s) from a movie container.

It accepts the following parameters:

@table @option
@item filename
The name of the resource to read (not necessarily a file; it can also be a
device or a stream accessed through some protocol).

@item format_name, f
Specifies the format assumed for the movie to read, and can be either
the name of a container or an input device. If not specified, the
format is guessed from @var{movie_name} or by probing.

@item seek_point, sp
Specifies the seek point in seconds. The frames will be output
starting from this seek point. The parameter is evaluated with
@code{av_strtod}, so the numerical value may be suffixed by an IS
postfix. The default value is "0".

@item streams, s
Specifies the streams to read. Several streams can be specified,
separated by "+". The source will then have as many outputs, in the
same order. The syntax is explained in the @ref{Stream specifiers,,"Stream specifiers"
section in the ffmpeg manual,ffmpeg}. Two special names, "dv" and "da" specify
respectively the default (best suited) video and audio stream. Default
is "dv", or "da" if the filter is called as "amovie".

@item stream_index, si
Specifies the index of the video stream to read. If the value is -1,
the most suitable video stream will be automatically selected. The default
value is "-1". Deprecated. If the filter is called "amovie", it will select
audio instead of video.

@item loop
Specifies how many times to read the stream in sequence.
If the value is 0, the stream will be looped infinitely.
Default value is "1".

Note that when the movie is looped the source timestamps are not
changed, so it will generate non monotonically increasing timestamps.

@item discontinuity
Specifies the time difference between frames above which the point is
considered a timestamp discontinuity which is removed by adjusting the later
timestamps.
@end table

It allows overlaying a second video on top of the main input of
a filtergraph, as shown in this graph:
@example
input -----------> deltapts0 --> overlay --> output
                                    ^
                                    |
movie --> scale--> deltapts1 -------+
@end example
@subsection Examples

@itemize
@item
Skip 3.2 seconds from the start of the AVI file in.avi, and overlay it
on top of the input labelled "in":
@example
movie=in.avi:seek_point=3.2, scale=180:-1, setpts=PTS-STARTPTS [over];
[in] setpts=PTS-STARTPTS [main];
[main][over] overlay=16:16 [out]
@end example

@item
Read from a video4linux2 device, and overlay it on top of the input
labelled "in":
@example
movie=/dev/video0:f=video4linux2, scale=180:-1, setpts=PTS-STARTPTS [over];
[in] setpts=PTS-STARTPTS [main];
[main][over] overlay=16:16 [out]
@end example

@item
Read the first video stream and the audio stream with id 0x81 from
dvd.vob; the video is connected to the pad named "video" and the audio is
connected to the pad named "audio":
@example
movie=dvd.vob:s=v:0+#0x81 [video] [audio]
@end example
@end itemize

@subsection Commands

Both movie and amovie support the following commands:
@table @option
@item seek
Perform seek using "av_seek_frame".
The syntax is: seek @var{stream_index}|@var{timestamp}|@var{flags}
@itemize
@item
@var{stream_index}: If stream_index is -1, a default
stream is selected, and @var{timestamp} is automatically converted
from AV_TIME_BASE units to the stream specific time_base.
@item
@var{timestamp}: Timestamp in AVStream.time_base units
or, if no stream is specified, in AV_TIME_BASE units.
@item
@var{flags}: Flags which select direction and seeking mode.
@end itemize

@item get_duration
Get movie duration in AV_TIME_BASE units.

@end table

@c man end MULTIMEDIA SOURCES
