diff options
author | Panagiotis Issaris <takis.issaris@uhasselt.be> | 2006-09-27 20:01:39 +0000 |
---|---|---|
committer | Panagiotis Issaris <takis.issaris@uhasselt.be> | 2006-09-27 20:01:39 +0000 |
commit | 95c99430819c60d3365350875d2283e324d5af3a (patch) | |
tree | c2db462b064309ea593183f819a8d080672c4e3b /libavcodec/opt.c | |
parent | 62bb489b13c1f7967946bf538492dce0af1150fe (diff) | |
download | ffmpeg-95c99430819c60d3365350875d2283e324d5af3a.tar.gz |
Make AVOption parsign code use ff_eval2()
Originally committed as revision 6357 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/opt.c')
-rw-r--r-- | libavcodec/opt.c | 97 |
1 files changed, 24 insertions, 73 deletions
diff --git a/libavcodec/opt.c b/libavcodec/opt.c index 10528e8ab4..f85b29f8ab 100644 --- a/libavcodec/opt.c +++ b/libavcodec/opt.c @@ -26,74 +26,7 @@ #include "avcodec.h" #include "opt.h" - -static int8_t si_prefixes['z' - 'E' + 1]={ - ['y'-'E']= -24, - ['z'-'E']= -21, - ['a'-'E']= -18, - ['f'-'E']= -15, - ['p'-'E']= -12, - ['n'-'E']= - 9, - ['u'-'E']= - 6, - ['m'-'E']= - 3, - ['c'-'E']= - 2, - ['d'-'E']= - 1, - ['h'-'E']= 2, - ['k'-'E']= 3, - ['K'-'E']= 3, - ['M'-'E']= 6, - ['G'-'E']= 9, - ['T'-'E']= 12, - ['P'-'E']= 15, - ['E'-'E']= 18, - ['Z'-'E']= 21, - ['Y'-'E']= 24, -}; - -/** strtod() function extended with 'k', 'M', 'G', 'ki', 'Mi', 'Gi' and 'B' - * postfixes. This allows using f.e. kB, MiB, G and B as a postfix. This - * function assumes that the unit of numbers is bits not bytes. - */ -double av_strtod(const char *name, char **tail) { - double d; - int p = 0; - char *next; - d = strtod(name, &next); - /* if parsing succeeded, check for and interpret postfixes */ - if (next!=name) { - - if(*next >= 'E' && *next <= 'z'){ - int e= si_prefixes[*next - 'E']; - if(e){ - if(next[1] == 'i'){ - d*= pow( 2, e/0.3); - next+=2; - }else{ - d*= pow(10, e); - next++; - } - } - } - - if(*next=='B') { - d*=8; - *next++; - } - } - /* if requested, fill in tail with the position after the last parsed - character */ - if (tail) - *tail = next; - return d; -} - -static double av_parse_num(const char *name, char **tail){ - double d; - d= av_strtod(name, tail); - if(*tail>name && (**tail=='/' || **tail==':')) - d/=av_strtod((*tail)+1, tail); - return d; -} +#include "mpegvideo.h" //FIXME order them and do a bin search static AVOption *find_opt(void *v, const char *name, const char *unit){ @@ -159,7 +92,20 @@ static AVOption *set_all_opt(void *v, const char *unit, double d){ return ret; } -//FIXME use eval.c maybe? +static double const_values[]={ + M_PI, + M_E, + FF_QP2LAMBDA, + 0 +}; + +static const char *const_names[]={ + "PI", + "E", + "QP2LAMBDA", + 0 +}; + AVOption *av_set_string(void *obj, const char *name, const char *val){ AVOption *o= find_opt(obj, name, NULL); if(o && o->offset==0 && o->type == FF_OPT_TYPE_CONST && o->unit){ @@ -170,9 +116,10 @@ AVOption *av_set_string(void *obj, const char *name, const char *val){ if(o->type != FF_OPT_TYPE_STRING){ for(;;){ int i; - char buf[256], *tail; + char buf[256]; int cmd=0; double d; + char *error = NULL; if(*val == '+' || *val == '-') cmd= *(val++); @@ -182,15 +129,19 @@ AVOption *av_set_string(void *obj, const char *name, const char *val){ buf[i]=0; val+= i; - d= av_parse_num(buf, &tail); - if(tail <= buf){ + d = ff_eval2(buf, const_values, const_names, NULL, NULL, NULL, NULL, NULL, &error); + if(isnan(d)) { AVOption *o_named= find_opt(obj, buf, o->unit); if(o_named && o_named->type == FF_OPT_TYPE_CONST) d= o_named->default_val; else if(!strcmp(buf, "default")) d= o->default_val; else if(!strcmp(buf, "max" )) d= o->max; else if(!strcmp(buf, "min" )) d= o->min; - else return NULL; + else { + if (!error) + av_log(NULL, AV_LOG_ERROR, "Unable to parse option value \"%s\": %s\n", val, error); + return NULL; + } } if(o->type == FF_OPT_TYPE_FLAGS){ if (cmd=='+') d= av_get_int(obj, name, NULL) | (int64_t)d; |