Commit 0b99215c authored by Stefano Sabatini's avatar Stefano Sabatini

Move eval.c and eval.h from libavcodec to libavutil, and make the eval

API public.

Originally committed as revision 23485 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent 6532c6f9
...@@ -11,7 +11,6 @@ OBJS = allcodecs.o \ ...@@ -11,7 +11,6 @@ OBJS = allcodecs.o \
bitstream.o \ bitstream.o \
bitstream_filter.o \ bitstream_filter.o \
dsputil.o \ dsputil.o \
eval.o \
faanidct.o \ faanidct.o \
imgconvert.o \ imgconvert.o \
jrevdct.o \ jrevdct.o \
......
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
#define LIBAVCODEC_VERSION_MAJOR 52 #define LIBAVCODEC_VERSION_MAJOR 52
#define LIBAVCODEC_VERSION_MINOR 74 #define LIBAVCODEC_VERSION_MINOR 74
#define LIBAVCODEC_VERSION_MICRO 0 #define LIBAVCODEC_VERSION_MICRO 1
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
LIBAVCODEC_VERSION_MINOR, \ LIBAVCODEC_VERSION_MINOR, \
......
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
#include "avcodec.h" #include "avcodec.h"
#include "opt.h" #include "opt.h"
#include "eval.h" #include "libavutil/eval.h"
//FIXME order them and do a bin search //FIXME order them and do a bin search
const AVOption *av_find_opt(void *v, const char *name, const char *unit, int mask, int flags){ const AVOption *av_find_opt(void *v, const char *name, const char *unit, int mask, int flags){
...@@ -165,7 +165,7 @@ int av_set_string3(void *obj, const char *name, const char *val, int alloc, cons ...@@ -165,7 +165,7 @@ int av_set_string3(void *obj, const char *name, const char *val, int alloc, cons
else if(!strcmp(buf, "none" )) d= 0; else if(!strcmp(buf, "none" )) d= 0;
else if(!strcmp(buf, "all" )) d= ~0; else if(!strcmp(buf, "all" )) d= ~0;
else { else {
int res = ff_parse_and_eval_expr(&d, buf, const_names, const_values, NULL, NULL, NULL, NULL, NULL, 0, obj); int res = av_parse_and_eval_expr(&d, buf, const_names, const_values, NULL, NULL, NULL, NULL, NULL, 0, obj);
if (res < 0) { if (res < 0) {
av_log(obj, AV_LOG_ERROR, "Unable to parse option value \"%s\"\n", val); av_log(obj, AV_LOG_ERROR, "Unable to parse option value \"%s\"\n", val);
return res; return res;
......
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
#include "dsputil.h" #include "dsputil.h"
#include "ratecontrol.h" #include "ratecontrol.h"
#include "mpegvideo.h" #include "mpegvideo.h"
#include "eval.h" #include "libavutil/eval.h"
#undef NDEBUG // Always check asserts, the speed effect is far too small to disable them. #undef NDEBUG // Always check asserts, the speed effect is far too small to disable them.
#include <assert.h> #include <assert.h>
...@@ -106,7 +106,7 @@ int ff_rate_control_init(MpegEncContext *s) ...@@ -106,7 +106,7 @@ int ff_rate_control_init(MpegEncContext *s)
}; };
emms_c(); emms_c();
res = ff_parse_expr(&rcc->rc_eq_eval, s->avctx->rc_eq ? s->avctx->rc_eq : "tex^qComp", const_names, func1_names, func1, NULL, NULL, 0, s->avctx); res = av_parse_expr(&rcc->rc_eq_eval, s->avctx->rc_eq ? s->avctx->rc_eq : "tex^qComp", const_names, func1_names, func1, NULL, NULL, 0, s->avctx);
if (res < 0) { if (res < 0) {
av_log(s->avctx, AV_LOG_ERROR, "Error parsing rc_eq \"%s\"\n", s->avctx->rc_eq); av_log(s->avctx, AV_LOG_ERROR, "Error parsing rc_eq \"%s\"\n", s->avctx->rc_eq);
return res; return res;
...@@ -254,7 +254,7 @@ void ff_rate_control_uninit(MpegEncContext *s) ...@@ -254,7 +254,7 @@ void ff_rate_control_uninit(MpegEncContext *s)
RateControlContext *rcc= &s->rc_context; RateControlContext *rcc= &s->rc_context;
emms_c(); emms_c();
ff_free_expr(rcc->rc_eq_eval); av_free_expr(rcc->rc_eq_eval);
av_freep(&rcc->entry); av_freep(&rcc->entry);
#if CONFIG_LIBXVID #if CONFIG_LIBXVID
...@@ -338,7 +338,7 @@ static double get_qscale(MpegEncContext *s, RateControlEntry *rce, double rate_f ...@@ -338,7 +338,7 @@ static double get_qscale(MpegEncContext *s, RateControlEntry *rce, double rate_f
0 0
}; };
bits= ff_eval_expr(rcc->rc_eq_eval, const_values, rce); bits = av_eval_expr(rcc->rc_eq_eval, const_values, rce);
if (isnan(bits)) { if (isnan(bits)) {
av_log(s->avctx, AV_LOG_ERROR, "Error evaluating rc_eq \"%s\"\n", s->avctx->rc_eq); av_log(s->avctx, AV_LOG_ERROR, "Error evaluating rc_eq \"%s\"\n", s->avctx->rc_eq);
return -1; return -1;
......
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
#include <stdio.h> #include <stdio.h>
#include <stdint.h> #include <stdint.h>
#include "eval.h" #include "libavutil/eval.h"
typedef struct Predictor{ typedef struct Predictor{
double coeff; double coeff;
......
...@@ -10,6 +10,7 @@ HEADERS = adler32.h \ ...@@ -10,6 +10,7 @@ HEADERS = adler32.h \
common.h \ common.h \
crc.h \ crc.h \
error.h \ error.h \
eval.h \
fifo.h \ fifo.h \
intfloat_readwrite.h \ intfloat_readwrite.h \
log.h \ log.h \
...@@ -32,6 +33,7 @@ OBJS = adler32.o \ ...@@ -32,6 +33,7 @@ OBJS = adler32.o \
crc.o \ crc.o \
des.o \ des.o \
error.o \ error.o \
eval.o \
fifo.o \ fifo.o \
intfloat_readwrite.o \ intfloat_readwrite.o \
lfg.o \ lfg.o \
......
...@@ -40,7 +40,7 @@ ...@@ -40,7 +40,7 @@
#define AV_VERSION(a, b, c) AV_VERSION_DOT(a, b, c) #define AV_VERSION(a, b, c) AV_VERSION_DOT(a, b, c)
#define LIBAVUTIL_VERSION_MAJOR 50 #define LIBAVUTIL_VERSION_MAJOR 50
#define LIBAVUTIL_VERSION_MINOR 17 #define LIBAVUTIL_VERSION_MINOR 18
#define LIBAVUTIL_VERSION_MICRO 0 #define LIBAVUTIL_VERSION_MICRO 0
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
......
...@@ -171,11 +171,11 @@ static double eval_expr(Parser *p, AVExpr *e) ...@@ -171,11 +171,11 @@ static double eval_expr(Parser *p, AVExpr *e)
static int parse_expr(AVExpr **e, Parser *p); static int parse_expr(AVExpr **e, Parser *p);
void ff_free_expr(AVExpr *e) void av_free_expr(AVExpr *e)
{ {
if (!e) return; if (!e) return;
ff_free_expr(e->param[0]); av_free_expr(e->param[0]);
ff_free_expr(e->param[1]); av_free_expr(e->param[1]);
av_freep(&e); av_freep(&e);
} }
...@@ -213,7 +213,7 @@ static int parse_primary(AVExpr **e, Parser *p) ...@@ -213,7 +213,7 @@ static int parse_primary(AVExpr **e, Parser *p)
if (p->s==NULL) { if (p->s==NULL) {
av_log(p, AV_LOG_ERROR, "undefined constant or missing (\n"); av_log(p, AV_LOG_ERROR, "undefined constant or missing (\n");
p->s= next; p->s= next;
ff_free_expr(d); av_free_expr(d);
return AVERROR(EINVAL); return AVERROR(EINVAL);
} }
p->s++; // "(" p->s++; // "("
...@@ -223,7 +223,7 @@ static int parse_primary(AVExpr **e, Parser *p) ...@@ -223,7 +223,7 @@ static int parse_primary(AVExpr **e, Parser *p)
return ret; return ret;
if (p->s[0] != ')') { if (p->s[0] != ')') {
av_log(p, AV_LOG_ERROR, "missing )\n"); av_log(p, AV_LOG_ERROR, "missing )\n");
ff_free_expr(d); av_free_expr(d);
return AVERROR(EINVAL); return AVERROR(EINVAL);
} }
p->s++; // ")" p->s++; // ")"
...@@ -231,7 +231,7 @@ static int parse_primary(AVExpr **e, Parser *p) ...@@ -231,7 +231,7 @@ static int parse_primary(AVExpr **e, Parser *p)
return 0; return 0;
} }
if ((ret = parse_expr(&(d->param[0]), p)) < 0) { if ((ret = parse_expr(&(d->param[0]), p)) < 0) {
ff_free_expr(d); av_free_expr(d);
return ret; return ret;
} }
if (p->s[0]== ',') { if (p->s[0]== ',') {
...@@ -240,7 +240,7 @@ static int parse_primary(AVExpr **e, Parser *p) ...@@ -240,7 +240,7 @@ static int parse_primary(AVExpr **e, Parser *p)
} }
if (p->s[0] != ')') { if (p->s[0] != ')') {
av_log(p, AV_LOG_ERROR, "missing )\n"); av_log(p, AV_LOG_ERROR, "missing )\n");
ff_free_expr(d); av_free_expr(d);
return AVERROR(EINVAL); return AVERROR(EINVAL);
} }
p->s++; // ")" p->s++; // ")"
...@@ -291,7 +291,7 @@ static int parse_primary(AVExpr **e, Parser *p) ...@@ -291,7 +291,7 @@ static int parse_primary(AVExpr **e, Parser *p)
} }
av_log(p, AV_LOG_ERROR, "unknown function\n"); av_log(p, AV_LOG_ERROR, "unknown function\n");
ff_free_expr(d); av_free_expr(d);
return AVERROR(EINVAL); return AVERROR(EINVAL);
} }
...@@ -328,13 +328,13 @@ static int parse_factor(AVExpr **e, Parser *p) ...@@ -328,13 +328,13 @@ static int parse_factor(AVExpr **e, Parser *p)
e1 = e0; e1 = e0;
p->s++; p->s++;
if ((ret = parse_pow(&e2, p, &sign2)) < 0) { if ((ret = parse_pow(&e2, p, &sign2)) < 0) {
ff_free_expr(e1); av_free_expr(e1);
return ret; return ret;
} }
e0 = new_eval_expr(e_pow, 1, e1, e2); e0 = new_eval_expr(e_pow, 1, e1, e2);
if (!e0) { if (!e0) {
ff_free_expr(e1); av_free_expr(e1);
ff_free_expr(e2); av_free_expr(e2);
return AVERROR(ENOMEM); return AVERROR(ENOMEM);
} }
if (e0->param[1]) e0->param[1]->value *= (sign2|1); if (e0->param[1]) e0->param[1]->value *= (sign2|1);
...@@ -355,13 +355,13 @@ static int parse_term(AVExpr **e, Parser *p) ...@@ -355,13 +355,13 @@ static int parse_term(AVExpr **e, Parser *p)
int c= *p->s++; int c= *p->s++;
e1 = e0; e1 = e0;
if ((ret = parse_factor(&e2, p)) < 0) { if ((ret = parse_factor(&e2, p)) < 0) {
ff_free_expr(e1); av_free_expr(e1);
return ret; return ret;
} }
e0 = new_eval_expr(c == '*' ? e_mul : e_div, 1, e1, e2); e0 = new_eval_expr(c == '*' ? e_mul : e_div, 1, e1, e2);
if (!e0) { if (!e0) {
ff_free_expr(e1); av_free_expr(e1);
ff_free_expr(e2); av_free_expr(e2);
return AVERROR(ENOMEM); return AVERROR(ENOMEM);
} }
} }
...@@ -378,13 +378,13 @@ static int parse_subexpr(AVExpr **e, Parser *p) ...@@ -378,13 +378,13 @@ static int parse_subexpr(AVExpr **e, Parser *p)
while (*p->s == '+' || *p->s == '-') { while (*p->s == '+' || *p->s == '-') {
e1 = e0; e1 = e0;
if ((ret = parse_term(&e2, p)) < 0) { if ((ret = parse_term(&e2, p)) < 0) {
ff_free_expr(e1); av_free_expr(e1);
return ret; return ret;
} }
e0 = new_eval_expr(e_add, 1, e1, e2); e0 = new_eval_expr(e_add, 1, e1, e2);
if (!e0) { if (!e0) {
ff_free_expr(e1); av_free_expr(e1);
ff_free_expr(e2); av_free_expr(e2);
return AVERROR(ENOMEM); return AVERROR(ENOMEM);
} }
}; };
...@@ -406,14 +406,14 @@ static int parse_expr(AVExpr **e, Parser *p) ...@@ -406,14 +406,14 @@ static int parse_expr(AVExpr **e, Parser *p)
while (*p->s == ';') { while (*p->s == ';') {
e1 = e0; e1 = e0;
if ((ret = parse_subexpr(&e2, p)) < 0) { if ((ret = parse_subexpr(&e2, p)) < 0) {
ff_free_expr(e1); av_free_expr(e1);
return ret; return ret;
} }
p->s++; p->s++;
e0 = new_eval_expr(e_last, 1, e1, e2); e0 = new_eval_expr(e_last, 1, e1, e2);
if (!e0) { if (!e0) {
ff_free_expr(e1); av_free_expr(e1);
ff_free_expr(e2); av_free_expr(e2);
return AVERROR(ENOMEM); return AVERROR(ENOMEM);
} }
}; };
...@@ -438,7 +438,7 @@ static int verify_expr(AVExpr *e) ...@@ -438,7 +438,7 @@ static int verify_expr(AVExpr *e)
} }
} }
int ff_parse_expr(AVExpr **expr, const char *s, int av_parse_expr(AVExpr **expr, const char *s,
const char * const *const_names, const char * const *const_names,
const char * const *func1_names, double (* const *funcs1)(void *, double), const char * const *func1_names, double (* const *funcs1)(void *, double),
const char * const *func2_names, double (* const *funcs2)(void *, double, double), const char * const *func2_names, double (* const *funcs2)(void *, double, double),
...@@ -471,7 +471,7 @@ int ff_parse_expr(AVExpr **expr, const char *s, ...@@ -471,7 +471,7 @@ int ff_parse_expr(AVExpr **expr, const char *s,
if ((ret = parse_expr(&e, &p)) < 0) if ((ret = parse_expr(&e, &p)) < 0)
goto end; goto end;
if (!verify_expr(e)) { if (!verify_expr(e)) {
ff_free_expr(e); av_free_expr(e);
ret = AVERROR(EINVAL); ret = AVERROR(EINVAL);
goto end; goto end;
} }
...@@ -481,7 +481,7 @@ end: ...@@ -481,7 +481,7 @@ end:
return ret; return ret;
} }
double ff_eval_expr(AVExpr *e, const double *const_values, void *opaque) double av_eval_expr(AVExpr *e, const double *const_values, void *opaque)
{ {
Parser p; Parser p;
...@@ -490,21 +490,21 @@ double ff_eval_expr(AVExpr *e, const double *const_values, void *opaque) ...@@ -490,21 +490,21 @@ double ff_eval_expr(AVExpr *e, const double *const_values, void *opaque)
return eval_expr(&p, e); return eval_expr(&p, e);
} }
int ff_parse_and_eval_expr(double *d, const char *s, int av_parse_and_eval_expr(double *d, const char *s,
const char * const *const_names, const double *const_values, const char * const *const_names, const double *const_values,
const char * const *func1_names, double (* const *funcs1)(void *, double), const char * const *func1_names, double (* const *funcs1)(void *, double),
const char * const *func2_names, double (* const *funcs2)(void *, double, double), const char * const *func2_names, double (* const *funcs2)(void *, double, double),
void *opaque, int log_offset, void *log_ctx) void *opaque, int log_offset, void *log_ctx)
{ {
AVExpr *e = NULL; AVExpr *e = NULL;
int ret = ff_parse_expr(&e, s, const_names, func1_names, funcs1, func2_names, funcs2, log_offset, log_ctx); int ret = av_parse_expr(&e, s, const_names, func1_names, funcs1, func2_names, funcs2, log_offset, log_ctx);
if (ret < 0) { if (ret < 0) {
*d = NAN; *d = NAN;
return ret; return ret;
} }
*d = ff_eval_expr(e, const_values, opaque); *d = av_eval_expr(e, const_values, opaque);
ff_free_expr(e); av_free_expr(e);
return isnan(*d) ? AVERROR(EINVAL) : 0; return isnan(*d) ? AVERROR(EINVAL) : 0;
} }
...@@ -526,21 +526,21 @@ int main(void) ...@@ -526,21 +526,21 @@ int main(void)
{ {
int i; int i;
double d; double d;
ff_parse_and_eval_expr(&d, "1+(5-2)^(3-1)+1/2+sin(PI)-max(-2.2,-3.1)", av_parse_and_eval_expr(&d, "1+(5-2)^(3-1)+1/2+sin(PI)-max(-2.2,-3.1)",
const_names, const_values, const_names, const_values,
NULL, NULL, NULL, NULL, NULL, 0, NULL); NULL, NULL, NULL, NULL, NULL, 0, NULL);
printf("%f == 12.7\n", d); printf("%f == 12.7\n", d);
ff_parse_and_eval_expr(&d, "80G/80Gi", av_parse_and_eval_expr(&d, "80G/80Gi",
const_names, const_values, const_names, const_values,
NULL, NULL, NULL, NULL, NULL, 0, NULL); NULL, NULL, NULL, NULL, NULL, 0, NULL);
printf("%f == 0.931322575\n", d); printf("%f == 0.931322575\n", d);
for (i=0; i<1050; i++) { for (i=0; i<1050; i++) {
START_TIMER START_TIMER
ff_parse_and_eval_expr(&d, "1+(5-2)^(3-1)+1/2+sin(PI)-max(-2.2,-3.1)", av_parse_and_eval_expr(&d, "1+(5-2)^(3-1)+1/2+sin(PI)-max(-2.2,-3.1)",
const_names, const_values, const_names, const_values,
NULL, NULL, NULL, NULL, NULL, 0, NULL); NULL, NULL, NULL, NULL, NULL, 0, NULL);
STOP_TIMER("ff_parse_and_eval_expr") STOP_TIMER("av_parse_and_eval_expr")
} }
return 0; return 0;
} }
......
...@@ -23,14 +23,14 @@ ...@@ -23,14 +23,14 @@
* simple arithmetic expression evaluator * simple arithmetic expression evaluator
*/ */
#ifndef AVCODEC_EVAL_H #ifndef AVUTIL_EVAL_H
#define AVCODEC_EVAL_H #define AVUTIL_EVAL_H
typedef struct AVExpr AVExpr; typedef struct AVExpr AVExpr;
/** /**
* Parses and evaluates an expression. * Parses and evaluates an expression.
* Note, this is significantly slower than ff_eval_expr(). * Note, this is significantly slower than av_eval_expr().
* *
* @param res a pointer to a double where is put the result value of * @param res a pointer to a double where is put the result value of
* the expression, or NAN in case of error * the expression, or NAN in case of error
...@@ -46,7 +46,7 @@ typedef struct AVExpr AVExpr; ...@@ -46,7 +46,7 @@ typedef struct AVExpr AVExpr;
* @return 0 in case of success, a negative value corresponding to an * @return 0 in case of success, a negative value corresponding to an
* AVERROR code otherwise * AVERROR code otherwise
*/ */
int ff_parse_and_eval_expr(double *res, const char *s, int av_parse_and_eval_expr(double *res, const char *s,
const char * const *const_names, const double *const_values, const char * const *const_names, const double *const_values,
const char * const *func1_names, double (* const *funcs1)(void *, double), const char * const *func1_names, double (* const *funcs1)(void *, double),
const char * const *func2_names, double (* const *funcs2)(void *, double, double), const char * const *func2_names, double (* const *funcs2)(void *, double, double),
...@@ -57,7 +57,7 @@ int ff_parse_and_eval_expr(double *res, const char *s, ...@@ -57,7 +57,7 @@ int ff_parse_and_eval_expr(double *res, const char *s,
* *
* @param expr a pointer where is put an AVExpr containing the parsed * @param expr a pointer where is put an AVExpr containing the parsed
* value in case of successfull parsing, or NULL otherwise. * value in case of successfull parsing, or NULL otherwise.
* The pointed to AVExpr must be freed with ff_free_expr() by the user * The pointed to AVExpr must be freed with av_free_expr() by the user
* when it is not needed anymore. * when it is not needed anymore.
* @param s expression as a zero terminated string, for example "1+2^3+5*5+sin(2/3)" * @param s expression as a zero terminated string, for example "1+2^3+5*5+sin(2/3)"
* @param const_names NULL terminated array of zero terminated strings of constant identifiers, for example {"PI", "E", 0} * @param const_names NULL terminated array of zero terminated strings of constant identifiers, for example {"PI", "E", 0}
...@@ -69,7 +69,7 @@ int ff_parse_and_eval_expr(double *res, const char *s, ...@@ -69,7 +69,7 @@ int ff_parse_and_eval_expr(double *res, const char *s,
* @return 0 in case of success, a negative value corresponding to an * @return 0 in case of success, a negative value corresponding to an
* AVERROR code otherwise * AVERROR code otherwise
*/ */
int ff_parse_expr(AVExpr **expr, const char *s, int av_parse_expr(AVExpr **expr, const char *s,
const char * const *const_names, const char * const *const_names,
const char * const *func1_names, double (* const *funcs1)(void *, double), const char * const *func1_names, double (* const *funcs1)(void *, double),
const char * const *func2_names, double (* const *funcs2)(void *, double, double), const char * const *func2_names, double (* const *funcs2)(void *, double, double),
...@@ -78,16 +78,16 @@ int ff_parse_expr(AVExpr **expr, const char *s, ...@@ -78,16 +78,16 @@ int ff_parse_expr(AVExpr **expr, const char *s,
/** /**
* Evaluates a previously parsed expression. * Evaluates a previously parsed expression.
* *
* @param const_values a zero terminated array of values for the identifiers from ff_parse() const_names * @param const_values a zero terminated array of values for the identifiers from av_parse_expr() const_names
* @param opaque a pointer which will be passed to all functions from funcs1 and funcs2 * @param opaque a pointer which will be passed to all functions from funcs1 and funcs2
* @return the value of the expression * @return the value of the expression
*/ */
double ff_eval_expr(AVExpr *e, const double *const_values, void *opaque); double av_eval_expr(AVExpr *e, const double *const_values, void *opaque);
/** /**
* Frees a parsed expression previously created with ff_parse_expr(). * Frees a parsed expression previously created with av_parse_expr().
*/ */
void ff_free_expr(AVExpr *e); void av_free_expr(AVExpr *e);
/** /**
* Parses the string in numstr and returns its value as a double. If * Parses the string in numstr and returns its value as a double. If
...@@ -108,4 +108,4 @@ void ff_free_expr(AVExpr *e); ...@@ -108,4 +108,4 @@ void ff_free_expr(AVExpr *e);
*/ */
double av_strtod(const char *numstr, char **tail); double av_strtod(const char *numstr, char **tail);
#endif /* AVCODEC_EVAL_H */ #endif /* AVUTIL_EVAL_H */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment