@chapter Syntax
@c man begin SYNTAX

This section documents the syntax and formats employed by the FFmpeg
libraries and tools.

@anchor{quoting_and_escaping}
@section Quoting and escaping

FFmpeg adopts the following quoting and escaping mechanism, unless
explicitly specified. The following rules are applied:

@itemize
@item
@code{'} and @code{\} are special characters (respectively used for
quoting and escaping). In addition to them, there might be other
special characters depending on the specific syntax where the escaping
and quoting are employed.

@item
A special character is escaped by prefixing it with a '\'.

@item
All characters enclosed between '' are included literally in the
parsed string. The quote character @code{'} itself cannot be quoted,
so you may need to close the quote and escape it.

@item
Leading and trailing whitespaces, unless escaped or quoted, are
removed from the parsed string.
@end itemize

Note that you may need to add a second level of escaping when using
the command line or a script, which depends on the syntax of the
adopted shell language.

The function @code{av_get_token} defined in
@file{libavutil/avstring.h} can be used to parse a token quoted or
escaped according to the rules defined above.

The tool @file{tools/ffescape} in the FFmpeg source tree can be used
to automatically quote or escape a string in a script.

@subsection Examples

@itemize
@item
Escape the string @code{Crime d'Amour} containing the @code{'} special
character:
@example
Crime d\'Amour
@end example

@item
The string above contains a quote, so the @code{'} needs to be escaped
when quoting it:
@example
'Crime d'\''Amour'
@end example

@item
Include leading or trailing whitespaces using quoting:
@example
'  this string starts and ends with whitespaces  '
@end example

@item
Escaping and quoting can be mixed together:
@example
' The string '\'string\'' is a string '
@end example

@item
To include a literal @code{\} you can use either escaping or quoting:
@example
'c:\foo' can be written as c:\\foo
@end example
@end itemize

@anchor{date syntax}
@section Date

The accepted syntax is:
@example
[(YYYY-MM-DD|YYYYMMDD)[T|t| ]]((HH:MM:SS[.m...]]])|(HHMMSS[.m...]]]))[Z]
now
@end example

If the value is "now" it takes the current time.

Time is local time unless Z is appended, in which case it is
interpreted as UTC.
If the year-month-day part is not specified it takes the current
year-month-day.

@anchor{time duration syntax}
@section Time duration

There are two accepted syntaxes for expressing time duration.

@example
[-][@var{HH}:]@var{MM}:@var{SS}[.@var{m}...]
@end example

@var{HH} expresses the number of hours, @var{MM} the number of minutes
for a maximum of 2 digits, and @var{SS} the number of seconds for a
maximum of 2 digits. The @var{m} at the end expresses decimal value for
@var{SS}.

@emph{or}

@example
[-]@var{S}+[.@var{m}...]
@end example

@var{S} expresses the number of seconds, with the optional decimal part
@var{m}.

In both expressions, the optional @samp{-} indicates negative duration.

@subsection Examples

The following examples are all valid time duration:

@table @samp
@item 55
55 seconds

@item 12:03:45
12 hours, 03 minutes and 45 seconds

@item 23.189
23.189 seconds
@end table

@anchor{video size syntax}
@section Video size
Specify the size of the sourced video, it may be a string of the form
@var{width}x@var{height}, or the name of a size abbreviation.

The following abbreviations are recognized:
@table @samp
@item ntsc
720x480
@item pal
720x576
@item qntsc
352x240
@item qpal
352x288
@item sntsc
640x480
@item spal
768x576
@item film
352x240
@item ntsc-film
352x240
@item sqcif
128x96
@item qcif
176x144
@item cif
352x288
@item 4cif
704x576
@item 16cif
1408x1152
@item qqvga
160x120
@item qvga
320x240
@item vga
640x480
@item svga
800x600
@item xga
1024x768
@item uxga
1600x1200
@item qxga
2048x1536
@item sxga
1280x1024
@item qsxga
2560x2048
@item hsxga
5120x4096
@item wvga
852x480
@item wxga
1366x768
@item wsxga
1600x1024
@item wuxga
1920x1200
@item woxga
2560x1600
@item wqsxga
3200x2048
@item wquxga
3840x2400
@item whsxga
6400x4096
@item whuxga
7680x4800
@item cga
320x200
@item ega
640x350
@item hd480
852x480
@item hd720
1280x720
@item hd1080
1920x1080
@item 2k
2048x1080
@item 2kflat
1998x1080
@item 2kscope
2048x858
@item 4k
4096x2160
@item 4kflat
3996x2160
@item 4kscope
4096x1716
@item nhd
640x360
@item hqvga
240x160
@item wqvga
400x240
@item fwqvga
432x240
@item hvga
480x320
@item qhd
960x540
@end table

