49 double (*
const *
funcs1)(
void *,
double a);
51 double (*
const *
funcs2)(
void *,
double a,
double b);
74 [
'y'-
'E']= { 8.271806125530276749e-25, 1e-24, -24 },
75 [
'z'-
'E']= { 8.4703294725430034e-22, 1e-21, -21 },
76 [
'a'-
'E']= { 8.6736173798840355e-19, 1e-18, -18 },
77 [
'f'-
'E']= { 8.8817841970012523e-16, 1e-15, -15 },
78 [
'p'-
'E']= { 9.0949470177292824e-13, 1e-12, -12 },
79 [
'n'-
'E']= { 9.3132257461547852e-10, 1e-9, -9 },
80 [
'u'-
'E']= { 9.5367431640625e-7, 1e-6, -6 },
81 [
'm'-
'E']= { 9.765625e-4, 1e-3, -3 },
82 [
'c'-
'E']= { 9.8431332023036951e-3, 1e-2, -2 },
83 [
'd'-
'E']= { 9.921256574801246e-2, 1e-1, -1 },
84 [
'h'-
'E']= { 1.0159366732596479e2, 1e2, 2 },
85 [
'k'-
'E']= { 1.024e3, 1e3, 3 },
86 [
'K'-
'E']= { 1.024e3, 1e3, 3 },
87 [
'M'-
'E']= { 1.048576e6, 1e6, 6 },
88 [
'G'-
'E']= { 1.073741824e9, 1e9, 9 },
89 [
'T'-
'E']= { 1.099511627776e12, 1e12, 12 },
90 [
'P'-
'E']= { 1.125899906842624e15, 1e15, 15 },
91 [
'E'-
'E']= { 1.152921504606847e18, 1e18, 18 },
92 [
'Z'-
'E']= { 1.1805916207174113e21, 1e21, 21 },
93 [
'Y'-
'E']= { 1.2089258196146292e24, 1e24, 24 },
110 if(numstr[0]==
'0' && (numstr[1]|0x20)==
'x') {
111 d = strtoul(numstr, &next, 16);
113 d =
strtod(numstr, &next);
116 if (next[0] ==
'd' && next[1] ==
'B') {
120 }
else if (*next >=
'E' && *next <=
'z') {
123 if (next[1] ==
'i') {
145 #define IS_IDENTIFIER_CHAR(c) ((c) - '0' <= 9U || (c) - 'a' <= 25U || (c) - 'A' <= 25U || (c) == '_') 150 for (i=0; prefix[
i]; i++) {
151 if (prefix[i] != s[i])
return 0;
161 e_mod, e_max, e_min, e_eq, e_gt, e_gte, e_lte, e_lt,
163 e_last, e_st,
e_while, e_taylor, e_root, e_floor, e_ceil, e_trunc, e_round,
165 e_if, e_ifnot,
e_print, e_bitand, e_bitor, e_between, e_clip, e_atan2, e_lerp,
171 double (*func0)(double);
173 double (*
func2)(
void *, double, double);
224 return v0 + (v1 -
v0) * f;
229 av_log(p, level,
"%f\n", x);
235 r= r*1664525+1013904223;
237 return e->
value * (r * (1.0/UINT64_MAX));
246 double t = 1, d = 0, v;
250 double var0 = p->
var[
id];
251 for(i=0; i<1000; i++) {
265 double low = -1, high = -1, v, low_v = -DBL_MAX, high_v = DBL_MAX;
266 double var0 = p->
var[0];
268 for(i=-1; i<1024; i++) {
272 p->
var[0] = x_max*pow(0.9, i-255);
273 if (i&1) p->
var[0] *= -1;
274 if (i&2) p->
var[0] += low;
275 else p->
var[0] += high;
278 if (v<=0 && v>low_v) {
282 if (v>=0 && v<high_v) {
286 if (low>=0 && high>=0){
287 for (j=0; j<1000; j++) {
288 p->
var[0] = (low+high)*0.5;
289 if (low == p->
var[0] || high == p->
var[0])
292 if (v<=0) low = p->
var[0];
293 if (v>=0) high= p->
var[0];
303 return -low_v<high_v ? low : high;
309 case e_mod:
return e->
value * (d - floor((!CONFIG_FTRAPV || d2) ? d / d2 : d *
INFINITY) * d2);
311 case e_max:
return e->
value * (d > d2 ? d : d2);
312 case e_min:
return e->
value * (d < d2 ? d : d2);
313 case e_eq:
return e->
value * (d == d2 ? 1.0 : 0.0);
314 case e_gt:
return e->
value * (d > d2 ? 1.0 : 0.0);
315 case e_gte:
return e->
value * (d >= d2 ? 1.0 : 0.0);
316 case e_lt:
return e->
value * (d < d2 ? 1.0 : 0.0);
317 case e_lte:
return e->
value * (d <= d2 ? 1.0 : 0.0);
349 char *next = p->
s, *
s0 = p->
s;
385 p->
s= strchr(p->
s,
'(');
397 if (p->
s[0] !=
')') {
418 if (p->
s[0] !=
')') {
518 *sign= (*p->
s ==
'+') - (*p->
s ==
'-');
530 if (next != p->
s && next[0] ==
'd' && next[1] ==
'B') {
540 int sign, sign2,
ret;
542 if ((ret =
parse_dB(&e0, p, &sign)) < 0)
547 if ((ret =
parse_dB(&e2, p, &sign2)) < 0) {
559 if (e0) e0->
value *= (sign|1);
571 while (p->
s[0]==
'*' || p->
s[0]==
'/') {
595 while (*p->
s ==
'+' || *p->
s ==
'-') {
623 while (*p->
s ==
';') {
686 const char *
const *
func2_names,
double (*
const *
funcs2)(
void *,
double,
double),
742 if (!e || !counter || !size)
765 const char *
const *const_names,
const double *
const_values,
766 const char *
const *func1_names,
double (*
const *
funcs1)(
void *,
double),
767 const char *
const *func2_names,
double (*
const *
funcs2)(
void *,
double,
double),
static int verify_expr(AVExpr *e)
const char *const * func1_names
#define LIBAVUTIL_VERSION_INT
const uint8_t ff_reverse[256]
const char * av_default_item_name(void *ptr)
Return the context name.
static av_const int av_isspace(int c)
Locale-independent conversion of ASCII isspace.
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
Convenience header that includes libavutil's core.
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
int av_expr_parse(AVExpr **expr, const char *s, const char *const *const_names, const char *const *func1_names, double(*const *funcs1)(void *, double), const char *const *func2_names, double(*const *funcs2)(void *, double, double), int log_offset, void *log_ctx)
Parse an expression.
Macro definitions for various function/variable attributes.
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
static int parse_dB(AVExpr **e, Parser *p, int *sign)
static av_cold int end(AVCodecContext *avctx)
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
static int parse_expr(AVExpr **e, Parser *p)
GLsizei GLboolean const GLfloat * value
double strtod(const char *, char **)
double(* func2)(void *, double, double)
const char *const * const_names
static int parse_pow(AVExpr **e, Parser *p, int *sign)
static int parse_factor(AVExpr **e, Parser *p)
high precision timer, useful to profile code
static int parse_subexpr(AVExpr **e, Parser *p)
int av_expr_parse_and_eval(double *d, const char *s, const char *const *const_names, const double *const_values, const char *const *func1_names, double(*const *funcs1)(void *, double), const char *const *func2_names, double(*const *funcs2)(void *, double, double), void *opaque, int log_offset, void *log_ctx)
Parse and evaluate an expression.
const double * const_values
#define i(width, name, range_min, range_max)
static av_always_inline double ff_exp10(double x)
Compute 10^x for floating point values.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
#define IS_IDENTIFIER_CHAR(c)
static const struct @293 si_prefixes['z'- 'E'+1]
static double(*const func1[])(void *, double)
static int parse_term(AVExpr **e, Parser *p)
int64_t av_gcd(int64_t a, int64_t b)
Compute the greatest common divisor of two integer operands.
static av_always_inline av_const double round(double x)
static const struct @294 constants[]
#define FFDIFFSIGN(x, y)
Comparator.
common internal API header
static av_const double hypot(double x, double y)
static double etime(double v)
static av_always_inline av_const double trunc(double x)
static int strmatch(const char *s, const char *prefix)
static int parse_primary(AVExpr **e, Parser *p)
double(*const funcs1)(void *, double a)
#define FF_ARRAY_ELEMS(a)
int64_t av_gettime(void)
Get the current time in microseconds.
double av_strtod(const char *numstr, char **tail)
Parse the string in numstr and return its value as a double.
#define AV_LOG_INFO
Standard information.
static double eval_expr(Parser *p, AVExpr *e)
void av_expr_free(AVExpr *e)
Free a parsed expression previously created with av_expr_parse().
double(* func2[])(void *, double, double)
Describe the class of an AVClass context structure.
static const AVClass eval_class
double(* func1)(void *, double)
const char *const * func2_names
internal math functions header
common internal and external API header
int av_expr_count_vars(AVExpr *e, unsigned *counter, int size)
Track the presence of variables and their number of occurrences in a parsed expression.
double av_expr_eval(AVExpr *e, const double *const_values, void *opaque)
Evaluate a previously parsed expression.
#define FF_QP2LAMBDA
factor to convert from H.263 QP to lambda
static AVExpr * make_eval_expr(int type, int value, AVExpr *p0, AVExpr *p1)
double(*const funcs2)(void *, double a, double b)
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later.That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another.Frame references ownership and permissions
simple arithmetic expression evaluator