X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Feval.c;h=335ea5f0e49559f4c541ff8943ad604f73b0629a;hb=437f884da6ae8faddb4ba88582a28397f5e8a753;hp=961c8b5accca8432a1159a86ffaa698f614b8f66;hpb=3cedeeca02b7bc6f0de1849bbdad4e4961bcc027;p=ffmpeg diff --git a/libavcodec/eval.c b/libavcodec/eval.c index 961c8b5accc..335ea5f0e49 100644 --- a/libavcodec/eval.c +++ b/libavcodec/eval.c @@ -19,18 +19,16 @@ * You should have received a copy of the GNU Lesser General Public * License along with FFmpeg; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * */ /** - * @file eval.c + * @file libavcodec/eval.c * simple arithmetic expression evaluator. * * see http://joe.hotchkiss.com/programming/eval/eval.html */ #include "avcodec.h" -#include "mpegvideo.h" #include "eval.h" #include @@ -49,19 +47,19 @@ typedef struct Parser{ int stack_index; char *s; - double *const_value; - const char **const_name; // NULL terminated + const double *const_value; + const char * const *const_name; // NULL terminated double (**func1)(void *, double a); // NULL terminated const char **func1_name; // NULL terminated double (**func2)(void *, double a, double b); // NULL terminated - char **func2_name; // NULL terminated + const char **func2_name; // NULL terminated void *opaque; - char **error; + const char **error; #define VARS 10 double var[VARS]; } Parser; -static int8_t si_prefixes['z' - 'E' + 1]={ +static const int8_t si_prefixes['z' - 'E' + 1]={ ['y'-'E']= -24, ['z'-'E']= -21, ['a'-'E']= -18, @@ -110,7 +108,7 @@ static double av_strtod(const char *name, char **tail) { if(*next=='B') { d*=8; - *next++; + next++; } } /* if requested, fill in tail with the position after the last parsed @@ -155,7 +153,7 @@ static double eval_expr(Parser * p, AVEvalExpr * e) { 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_squish: return 1/(1+exp(4*eval_expr(p, e->param[0]))); case e_gauss: { double d = eval_expr(p, e->param[0]); return exp(-d*d/2)/sqrt(2*M_PI); } - case e_ld: return e->value * p->var[clip(eval_expr(p, e->param[0]), 0, VARS-1)]; + case e_ld: return e->value * p->var[av_clip(eval_expr(p, e->param[0]), 0, VARS-1)]; case e_while: { double d = NAN; while(eval_expr(p, e->param[0])) @@ -177,7 +175,7 @@ static double eval_expr(Parser * p, AVEvalExpr * e) { case e_div: return e->value * (d / d2); case e_add: return e->value * (d + d2); case e_last:return e->value * d2; - case e_st : return e->value * (p->var[clip(d, 0, VARS-1)]= d2); + case e_st : return e->value * (p->var[av_clip(d, 0, VARS-1)]= d2); } } } @@ -219,7 +217,7 @@ static AVEvalExpr * parse_primary(Parser *p) { p->s= strchr(p->s, '('); if(p->s==NULL){ - *p->error = "missing ("; + *p->error = "undefined constant or missing ("; p->s= next; ff_eval_free(d); return NULL; @@ -377,10 +375,10 @@ static int verify_expr(AVEvalExpr * e) { } } -AVEvalExpr * ff_parse(char *s, const char **const_name, +AVEvalExpr * ff_parse(const char *s, const char * const *const_name, double (**func1)(void *, double), const char **func1_name, - double (**func2)(void *, double, double), char **func2_name, - char **error){ + double (**func2)(void *, double, double), const char **func2_name, + const char **error){ Parser p; AVEvalExpr * e; char w[strlen(s) + 1], * wp = w; @@ -406,7 +404,7 @@ AVEvalExpr * ff_parse(char *s, const char **const_name, return e; } -double ff_parse_eval(AVEvalExpr * e, double *const_value, void *opaque) { +double ff_parse_eval(AVEvalExpr * e, const double *const_value, void *opaque) { Parser p; p.const_value= const_value; @@ -414,10 +412,10 @@ double ff_parse_eval(AVEvalExpr * e, double *const_value, void *opaque) { return eval_expr(&p, e); } -double ff_eval2(char *s, double *const_value, const char **const_name, +double ff_eval2(const char *s, const double *const_value, const char * const *const_name, double (**func1)(void *, double), const char **func1_name, - double (**func2)(void *, double, double), char **func2_name, - void *opaque, char **error){ + double (**func2)(void *, double, double), const char **func2_name, + void *opaque, const char **error){ AVEvalExpr * e = ff_parse(s, const_name, func1, func1_name, func2, func2_name, error); double d; if (!e) return NAN; @@ -426,20 +424,6 @@ double ff_eval2(char *s, double *const_value, const char **const_name, return d; } -#if LIBAVCODEC_VERSION_INT < ((52<<16)+(0<<8)+0) -attribute_deprecated double ff_eval(char *s, double *const_value, const char **const_name, - double (**func1)(void *, double), const char **func1_name, - double (**func2)(void *, double, double), char **func2_name, - void *opaque){ - char *error=NULL; - double ret; - ret = ff_eval2(s, const_value, const_name, func1, func1_name, func2, func2_name, opaque, &error); - if (error) - av_log(NULL, AV_LOG_ERROR, "Error evaluating \"%s\": %s\n", s, error); - return ret; -} -#endif - #ifdef TEST #undef printf static double const_values[]={ @@ -452,15 +436,16 @@ static const char *const_names[]={ "E", 0 }; -main(){ +int main(void){ int i; - printf("%f == 12.7\n", ff_eval("1+(5-2)^(3-1)+1/2+sin(PI)-max(-2.2,-3.1)", const_values, const_names, NULL, NULL, NULL, NULL, NULL)); - printf("%f == 0.931322575\n", ff_eval("80G/80Gi", const_values, const_names, NULL, NULL, NULL, NULL, NULL)); + printf("%f == 12.7\n", ff_eval2("1+(5-2)^(3-1)+1/2+sin(PI)-max(-2.2,-3.1)", const_values, const_names, NULL, NULL, NULL, NULL, NULL, NULL)); + printf("%f == 0.931322575\n", ff_eval2("80G/80Gi", const_values, const_names, NULL, NULL, NULL, NULL, NULL, NULL)); for(i=0; i<1050; i++){ START_TIMER - ff_eval("1+(5-2)^(3-1)+1/2+sin(PI)-max(-2.2,-3.1)", const_values, const_names, NULL, NULL, NULL, NULL, NULL); - STOP_TIMER("ff_eval") + ff_eval2("1+(5-2)^(3-1)+1/2+sin(PI)-max(-2.2,-3.1)", const_values, const_names, NULL, NULL, NULL, NULL, NULL, NULL); + STOP_TIMER("ff_eval2") } + return 0; } #endif