mirror of https://git.ffmpeg.org/ffmpeg.git
avutil/eval: Add av_expr_count_func() similar to av_expr_count_vars()
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
This commit is contained in:
parent
26f040bcb4
commit
45259a0ee4
|
@ -15,6 +15,9 @@ libavutil: 2017-10-21
|
||||||
|
|
||||||
API changes, most recent first:
|
API changes, most recent first:
|
||||||
|
|
||||||
|
2019-12-27 - xxxxxxxxxx - lavu 56.38.100 - eval.h
|
||||||
|
Add av_expr_count_func().
|
||||||
|
|
||||||
2019-12-xx - xxxxxxxxxx - lavu 56.37.100 - buffer.h
|
2019-12-xx - xxxxxxxxxx - lavu 56.37.100 - buffer.h
|
||||||
Add av_buffer_pool_buffer_get_opaque().
|
Add av_buffer_pool_buffer_get_opaque().
|
||||||
|
|
||||||
|
|
|
@ -166,8 +166,8 @@ struct AVExpr {
|
||||||
e_sgn,
|
e_sgn,
|
||||||
} type;
|
} type;
|
||||||
double value; // is sign in other types
|
double value; // is sign in other types
|
||||||
|
int const_index;
|
||||||
union {
|
union {
|
||||||
int const_index;
|
|
||||||
double (*func0)(double);
|
double (*func0)(double);
|
||||||
double (*func1)(void *, double);
|
double (*func1)(void *, double);
|
||||||
double (*func2)(void *, double, double);
|
double (*func2)(void *, double, double);
|
||||||
|
@ -185,7 +185,7 @@ static double eval_expr(Parser *p, AVExpr *e)
|
||||||
{
|
{
|
||||||
switch (e->type) {
|
switch (e->type) {
|
||||||
case e_value: return e->value;
|
case e_value: return e->value;
|
||||||
case e_const: return e->value * p->const_values[e->a.const_index];
|
case e_const: return e->value * p->const_values[e->const_index];
|
||||||
case e_func0: return e->value * e->a.func0(eval_expr(p, e->param[0]));
|
case e_func0: return e->value * e->a.func0(eval_expr(p, e->param[0]));
|
||||||
case e_func1: return e->value * e->a.func1(p->opaque, eval_expr(p, e->param[0]));
|
case e_func1: return e->value * e->a.func1(p->opaque, eval_expr(p, e->param[0]));
|
||||||
case e_func2: return e->value * e->a.func2(p->opaque, eval_expr(p, e->param[0]), eval_expr(p, e->param[1]));
|
case e_func2: return e->value * e->a.func2(p->opaque, eval_expr(p, e->param[0]), eval_expr(p, e->param[1]));
|
||||||
|
@ -367,7 +367,7 @@ static int parse_primary(AVExpr **e, Parser *p)
|
||||||
if (strmatch(p->s, p->const_names[i])) {
|
if (strmatch(p->s, p->const_names[i])) {
|
||||||
p->s+= strlen(p->const_names[i]);
|
p->s+= strlen(p->const_names[i]);
|
||||||
d->type = e_const;
|
d->type = e_const;
|
||||||
d->a.const_index = i;
|
d->const_index = i;
|
||||||
*e = d;
|
*e = d;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -478,6 +478,7 @@ static int parse_primary(AVExpr **e, Parser *p)
|
||||||
if (strmatch(next, p->func1_names[i])) {
|
if (strmatch(next, p->func1_names[i])) {
|
||||||
d->a.func1 = p->funcs1[i];
|
d->a.func1 = p->funcs1[i];
|
||||||
d->type = e_func1;
|
d->type = e_func1;
|
||||||
|
d->const_index = i;
|
||||||
*e = d;
|
*e = d;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -487,6 +488,7 @@ static int parse_primary(AVExpr **e, Parser *p)
|
||||||
if (strmatch(next, p->func2_names[i])) {
|
if (strmatch(next, p->func2_names[i])) {
|
||||||
d->a.func2 = p->funcs2[i];
|
d->a.func2 = p->funcs2[i];
|
||||||
d->type = e_func2;
|
d->type = e_func2;
|
||||||
|
d->const_index = i;
|
||||||
*e = d;
|
*e = d;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -735,22 +737,32 @@ end:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int av_expr_count_vars(AVExpr *e, unsigned *counter, int size)
|
static int expr_count(AVExpr *e, unsigned *counter, int size, int type)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (!e || !counter || !size)
|
if (!e || !counter || !size)
|
||||||
return AVERROR(EINVAL);
|
return AVERROR(EINVAL);
|
||||||
|
|
||||||
for (i = 0; e->type != e_const && i < 3 && e->param[i]; i++)
|
for (i = 0; e->type != type && i < 3 && e->param[i]; i++)
|
||||||
av_expr_count_vars(e->param[i], counter, size);
|
expr_count(e->param[i], counter, size, type);
|
||||||
|
|
||||||
if (e->type == e_const && e->a.const_index < size)
|
if (e->type == type && e->const_index < size)
|
||||||
counter[e->a.const_index]++;
|
counter[e->const_index]++;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int av_expr_count_vars(AVExpr *e, unsigned *counter, int size)
|
||||||
|
{
|
||||||
|
return expr_count(e, counter, size, e_const);
|
||||||
|
}
|
||||||
|
|
||||||
|
int av_expr_count_func(AVExpr *e, unsigned *counter, int size, int arg)
|
||||||
|
{
|
||||||
|
return expr_count(e, counter, size, ((int[]){e_const, e_func1, e_func2})[arg]);
|
||||||
|
}
|
||||||
|
|
||||||
double av_expr_eval(AVExpr *e, const double *const_values, void *opaque)
|
double av_expr_eval(AVExpr *e, const double *const_values, void *opaque)
|
||||||
{
|
{
|
||||||
Parser p = { 0 };
|
Parser p = { 0 };
|
||||||
|
|
|
@ -96,6 +96,20 @@ double av_expr_eval(AVExpr *e, const double *const_values, void *opaque);
|
||||||
*/
|
*/
|
||||||
int av_expr_count_vars(AVExpr *e, unsigned *counter, int size);
|
int av_expr_count_vars(AVExpr *e, unsigned *counter, int size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Track the presence of user provided functions and their number of occurrences
|
||||||
|
* in a parsed expression.
|
||||||
|
*
|
||||||
|
* @param counter a zero-initialized array where the count of each function will be stored
|
||||||
|
* if you passed 5 functions with 2 arguments to av_expr_parse()
|
||||||
|
* then for arg=2 this will use upto 5 entries.
|
||||||
|
* @param size size of array
|
||||||
|
* @param arg number of arguments the counted functions have
|
||||||
|
* @return 0 on success, a negative value indicates that no expression or array was passed
|
||||||
|
* or size was zero
|
||||||
|
*/
|
||||||
|
int av_expr_count_func(AVExpr *e, unsigned *counter, int size, int arg);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Free a parsed expression previously created with av_expr_parse().
|
* Free a parsed expression previously created with av_expr_parse().
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -79,7 +79,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define LIBAVUTIL_VERSION_MAJOR 56
|
#define LIBAVUTIL_VERSION_MAJOR 56
|
||||||
#define LIBAVUTIL_VERSION_MINOR 37
|
#define LIBAVUTIL_VERSION_MINOR 38
|
||||||
#define LIBAVUTIL_VERSION_MICRO 100
|
#define LIBAVUTIL_VERSION_MICRO 100
|
||||||
|
|
||||||
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
|
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
|
||||||
|
|
Loading…
Reference in New Issue