1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * This file is part of FFmpeg. 3cabdff1aSopenharmony_ci * 4cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 5cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 6cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 7cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 8cabdff1aSopenharmony_ci * 9cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 10cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 11cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12cabdff1aSopenharmony_ci * Lesser General Public License for more details. 13cabdff1aSopenharmony_ci * 14cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 15cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 16cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 17cabdff1aSopenharmony_ci */ 18cabdff1aSopenharmony_ci 19cabdff1aSopenharmony_ci#include "libavutil/timer.h" 20cabdff1aSopenharmony_ci 21cabdff1aSopenharmony_ci#include <math.h> 22cabdff1aSopenharmony_ci#include <stdio.h> 23cabdff1aSopenharmony_ci#include <string.h> 24cabdff1aSopenharmony_ci 25cabdff1aSopenharmony_ci#include "libavutil/libm.h" 26cabdff1aSopenharmony_ci#include "libavutil/eval.h" 27cabdff1aSopenharmony_ci 28cabdff1aSopenharmony_cistatic const double const_values[] = { 29cabdff1aSopenharmony_ci M_PI, 30cabdff1aSopenharmony_ci M_E, 31cabdff1aSopenharmony_ci 0 32cabdff1aSopenharmony_ci}; 33cabdff1aSopenharmony_ci 34cabdff1aSopenharmony_cistatic const char *const const_names[] = { 35cabdff1aSopenharmony_ci "PI", 36cabdff1aSopenharmony_ci "E", 37cabdff1aSopenharmony_ci 0 38cabdff1aSopenharmony_ci}; 39cabdff1aSopenharmony_ci 40cabdff1aSopenharmony_ciint main(int argc, char **argv) 41cabdff1aSopenharmony_ci{ 42cabdff1aSopenharmony_ci int i; 43cabdff1aSopenharmony_ci double d; 44cabdff1aSopenharmony_ci const char *const *expr; 45cabdff1aSopenharmony_ci static const char *const exprs[] = { 46cabdff1aSopenharmony_ci "", 47cabdff1aSopenharmony_ci "1;2", 48cabdff1aSopenharmony_ci "-20", 49cabdff1aSopenharmony_ci "-PI", 50cabdff1aSopenharmony_ci "+PI", 51cabdff1aSopenharmony_ci "1+(5-2)^(3-1)+1/2+sin(PI)-max(-2.2,-3.1)", 52cabdff1aSopenharmony_ci "80G/80Gi", 53cabdff1aSopenharmony_ci "1k", 54cabdff1aSopenharmony_ci "1Gi", 55cabdff1aSopenharmony_ci "1gi", 56cabdff1aSopenharmony_ci "1GiFoo", 57cabdff1aSopenharmony_ci "1k+1k", 58cabdff1aSopenharmony_ci "1Gi*3foo", 59cabdff1aSopenharmony_ci "foo", 60cabdff1aSopenharmony_ci "foo(", 61cabdff1aSopenharmony_ci "foo()", 62cabdff1aSopenharmony_ci "foo)", 63cabdff1aSopenharmony_ci "sin", 64cabdff1aSopenharmony_ci "sin(", 65cabdff1aSopenharmony_ci "sin()", 66cabdff1aSopenharmony_ci "sin)", 67cabdff1aSopenharmony_ci "sin 10", 68cabdff1aSopenharmony_ci "sin(1,2,3)", 69cabdff1aSopenharmony_ci "sin(1 )", 70cabdff1aSopenharmony_ci "1", 71cabdff1aSopenharmony_ci "1foo", 72cabdff1aSopenharmony_ci "bar + PI + E + 100f*2 + foo", 73cabdff1aSopenharmony_ci "13k + 12f - foo(1, 2)", 74cabdff1aSopenharmony_ci "1gi", 75cabdff1aSopenharmony_ci "1Gi", 76cabdff1aSopenharmony_ci "st(0, 123)", 77cabdff1aSopenharmony_ci "st(1, 123); ld(1)", 78cabdff1aSopenharmony_ci "lte(0, 1)", 79cabdff1aSopenharmony_ci "lte(1, 1)", 80cabdff1aSopenharmony_ci "lte(1, 0)", 81cabdff1aSopenharmony_ci "lt(0, 1)", 82cabdff1aSopenharmony_ci "lt(1, 1)", 83cabdff1aSopenharmony_ci "gt(1, 0)", 84cabdff1aSopenharmony_ci "gt(2, 7)", 85cabdff1aSopenharmony_ci "gte(122, 122)", 86cabdff1aSopenharmony_ci /* compute 1+2+...+N */ 87cabdff1aSopenharmony_ci "st(0, 1); while(lte(ld(0), 100), st(1, ld(1)+ld(0));st(0, ld(0)+1)); ld(1)", 88cabdff1aSopenharmony_ci /* compute Fib(N) */ 89cabdff1aSopenharmony_ci "st(1, 1); st(2, 2); st(0, 1); while(lte(ld(0),10), st(3, ld(1)+ld(2)); st(1, ld(2)); st(2, ld(3)); st(0, ld(0)+1)); ld(3)", 90cabdff1aSopenharmony_ci "while(0, 10)", 91cabdff1aSopenharmony_ci "st(0, 1); while(lte(ld(0),100), st(1, ld(1)+ld(0)); st(0, ld(0)+1))", 92cabdff1aSopenharmony_ci "isnan(1)", 93cabdff1aSopenharmony_ci "isnan(NAN)", 94cabdff1aSopenharmony_ci "isnan(INF)", 95cabdff1aSopenharmony_ci "isinf(1)", 96cabdff1aSopenharmony_ci "isinf(NAN)", 97cabdff1aSopenharmony_ci "isinf(INF)", 98cabdff1aSopenharmony_ci "floor(NAN)", 99cabdff1aSopenharmony_ci "floor(123.123)", 100cabdff1aSopenharmony_ci "floor(-123.123)", 101cabdff1aSopenharmony_ci "trunc(123.123)", 102cabdff1aSopenharmony_ci "trunc(-123.123)", 103cabdff1aSopenharmony_ci "ceil(123.123)", 104cabdff1aSopenharmony_ci "ceil(-123.123)", 105cabdff1aSopenharmony_ci "sqrt(1764)", 106cabdff1aSopenharmony_ci "isnan(sqrt(-1))", 107cabdff1aSopenharmony_ci "not(1)", 108cabdff1aSopenharmony_ci "not(NAN)", 109cabdff1aSopenharmony_ci "not(0)", 110cabdff1aSopenharmony_ci "6.0206dB", 111cabdff1aSopenharmony_ci "-3.0103dB", 112cabdff1aSopenharmony_ci "pow(0,1.23)", 113cabdff1aSopenharmony_ci "pow(PI,1.23)", 114cabdff1aSopenharmony_ci "PI^1.23", 115cabdff1aSopenharmony_ci "pow(-1,1.23)", 116cabdff1aSopenharmony_ci "if(1, 2)", 117cabdff1aSopenharmony_ci "if(1, 1, 2)", 118cabdff1aSopenharmony_ci "if(0, 1, 2)", 119cabdff1aSopenharmony_ci "ifnot(0, 23)", 120cabdff1aSopenharmony_ci "ifnot(1, NaN) + if(0, 1)", 121cabdff1aSopenharmony_ci "ifnot(1, 1, 2)", 122cabdff1aSopenharmony_ci "ifnot(0, 1, 2)", 123cabdff1aSopenharmony_ci "taylor(1, 1)", 124cabdff1aSopenharmony_ci "taylor(eq(mod(ld(1),4),1)-eq(mod(ld(1),4),3), PI/2, 1)", 125cabdff1aSopenharmony_ci "root(sin(ld(0))-1, 2)", 126cabdff1aSopenharmony_ci "root(sin(ld(0))+6+sin(ld(0)/12)-log(ld(0)), 100)", 127cabdff1aSopenharmony_ci "7000000B*random(0)", 128cabdff1aSopenharmony_ci "squish(2)", 129cabdff1aSopenharmony_ci "gauss(0.1)", 130cabdff1aSopenharmony_ci "hypot(4,3)", 131cabdff1aSopenharmony_ci "gcd(30,55)*print(min(9,1))", 132cabdff1aSopenharmony_ci "bitor(42, 12)", 133cabdff1aSopenharmony_ci "bitand(42, 12)", 134cabdff1aSopenharmony_ci "bitand(NAN, 1)", 135cabdff1aSopenharmony_ci "between(10, -3, 10)", 136cabdff1aSopenharmony_ci "between(-4, -2, -1)", 137cabdff1aSopenharmony_ci "between(1,2)", 138cabdff1aSopenharmony_ci "clip(0, 2, 1)", 139cabdff1aSopenharmony_ci "clip(0/0, 1, 2)", 140cabdff1aSopenharmony_ci "clip(0, 0/0, 1)", 141cabdff1aSopenharmony_ci NULL 142cabdff1aSopenharmony_ci }; 143cabdff1aSopenharmony_ci int ret; 144cabdff1aSopenharmony_ci 145cabdff1aSopenharmony_ci for (expr = exprs; *expr; expr++) { 146cabdff1aSopenharmony_ci printf("Evaluating '%s'\n", *expr); 147cabdff1aSopenharmony_ci ret = av_expr_parse_and_eval(&d, *expr, 148cabdff1aSopenharmony_ci const_names, const_values, 149cabdff1aSopenharmony_ci NULL, NULL, NULL, NULL, NULL, 0, NULL); 150cabdff1aSopenharmony_ci if (isnan(d)) 151cabdff1aSopenharmony_ci printf("'%s' -> nan\n\n", *expr); 152cabdff1aSopenharmony_ci else 153cabdff1aSopenharmony_ci printf("'%s' -> %f\n\n", *expr, d); 154cabdff1aSopenharmony_ci if (ret < 0) 155cabdff1aSopenharmony_ci printf("av_expr_parse_and_eval failed\n"); 156cabdff1aSopenharmony_ci } 157cabdff1aSopenharmony_ci 158cabdff1aSopenharmony_ci ret = av_expr_parse_and_eval(&d, "1+(5-2)^(3-1)+1/2+sin(PI)-max(-2.2,-3.1)", 159cabdff1aSopenharmony_ci const_names, const_values, 160cabdff1aSopenharmony_ci NULL, NULL, NULL, NULL, NULL, 0, NULL); 161cabdff1aSopenharmony_ci printf("%f == 12.7\n", d); 162cabdff1aSopenharmony_ci if (ret < 0) 163cabdff1aSopenharmony_ci printf("av_expr_parse_and_eval failed\n"); 164cabdff1aSopenharmony_ci ret = av_expr_parse_and_eval(&d, "80G/80Gi", 165cabdff1aSopenharmony_ci const_names, const_values, 166cabdff1aSopenharmony_ci NULL, NULL, NULL, NULL, NULL, 0, NULL); 167cabdff1aSopenharmony_ci printf("%f == 0.931322575\n", d); 168cabdff1aSopenharmony_ci if (ret < 0) 169cabdff1aSopenharmony_ci printf("av_expr_parse_and_eval failed\n"); 170cabdff1aSopenharmony_ci 171cabdff1aSopenharmony_ci if (argc > 1 && !strcmp(argv[1], "-t")) { 172cabdff1aSopenharmony_ci for (i = 0; i < 1050; i++) { 173cabdff1aSopenharmony_ci START_TIMER; 174cabdff1aSopenharmony_ci ret = av_expr_parse_and_eval(&d, "1+(5-2)^(3-1)+1/2+sin(PI)-max(-2.2,-3.1)", 175cabdff1aSopenharmony_ci const_names, const_values, 176cabdff1aSopenharmony_ci NULL, NULL, NULL, NULL, NULL, 0, NULL); 177cabdff1aSopenharmony_ci if (ret < 0) 178cabdff1aSopenharmony_ci printf("av_expr_parse_and_eval failed\n"); 179cabdff1aSopenharmony_ci STOP_TIMER("av_expr_parse_and_eval"); 180cabdff1aSopenharmony_ci } 181cabdff1aSopenharmony_ci } 182cabdff1aSopenharmony_ci 183cabdff1aSopenharmony_ci return 0; 184cabdff1aSopenharmony_ci} 185