1 @chapter Expression Evaluation
2 @c man begin EXPRESSION EVALUATION
4 When evaluating an arithmetic expression, FFmpeg uses an internal
5 formula evaluator, implemented through the @file{libavutil/eval.h}
8 An expression may contain unary, binary operators, constants, and
11 Two expressions @var{expr1} and @var{expr2} can be combined to form
12 another expression "@var{expr1};@var{expr2}".
13 @var{expr1} and @var{expr2} are evaluated in turn, and the new
14 expression evaluates to the value of @var{expr2}.
16 The following binary operators are available: @code{+}, @code{-},
17 @code{*}, @code{/}, @code{^}.
19 The following unary operators are available: @code{+}, @code{-}.
21 The following functions are available:
24 Compute absolute value of @var{x}.
27 Compute arccosine of @var{x}.
30 Compute arcsine of @var{x}.
33 Compute arctangent of @var{x}.
35 @item between(x, min, max)
36 Return 1 if @var{x} is greater than or equal to @var{min} and lesser than or
37 equal to @var{max}, 0 otherwise.
41 Compute bitwise and/or operation on @var{x} and @var{y}.
43 The results of the evaluation of @var{x} and @var{y} are converted to
44 integers before executing the bitwise operation.
46 Note that both the conversion to integer and the conversion back to
47 floating point can lose precision. Beware of unexpected results for
48 large numbers (usually 2^53 and larger).
51 Round the value of expression @var{expr} upwards to the nearest
52 integer. For example, "ceil(1.5)" is "2.0".
55 Compute cosine of @var{x}.
58 Compute hyperbolic cosine of @var{x}.
61 Return 1 if @var{x} and @var{y} are equivalent, 0 otherwise.
64 Compute exponential of @var{x} (with base @code{e}, the Euler's number).
67 Round the value of expression @var{expr} downwards to the nearest
68 integer. For example, "floor(-1.5)" is "-2.0".
71 Compute Gauss function of @var{x}, corresponding to
72 @code{exp(-x*x/2) / sqrt(2*PI)}.
75 Return the greatest common divisor of @var{x} and @var{y}. If both @var{x} and
76 @var{y} are 0 or either or both are less than zero then behavior is undefined.
79 Return 1 if @var{x} is greater than @var{y}, 0 otherwise.
82 Return 1 if @var{x} is greater than or equal to @var{y}, 0 otherwise.
85 This function is similar to the C function with the same name; it returns
86 "sqrt(@var{x}*@var{x} + @var{y}*@var{y})", the length of the hypotenuse of a
87 right triangle with sides of length @var{x} and @var{y}, or the distance of the
88 point (@var{x}, @var{y}) from the origin.
91 Evaluate @var{x}, and if the result is non-zero return the result of
92 the evaluation of @var{y}, return 0 otherwise.
95 Evaluate @var{x}, and if the result is non-zero return the evaluation
96 result of @var{y}, otherwise the evaluation result of @var{z}.
99 Evaluate @var{x}, and if the result is zero return the result of the
100 evaluation of @var{y}, return 0 otherwise.
103 Evaluate @var{x}, and if the result is zero return the evaluation
104 result of @var{y}, otherwise the evaluation result of @var{z}.
107 Return 1.0 if @var{x} is +/-INFINITY, 0.0 otherwise.
110 Return 1.0 if @var{x} is NAN, 0.0 otherwise.
113 Allow to load the value of the internal variable with number
114 @var{var}, which was previously stored with st(@var{var}, @var{expr}).
115 The function returns the loaded value.
118 Compute natural logarithm of @var{x}.
121 Return 1 if @var{x} is lesser than @var{y}, 0 otherwise.
124 Return 1 if @var{x} is lesser than or equal to @var{y}, 0 otherwise.
127 Return the maximum between @var{x} and @var{y}.
130 Return the maximum between @var{x} and @var{y}.
133 Compute the remainder of division of @var{x} by @var{y}.
136 Return 1.0 if @var{expr} is zero, 0.0 otherwise.
139 Compute the power of @var{x} elevated @var{y}, it is equivalent to
140 "(@var{x})^(@var{y})".
144 Print the value of expression @var{t} with loglevel @var{l}. If
145 @var{l} is not specified then a default log level is used.
146 Returns the value of the expression printed.
148 Prints t with loglevel l
151 Return a pseudo random value between 0.0 and 1.0. @var{x} is the index of the
152 internal variable which will be used to save the seed/state.
154 @item root(expr, max)
155 Find an input value for which the function represented by @var{expr}
156 with argument @var{ld(0)} is 0 in the interval 0..@var{max}.
158 The expression in @var{expr} must denote a continuous function or the
161 @var{ld(0)} is used to represent the function input value, which means
162 that the given expression will be evaluated multiple times with
163 various input values that the expression can access through
164 @code{ld(0)}. When the expression evaluates to 0 then the
165 corresponding input value will be returned.
168 Compute sine of @var{x}.
171 Compute hyperbolic sine of @var{x}.
174 Compute the square root of @var{expr}. This is equivalent to
178 Compute expression @code{1/(1 + exp(4*x))}.
181 Allow to store the value of the expression @var{expr} in an internal
182 variable. @var{var} specifies the number of the variable where to
183 store the value, and it is a value ranging from 0 to 9. The function
184 returns the value stored in the internal variable.
185 Note, Variables are currently not shared between expressions.
188 Compute tangent of @var{x}.
191 Compute hyperbolic tangent of @var{x}.
193 @item taylor(expr, x)
194 @item taylor(expr, x, id)
195 Evaluate a Taylor series at @var{x}, given an expression representing
196 the @code{ld(id)}-th derivative of a function at 0.
198 When the series does not converge the result is undefined.
200 @var{ld(id)} is used to represent the derivative order in @var{expr},
201 which means that the given expression will be evaluated multiple times
202 with various input values that the expression can access through
203 @code{ld(id)}. If @var{id} is not specified then 0 is assumed.
205 Note, when you have the derivatives at y instead of 0,
206 @code{taylor(expr, x-y)} can be used.
209 Return the current (wallclock) time in seconds.
212 Round the value of expression @var{expr} towards zero to the nearest
213 integer. For example, "trunc(-1.5)" is "-1.0".
215 @item while(cond, expr)
216 Evaluate expression @var{expr} while the expression @var{cond} is
217 non-zero, and returns the value of the last @var{expr} evaluation, or
218 NAN if @var{cond} was always false.
221 The following constants are available:
224 area of the unit disc, approximately 3.14
226 exp(1) (Euler's number), approximately 2.718
228 golden ratio (1+sqrt(5))/2, approximately 1.618
231 Assuming that an expression is considered "true" if it has a non-zero
234 @code{*} works like AND
236 @code{+} works like OR
238 For example the construct:
247 In your C code, you can extend the list of unary and binary functions,
248 and define recognized constants, so that they are available for your
251 The evaluator also recognizes the International System unit prefixes.
252 If 'i' is appended after the prefix, binary prefixes are used, which
253 are based on powers of 1024 instead of powers of 1000.
254 The 'B' postfix multiplies the value by 8, and can be appended after a
255 unit prefix or used alone. This allows using for example 'KB', 'MiB',
256 'G' and 'B' as number postfix.
258 The list of available International System prefixes follows, with
259 indication of the corresponding powers of 10 and of 2.