Mercurial > libavcodec.hg
diff opt.c @ 8356:0030146fc2ba libavcodec
Implement av_set_string3().
author | stefano |
---|---|
date | Tue, 16 Dec 2008 21:35:35 +0000 |
parents | 844463c05193 |
children | ea27308fa023 |
line wrap: on
line diff
--- a/opt.c Tue Dec 16 21:08:16 2008 +0000 +++ b/opt.c Tue Dec 16 21:35:35 2008 +0000 @@ -107,10 +107,16 @@ return -1; } -const AVOption *av_set_string2(void *obj, const char *name, const char *val, int alloc){ +int av_set_string3(void *obj, const char *name, const char *val, int alloc, const AVOption **o_out){ + int ret; const AVOption *o= av_find_opt(obj, name, NULL, 0, 0); - if(!o || !val || o->offset<=0) - return NULL; + if (o_out) + *o_out = o; + if(!o) + return AVERROR(ENOENT); + if(!val || o->offset<=0) + return AVERROR(EINVAL); + if(o->type == FF_OPT_TYPE_BINARY){ uint8_t **dst = (uint8_t **)(((uint8_t*)obj) + o->offset); int *lendst = (int *)(dst + 1); @@ -118,7 +124,7 @@ int len = strlen(val); av_freep(dst); *lendst = 0; - if (len & 1) return NULL; + if (len & 1) return AVERROR(EINVAL); len /= 2; ptr = bin = av_malloc(len); while (*val) { @@ -126,13 +132,13 @@ int b = hexchar2int(*val++); if (a < 0 || b < 0) { av_free(bin); - return NULL; + return AVERROR(EINVAL); } *ptr++ = (a << 4) | b; } *dst = bin; *lendst = len; - return o; + return 0; } if(o->type != FF_OPT_TYPE_STRING){ int notfirst=0; @@ -163,7 +169,7 @@ else { if (error) av_log(NULL, AV_LOG_ERROR, "Unable to parse option value \"%s\": %s\n", val, error); - return NULL; + return AVERROR(EINVAL); } } if(o->type == FF_OPT_TYPE_FLAGS){ @@ -174,14 +180,14 @@ else if(cmd=='-') d= notfirst*av_get_double(obj, name, NULL) - d; } - if (!av_set_number(obj, name, d, 1, 1)) - return NULL; + if ((ret = av_set_number2(obj, name, d, 1, 1, o_out)) < 0) + return ret; val+= i; if(!*val) - return o; + return 0; notfirst=1; } - return NULL; + return AVERROR(EINVAL); } if(alloc){ @@ -190,6 +196,13 @@ } memcpy(((uint8_t*)obj) + o->offset, &val, sizeof(val)); + return 0; +} + +const AVOption *av_set_string2(void *obj, const char *name, const char *val, int alloc){ + const AVOption *o; + if (av_set_string3(obj, name, val, alloc, &o) < 0) + return NULL; return o; }