@anchor{video rate syntax}
@section Video rate

Specify the frame rate of a video, expressed 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 float
number or a valid video frame rate abbreviation.

The following abbreviations are recognized:
@table @samp
@item ntsc
30000/1001
@item pal
25/1
@item qntsc
30000/1001
@item qpal
25/1
@item sntsc
30000/1001
@item spal
25/1
@item film
24/1
@item ntsc-film
24000/1001
@end table

@anchor{ratio syntax}
@section Ratio

A ratio can be expressed as an expression, or in the form
@var{numerator}:@var{denominator}.

Note that a ratio with infinite (1/0) or negative value is
considered valid, so you should check on the returned value if you
want to exclude those values.

The undefined value can be expressed using the "0:0" string.

@anchor{color syntax}
@section Color

It can be the name of a color as defined below (case insensitive match) or a
@code{[0x|#]RRGGBB[AA]} sequence, possibly followed by @@ and a string
representing the alpha component.

The alpha component may be a string composed by "0x" followed by an
hexadecimal number or a decimal number between 0.0 and 1.0, which
represents the opacity value (@samp{0x00} or @samp{0.0} means completely
transparent, @samp{0xff} or @samp{1.0} completely opaque). If the alpha
component is not specified then @samp{0xff} is assumed.

The string @samp{random} will result in a random color.

The following names of colors are recognized:
@table @samp
@item AliceBlue
0xF0F8FF
@item AntiqueWhite
0xFAEBD7
@item Aqua
0x00FFFF
@item Aquamarine
0x7FFFD4
@item Azure
0xF0FFFF
@item Beige
0xF5F5DC
@item Bisque
0xFFE4C4
@item Black
0x000000
@item BlanchedAlmond
0xFFEBCD
@item Blue
0x0000FF
@item BlueViolet
0x8A2BE2
@item Brown
0xA52A2A
@item BurlyWood
0xDEB887
@item CadetBlue
0x5F9EA0
@item Chartreuse
0x7FFF00
@item Chocolate
0xD2691E
@item Coral
0xFF7F50
@item CornflowerBlue
0x6495ED
@item Cornsilk
0xFFF8DC
@item Crimson
0xDC143C
@item Cyan
0x00FFFF
@item DarkBlue
0x00008B
@item DarkCyan
0x008B8B
@item DarkGoldenRod
0xB8860B
@item DarkGray
0xA9A9A9
@item DarkGreen
0x006400
@item DarkKhaki
0xBDB76B
@item DarkMagenta
0x8B008B
@item DarkOliveGreen
0x556B2F
@item Darkorange
0xFF8C00
@item DarkOrchid
0x9932CC
@item DarkRed
0x8B0000
@item DarkSalmon
0xE9967A
@item DarkSeaGreen
0x8FBC8F
@item DarkSlateBlue
0x483D8B
@item DarkSlateGray
0x2F4F4F
@item DarkTurquoise
0x00CED1
@item DarkViolet
0x9400D3
@item DeepPink
0xFF1493
@item DeepSkyBlue
0x00BFFF
@item DimGray
0x696969
@item DodgerBlue
0x1E90FF
@item FireBrick
0xB22222
@item FloralWhite
0xFFFAF0
@item ForestGreen
0x228B22
@item Fuchsia
0xFF00FF
@item Gainsboro
0xDCDCDC
@item GhostWhite
0xF8F8FF
@item Gold
0xFFD700
@item GoldenRod
0xDAA520
@item Gray
0x808080
@item Green
0x008000
@item GreenYellow
0xADFF2F
@item HoneyDew
0xF0FFF0
@item HotPink
0xFF69B4
@item IndianRed
0xCD5C5C
@item Indigo
0x4B0082
@item Ivory
0xFFFFF0
@item Khaki
0xF0E68C
@item Lavender
0xE6E6FA
@item LavenderBlush
0xFFF0F5
@item LawnGreen
0x7CFC00
@item LemonChiffon
0xFFFACD
@item LightBlue
0xADD8E6
@item LightCoral
0xF08080
@item LightCyan
0xE0FFFF
@item LightGoldenRodYellow
0xFAFAD2
@item LightGreen
0x90EE90
@item LightGrey
0xD3D3D3
@item LightPink
0xFFB6C1
@item LightSalmon
0xFFA07A
@item LightSeaGreen
0x20B2AA
@item LightSkyBlue
0x87CEFA
@item LightSlateGray
0x778899
@item LightSteelBlue
0xB0C4DE
@item LightYellow
0xFFFFE0
@item Lime
0x00FF00
@item LimeGreen
0x32CD32
@item Linen
0xFAF0E6
@item Magenta
0xFF00FF
@item Maroon
0x800000
@item MediumAquaMarine
0x66CDAA
@item MediumBlue
0x0000CD
@item MediumOrchid
0xBA55D3
@item MediumPurple
0x9370D8
@item MediumSeaGreen
0x3CB371
@item MediumSlateBlue
0x7B68EE
@item MediumSpringGreen
0x00FA9A
@item MediumTurquoise
0x48D1CC
@item MediumVioletRed
0xC71585
@item MidnightBlue
0x191970
@item MintCream
0xF5FFFA
@item MistyRose
0xFFE4E1
@item Moccasin
0xFFE4B5
@item NavajoWhite
0xFFDEAD
@item Navy
0x000080
@item OldLace
0xFDF5E6
@item Olive
0x808000
@item OliveDrab
0x6B8E23
@item Orange
0xFFA500
@item OrangeRed
0xFF4500
@item Orchid
0xDA70D6
@item PaleGoldenRod
0xEEE8AA
@item PaleGreen
0x98FB98
@item PaleTurquoise
0xAFEEEE
@item PaleVioletRed
0xD87093
@item PapayaWhip
0xFFEFD5
@item PeachPuff
0xFFDAB9
@item Peru
0xCD853F
@item Pink
0xFFC0CB
@item Plum
0xDDA0DD
@item PowderBlue
0xB0E0E6
@item Purple
0x800080
@item Red
0xFF0000
@item RosyBrown
0xBC8F8F
@item RoyalBlue
0x4169E1
@item SaddleBrown
0x8B4513
@item Salmon
0xFA8072
@item SandyBrown
0xF4A460
@item SeaGreen
0x2E8B57
@item SeaShell
0xFFF5EE
@item Sienna
0xA0522D
@item Silver
0xC0C0C0
@item SkyBlue
0x87CEEB
@item SlateBlue
0x6A5ACD
@item SlateGray
0x708090
@item Snow
0xFFFAFA
@item SpringGreen
0x00FF7F
@item SteelBlue
0x4682B4
@item Tan
0xD2B48C
@item Teal
0x008080
@item Thistle
0xD8BFD8
@item Tomato
0xFF6347
@item Turquoise
0x40E0D0
@item Violet
0xEE82EE
@item Wheat
0xF5DEB3
@item White
0xFFFFFF
@item WhiteSmoke
0xF5F5F5
@item Yellow
0xFFFF00
@item YellowGreen
0x9ACD32
@end table

@anchor{channel layout syntax}
@section Channel Layout

A channel layout specifies the spatial disposition of the channels in
a multi-channel audio stream. To specify a channel layout, FFmpeg
makes use of a special syntax.

Individual channels are identified by an id, as given by the table
below:
@table @samp
@item FL
front left
@item FR
front right
@item FC
front center
@item LFE
low frequency
@item BL
back left
@item BR
back right
@item FLC
front left-of-center
@item FRC
front right-of-center
@item BC
back center
@item SL
side left
@item SR
side right
@item TC
top center
@item TFL
top front left
@item TFC
top front center
@item TFR
top front right
@item TBL
top back left
@item TBC
top back center
@item TBR
top back right
@item DL
downmix left
@item DR
downmix right
@item WL
wide left
@item WR
wide right
@item SDL
surround direct left
@item SDR
surround direct right
@item LFE2
low frequency 2
@end table

Standard channel layout compositions can be specified by using the
following identifiers:
@table @samp
@item mono
FC
@item stereo
FL+FR
@item 2.1
FL+FR+LFE
@item 3.0
FL+FR+FC
@item 3.0(back)
FL+FR+BC
@item 4.0
FL+FR+FC+BC
@item quad
FL+FR+BL+BR
@item quad(side)
FL+FR+SL+SR
@item 3.1
FL+FR+FC+LFE
@item 5.0
FL+FR+FC+BL+BR
@item 5.0(side)
FL+FR+FC+SL+SR
@item 4.1
FL+FR+FC+LFE+BC
@item 5.1
FL+FR+FC+LFE+BL+BR
@item 5.1(side)
FL+FR+FC+LFE+SL+SR
@item 6.0
FL+FR+FC+BC+SL+SR
@item 6.0(front)
FL+FR+FLC+FRC+SL+SR
@item hexagonal
FL+FR+FC+BL+BR+BC
@item 6.1
FL+FR+FC+LFE+BC+SL+SR
@item 6.1
FL+FR+FC+LFE+BL+BR+BC
@item 6.1(front)
FL+FR+LFE+FLC+FRC+SL+SR
@item 7.0
FL+FR+FC+BL+BR+SL+SR
@item 7.0(front)
FL+FR+FC+FLC+FRC+SL+SR
@item 7.1
FL+FR+FC+LFE+BL+BR+SL+SR
@item 7.1(wide)
FL+FR+FC+LFE+BL+BR+FLC+FRC
@item 7.1(wide-side)
FL+FR+FC+LFE+FLC+FRC+SL+SR
@item octagonal
FL+FR+FC+BL+BR+BC+SL+SR
@item downmix
DL+DR
@end table

A custom channel layout can be specified as a sequence of terms, separated by
'+' or '|'. Each term can be:
@itemize
@item
the name of a standard channel layout (e.g. @samp{mono},
@samp{stereo}, @samp{4.0}, @samp{quad}, @samp{5.0}, etc.)

@item
the name of a single channel (e.g. @samp{FL}, @samp{FR}, @samp{FC}, @samp{LFE}, etc.)

@item
a number of channels, in decimal, optionally followed by 'c', yielding
the default channel layout for that number of channels (see the
function @code{av_get_default_channel_layout})

@item
a channel layout mask, in hexadecimal starting with "0x" (see the
@code{AV_CH_*} macros in @file{libavutil/channel_layout.h}.
@end itemize

Starting from libavutil version 53 the trailing character "c" to
specify a number of channels will be required, while a channel layout
mask could also be specified as a decimal number (if and only if not
followed by "c").

See also the function @code{av_get_channel_layout} defined in
@file{libavutil/channel_layout.h}.
@c man end SYNTAX

@chapter Expression Evaluation
@c man begin EXPRESSION EVALUATION

When evaluating an arithmetic expression, FFmpeg uses an internal
formula evaluator, implemented through the @file{libavutil/eval.h}
interface.

An expression may contain unary, binary operators, constants, and
functions.

Two expressions @var{expr1} and @var{expr2} can be combined to form
another expression "@var{expr1};@var{expr2}".
@var{expr1} and @var{expr2} are evaluated in turn, and the new
expression evaluates to the value of @var{expr2}.

The following binary operators are available: @code{+}, @code{-},
@code{*}, @code{/}, @code{^}.

The following unary operators are available: @code{+}, @code{-}.

The following functions are available:
@table @option
@item abs(x)
Compute absolute value of @var{x}.

@item acos(x)
Compute arccosine of @var{x}.

@item asin(x)
Compute arcsine of @var{x}.

@item atan(x)
Compute arctangent of @var{x}.

@item between(x, min, max)
Return 1 if @var{x} is greater than or equal to @var{min} and lesser than or
equal to @var{max}, 0 otherwise.

@item bitand(x, y)
@item bitor(x, y)
Compute bitwise and/or operation on @var{x} and @var{y}.

The results of the evaluation of @var{x} and @var{y} are converted to
integers before executing the bitwise operation.

Note that both the conversion to integer and the conversion back to
floating point can lose precision. Beware of unexpected results for
large numbers (usually 2^53 and larger).

@item ceil(expr)
Round the value of expression @var{expr} upwards to the nearest
integer. For example, "ceil(1.5)" is "2.0".

@item cos(x)
Compute cosine of @var{x}.

@item cosh(x)
Compute hyperbolic cosine of @var{x}.

@item eq(x, y)
Return 1 if @var{x} and @var{y} are equivalent, 0 otherwise.

@item exp(x)
Compute exponential of @var{x} (with base @code{e}, the Euler's number).

@item floor(expr)
Round the value of expression @var{expr} downwards to the nearest
integer. For example, "floor(-1.5)" is "-2.0".

@item gauss(x)
Compute Gauss function of @var{x}, corresponding to
@code{exp(-x*x/2) / sqrt(2*PI)}.

@item gcd(x, y)
Return the greatest common divisor of @var{x} and @var{y}. If both @var{x} and
@var{y} are 0 or either or both are less than zero then behavior is undefined.

@item gt(x, y)
Return 1 if @var{x} is greater than @var{y}, 0 otherwise.

@item gte(x, y)
Return 1 if @var{x} is greater than or equal to @var{y}, 0 otherwise.

@item hypot(x, y)
This function is similar to the C function with the same name; it returns
"sqrt(@var{x}*@var{x} + @var{y}*@var{y})", the length of the hypotenuse of a
right triangle with sides of length @var{x} and @var{y}, or the distance of the
point (@var{x}, @var{y}) from the origin.

@item if(x, y)
Evaluate @var{x}, and if the result is non-zero return the result of
the evaluation of @var{y}, return 0 otherwise.

@item if(x, y, z)
Evaluate @var{x}, and if the result is non-zero return the evaluation
result of @var{y}, otherwise the evaluation result of @var{z}.

@item ifnot(x, y)
Evaluate @var{x}, and if the result is zero return the result of the
evaluation of @var{y}, return 0 otherwise.

@item ifnot(x, y, z)
Evaluate @var{x}, and if the result is zero return the evaluation
result of @var{y}, otherwise the evaluation result of @var{z}.

@item isinf(x)
Return 1.0 if @var{x} is +/-INFINITY, 0.0 otherwise.

@item isnan(x)
Return 1.0 if @var{x} is NAN, 0.0 otherwise.

@item ld(var)
Allow to load the value of the internal variable with number
@var{var}, which was previously stored with st(@var{var}, @var{expr}).
The function returns the loaded value.

@item log(x)
Compute natural logarithm of @var{x}.

@item lt(x, y)
Return 1 if @var{x} is lesser than @var{y}, 0 otherwise.

@item lte(x, y)
Return 1 if @var{x} is lesser than or equal to @var{y}, 0 otherwise.

@item max(x, y)
Return the maximum between @var{x} and @var{y}.

@item min(x, y)
Return the maximum between @var{x} and @var{y}.

@item mod(x, y)
Compute the remainder of division of @var{x} by @var{y}.

@item not(expr)
Return 1.0 if @var{expr} is zero, 0.0 otherwise.

@item pow(x, y)
Compute the power of @var{x} elevated @var{y}, it is equivalent to
"(@var{x})^(@var{y})".

@item print(t)
@item print(t, l)
Print the value of expression @var{t} with loglevel @var{l}. If
@var{l} is not specified then a default log level is used.
Returns the value of the expression printed.

Prints t with loglevel l

@item random(x)
Return a pseudo random value between 0.0 and 1.0. @var{x} is the index of the
internal variable which will be used to save the seed/state.

@item root(expr, max)
Find an input value for which the function represented by @var{expr}
with argument @var{ld(0)} is 0 in the interval 0..@var{max}.

The expression in @var{expr} must denote a continuous function or the
result is undefined.

@var{ld(0)} is used to represent the function input value, which means
that the given expression will be evaluated multiple times with
various input values that the expression can access through
@code{ld(0)}. When the expression evaluates to 0 then the
corresponding input value will be returned.

@item sin(x)
Compute sine of @var{x}.

@item sinh(x)
Compute hyperbolic sine of @var{x}.

@item sqrt(expr)
Compute the square root of @var{expr}. This is equivalent to
"(@var{expr})^.5".

@item squish(x)
Compute expression @code{1/(1 + exp(4*x))}.

@item st(var, expr)
Allow to store the value of the expression @var{expr} in an internal
variable. @var{var} specifies the number of the variable where to
store the value, and it is a value ranging from 0 to 9. The function
returns the value stored in the internal variable.
Note, Variables are currently not shared between expressions.

@item tan(x)
Compute tangent of @var{x}.

@item tanh(x)
Compute hyperbolic tangent of @var{x}.

@item taylor(expr, x)
@item taylor(expr, x, id)
Evaluate a Taylor series at @var{x}, given an expression representing
the @code{ld(id)}-th derivative of a function at 0.

When the series does not converge the result is undefined.

@var{ld(id)} is used to represent the derivative order in @var{expr},
which means that the given expression will be evaluated multiple times
with various input values that the expression can access through
@code{ld(id)}. If @var{id} is not specified then 0 is assumed.

Note, when you have the derivatives at y instead of 0,
@code{taylor(expr, x-y)} can be used.

@item time(0)
Return the current (wallclock) time in seconds.

@item trunc(expr)
Round the value of expression @var{expr} towards zero to the nearest
integer. For example, "trunc(-1.5)" is "-1.0".

@item while(cond, expr)
Evaluate expression @var{expr} while the expression @var{cond} is
non-zero, and returns the value of the last @var{expr} evaluation, or
NAN if @var{cond} was always false.
@end table

The following constants are available:
@table @option
@item PI
area of the unit disc, approximately 3.14
@item E
exp(1) (Euler's number), approximately 2.718
@item PHI
golden ratio (1+sqrt(5))/2, approximately 1.618
@end table

Assuming that an expression is considered "true" if it has a non-zero
value, note that:

@code{*} works like AND

@code{+} works like OR

For example the construct:
@example
if (A AND B) then C
@end example
is equivalent to:
@example
if(A*B, C)
@end example

In your C code, you can extend the list of unary and binary functions,
and define recognized constants, so that they are available for your
expressions.

The evaluator also recognizes the International System unit prefixes.
If 'i' is appended after the prefix, binary prefixes are used, which
are based on powers of 1024 instead of powers of 1000.
The 'B' postfix multiplies the value by 8, and can be appended after a
unit prefix or used alone. This allows using for example 'KB', 'MiB',
'G' and 'B' as number postfix.

The list of available International System prefixes follows, with
indication of the corresponding powers of 10 and of 2.
@table @option
@item y
10^-24 / 2^-80
@item z
10^-21 / 2^-70
@item a
10^-18 / 2^-60
@item f
10^-15 / 2^-50
@item p
10^-12 / 2^-40
@item n
10^-9 / 2^-30
@item u
10^-6 / 2^-20
@item m
10^-3 / 2^-10
@item c
10^-2
@item d
10^-1
@item h
10^2
@item k
10^3 / 2^10
@item K
10^3 / 2^10
@item M
10^6 / 2^20
@item G
10^9 / 2^30
@item T
10^12 / 2^40
@item P
10^15 / 2^40
@item E
10^18 / 2^50
@item Z
10^21 / 2^60
@item Y
10^24 / 2^70
@end table

@c man end

@chapter OpenCL Options
@c man begin OPENCL OPTIONS

When FFmpeg is configured with @code{--enable-opencl}, it is possible
to set the options for the global OpenCL context.

The list of supported options follows:

@table @option
@item build_options
Set build options used to compile the registered kernels.

See reference "OpenCL Specification Version: 1.2 chapter 5.6.4".

@item platform_idx
Select the index of the platform to run OpenCL code.

The specified index must be one of the indexes in the device list
which can be obtained with @code{ffmpeg -opencl_bench} or @code{av_opencl_get_device_list()}.

@item device_idx
Select the index of the device used to run OpenCL code.

The specified index must be one of the indexes in the device list which
can be obtained with @code{ffmpeg -opencl_bench} or @code{av_opencl_get_device_list()}.

@end table

@c man end OPENCL OPTIONS
