@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
@samp{'} and @samp{\} 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 @samp{\}.

@item
All characters enclosed between @samp{''} are included literally in the
parsed string. The quote character @samp{'} 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 @samp{\} 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
@item 2kdci
2048x1080
@item 4kdci
4096x2160
@item uhd2160
3840x2160
@item uhd4320
7680x4320
@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 clip(x, min, max)
Return the value of @var{x} clipped between @var{min} and @var{max}.

@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)
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)
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 EXPRESSION EVALUATION

@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
