2010-11-03 21:43:55 +02:00
|
|
|
@chapter Expression Evaluation
|
|
|
|
@c man begin EXPRESSION EVALUATION
|
|
|
|
|
2011-11-29 19:54:49 +03:00
|
|
|
When evaluating an arithmetic expression, FFmpeg uses an internal
|
2010-11-03 21:43:55 +02:00
|
|
|
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 sinh(x)
|
2012-08-21 14:16:13 +03:00
|
|
|
Compute hyperbolic sine of @var{x}.
|
|
|
|
|
2010-11-03 21:43:55 +02:00
|
|
|
@item cosh(x)
|
2012-08-21 14:16:13 +03:00
|
|
|
Compute hyperbolic cosine of @var{x}.
|
|
|
|
|
2010-11-03 21:43:55 +02:00
|
|
|
@item tanh(x)
|
2012-08-21 14:16:13 +03:00
|
|
|
Compute hyperbolic tangent of @var{x}.
|
|
|
|
|
2010-11-03 21:43:55 +02:00
|
|
|
@item sin(x)
|
2012-08-21 14:16:13 +03:00
|
|
|
Compute sine of @var{x}.
|
|
|
|
|
2010-11-03 21:43:55 +02:00
|
|
|
@item cos(x)
|
2012-08-21 14:16:13 +03:00
|
|
|
Compute cosine of @var{x}.
|
|
|
|
|
2010-11-03 21:43:55 +02:00
|
|
|
@item tan(x)
|
2012-08-21 14:16:13 +03:00
|
|
|
Compute tangent of @var{x}.
|
|
|
|
|
2010-11-03 21:43:55 +02:00
|
|
|
@item atan(x)
|
2012-08-21 14:16:13 +03:00
|
|
|
Compute arctangent of @var{x}.
|
|
|
|
|
2010-11-03 21:43:55 +02:00
|
|
|
@item asin(x)
|
2012-08-21 14:16:13 +03:00
|
|
|
Compute arcsine of @var{x}.
|
|
|
|
|
2010-11-03 21:43:55 +02:00
|
|
|
@item acos(x)
|
2012-08-21 14:16:13 +03:00
|
|
|
Compute arccosine of @var{x}.
|
|
|
|
|
2010-11-03 21:43:55 +02:00
|
|
|
@item exp(x)
|
2012-08-21 14:16:13 +03:00
|
|
|
Compute exponential of @var{x} (with base @code{e}, the Euler's number).
|
|
|
|
|
2010-11-03 21:43:55 +02:00
|
|
|
@item log(x)
|
2012-08-21 14:16:13 +03:00
|
|
|
Compute natural logarithm of @var{x}.
|
|
|
|
|
2010-11-03 21:43:55 +02:00
|
|
|
@item abs(x)
|
2012-08-21 14:16:13 +03:00
|
|
|
Compute absolute value of @var{x}.
|
|
|
|
|
2010-11-03 21:43:55 +02:00
|
|
|
@item squish(x)
|
2012-08-21 14:16:13 +03:00
|
|
|
Compute expression @code{1/(1 + exp(4*x))}.
|
|
|
|
|
2010-11-03 21:43:55 +02:00
|
|
|
@item gauss(x)
|
2012-08-21 14:16:13 +03:00
|
|
|
Compute Gauss function of @var{x}, corresponding to
|
|
|
|
@code{exp(-x*x/2) / sqrt(2*PI)}.
|
|
|
|
|
2012-07-01 16:11:23 +03:00
|
|
|
@item isinf(x)
|
|
|
|
Return 1.0 if @var{x} is +/-INFINITY, 0.0 otherwise.
|
2012-08-21 14:16:13 +03:00
|
|
|
|
2010-11-03 21:44:00 +02:00
|
|
|
@item isnan(x)
|
|
|
|
Return 1.0 if @var{x} is NAN, 0.0 otherwise.
|
|
|
|
|
2010-11-03 21:43:55 +02:00
|
|
|
@item mod(x, y)
|
2012-08-21 14:16:13 +03:00
|
|
|
Compute the remainder of division of @var{x} by @var{y}.
|
|
|
|
|
2010-11-03 21:43:55 +02:00
|
|
|
@item max(x, y)
|
2012-08-21 14:16:13 +03:00
|
|
|
Return the maximum between @var{x} and @var{y}.
|
|
|
|
|
2010-11-03 21:43:55 +02:00
|
|
|
@item min(x, y)
|
2012-08-21 14:16:13 +03:00
|
|
|
Return the maximum between @var{x} and @var{y}.
|
|
|
|
|
2010-11-03 21:43:55 +02:00
|
|
|
@item eq(x, y)
|
2012-08-21 14:16:13 +03:00
|
|
|
Return 1 if @var{x} and @var{y} are equivalent, 0 otherwise.
|
|
|
|
|
2010-11-03 21:43:55 +02:00
|
|
|
@item gte(x, y)
|
2012-08-21 14:16:13 +03:00
|
|
|
Return 1 if @var{x} is greater than or equal to @var{y}, 0 otherwise.
|
|
|
|
|
2010-11-03 21:43:55 +02:00
|
|
|
@item gt(x, y)
|
2012-08-21 14:16:13 +03:00
|
|
|
Return 1 if @var{x} is greater than @var{y}, 0 otherwise.
|
|
|
|
|
2010-11-03 21:43:55 +02:00
|
|
|
@item lte(x, y)
|
2012-08-21 14:16:13 +03:00
|
|
|
Return 1 if @var{x} is lesser than or equal to @var{y}, 0 otherwise.
|
|
|
|
|
2010-11-03 21:43:55 +02:00
|
|
|
@item lt(x, y)
|
2012-08-21 14:16:13 +03:00
|
|
|
Return 1 if @var{x} is lesser than @var{y}, 0 otherwise.
|
|
|
|
|
2010-11-03 21:43:55 +02:00
|
|
|
@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.
|
2011-12-11 01:36:30 +03:00
|
|
|
Note, Variables are currently not shared between expressions.
|
2010-11-03 21:43:55 +02:00
|
|
|
|
|
|
|
@item ld(var)
|
|
|
|
Allow to load the value of the internal variable with number
|
2011-11-29 19:54:49 +03:00
|
|
|
@var{var}, which was previously stored with st(@var{var}, @var{expr}).
|
2010-11-03 21:43:55 +02:00
|
|
|
The function returns the loaded value.
|
|
|
|
|
|
|
|
@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.
|
2011-03-27 23:56:49 +03:00
|
|
|
|
|
|
|
@item ceil(expr)
|
|
|
|
Round the value of expression @var{expr} upwards to the nearest
|
|
|
|
integer. For example, "ceil(1.5)" is "2.0".
|
|
|
|
|
|
|
|
@item floor(expr)
|
|
|
|
Round the value of expression @var{expr} downwards to the nearest
|
|
|
|
integer. For example, "floor(-1.5)" is "-2.0".
|
|
|
|
|
|
|
|
@item trunc(expr)
|
|
|
|
Round the value of expression @var{expr} towards zero to the nearest
|
|
|
|
integer. For example, "trunc(-1.5)" is "-1.0".
|
2011-05-04 00:31:14 +03:00
|
|
|
|
|
|
|
@item sqrt(expr)
|
|
|
|
Compute the square root of @var{expr}. This is equivalent to
|
|
|
|
"(@var{expr})^.5".
|
2011-05-23 14:13:50 +03:00
|
|
|
|
|
|
|
@item not(expr)
|
|
|
|
Return 1.0 if @var{expr} is zero, 0.0 otherwise.
|
2011-06-06 16:00:25 +03:00
|
|
|
|
|
|
|
@item pow(x, y)
|
|
|
|
Compute the power of @var{x} elevated @var{y}, it is equivalent to
|
|
|
|
"(@var{x})^(@var{y})".
|
2011-10-08 13:22:44 +03:00
|
|
|
|
|
|
|
@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 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 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.
|
2012-01-16 00:59:42 +03:00
|
|
|
|
|
|
|
@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.
|
|
|
|
|
2013-01-23 02:02:36 +03:00
|
|
|
@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}.
|
|
|
|
|
2012-01-16 00:59:42 +03:00
|
|
|
@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.
|
2012-02-21 22:47:18 +03:00
|
|
|
|
2013-01-23 02:02:36 +03:00
|
|
|
@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}.
|
|
|
|
|
2012-02-22 19:21:04 +03:00
|
|
|
@item taylor(expr, x) taylor(expr, x, id)
|
2012-02-21 22:47:18 +03:00
|
|
|
Evaluate a taylor series at x.
|
2012-02-22 19:21:04 +03:00
|
|
|
expr represents the LD(id)-th derivates of f(x) at 0. If id is not specified
|
|
|
|
then 0 is assumed.
|
2012-02-21 22:47:18 +03:00
|
|
|
note, when you have the derivatives at y instead of 0
|
|
|
|
taylor(expr, x-y) can be used
|
|
|
|
When the series does not converge the results are undefined.
|
2012-02-22 00:30:35 +03:00
|
|
|
|
2013-01-20 21:08:43 +03:00
|
|
|
@item time(0)
|
|
|
|
The the current (wallclock) time in seconds
|
|
|
|
|
2012-02-22 00:30:35 +03:00
|
|
|
@item root(expr, max)
|
|
|
|
Finds x where f(x)=0 in the interval 0..max.
|
|
|
|
f() must be continuous or the result is undefined.
|
2010-11-03 21:43:55 +02:00
|
|
|
@end table
|
|
|
|
|
2011-10-13 14:24:24 +03:00
|
|
|
The following constants are available:
|
|
|
|
@table @option
|
|
|
|
@item PI
|
2011-11-29 19:54:49 +03:00
|
|
|
area of the unit disc, approximately 3.14
|
2011-10-13 14:24:24 +03:00
|
|
|
@item E
|
2011-11-29 19:54:49 +03:00
|
|
|
exp(1) (Euler's number), approximately 2.718
|
2011-10-13 14:24:24 +03:00
|
|
|
@item PHI
|
2011-11-29 19:54:49 +03:00
|
|
|
golden ratio (1+sqrt(5))/2, approximately 1.618
|
2011-10-13 14:24:24 +03:00
|
|
|
@end table
|
|
|
|
|
2012-01-16 02:43:21 +03:00
|
|
|
Assuming that an expression is considered "true" if it has a non-zero
|
|
|
|
value, note that:
|
2010-11-03 21:43:55 +02:00
|
|
|
|
|
|
|
@code{*} works like AND
|
|
|
|
|
|
|
|
@code{+} works like OR
|
|
|
|
|
2012-01-16 00:59:42 +03:00
|
|
|
and the construct:
|
2010-11-03 21:43:55 +02:00
|
|
|
@example
|
|
|
|
if A then B else C
|
|
|
|
@end example
|
|
|
|
is equivalent to
|
|
|
|
@example
|
2012-01-16 00:59:42 +03:00
|
|
|
if(A,B) + ifnot(A,C)
|
2010-11-03 21:43:55 +02:00
|
|
|
@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 number
|
|
|
|
postfixes. If 'i' is appended after the postfix, powers of 2 are used
|
|
|
|
instead of powers of 10. The 'B' postfix multiplies the value for 8,
|
|
|
|
and can be appended after another postfix or used alone. This allows
|
|
|
|
using for example 'KB', 'MiB', 'G' and 'B' as postfix.
|
|
|
|
|
|
|
|
Follows the list of available International System postfixes, with
|
|
|
|
indication of the corresponding powers of 10 and of 2.
|
|
|
|
@table @option
|
|
|
|
@item y
|
|
|
|
-24 / -80
|
|
|
|
@item z
|
|
|
|
-21 / -70
|
|
|
|
@item a
|
|
|
|
-18 / -60
|
|
|
|
@item f
|
|
|
|
-15 / -50
|
|
|
|
@item p
|
|
|
|
-12 / -40
|
|
|
|
@item n
|
|
|
|
-9 / -30
|
|
|
|
@item u
|
|
|
|
-6 / -20
|
|
|
|
@item m
|
|
|
|
-3 / -10
|
|
|
|
@item c
|
|
|
|
-2
|
|
|
|
@item d
|
|
|
|
-1
|
|
|
|
@item h
|
|
|
|
2
|
|
|
|
@item k
|
|
|
|
3 / 10
|
|
|
|
@item K
|
|
|
|
3 / 10
|
|
|
|
@item M
|
|
|
|
6 / 20
|
|
|
|
@item G
|
|
|
|
9 / 30
|
|
|
|
@item T
|
|
|
|
12 / 40
|
|
|
|
@item P
|
|
|
|
15 / 40
|
|
|
|
@item E
|
|
|
|
18 / 50
|
|
|
|
@item Z
|
|
|
|
21 / 60
|
|
|
|
@item Y
|
|
|
|
24 / 70
|
|
|
|
@end table
|
|
|
|
|
|
|
|
@c man end
|