# HG changeset patch # User stefano # Date 1229463335 0 # Node ID 0030146fc2ba172028eb4ac5062d9b27148387be # Parent 179f8e1327ce27878314d6ad1e8108fa3ad7ba1c Implement av_set_string3(). diff -r 179f8e1327ce -r 0030146fc2ba avcodec.h --- a/avcodec.h Tue Dec 16 21:08:16 2008 +0000 +++ b/avcodec.h Tue Dec 16 21:35:35 2008 +0000 @@ -30,8 +30,8 @@ #include "libavutil/avutil.h" #define LIBAVCODEC_VERSION_MAJOR 52 -#define LIBAVCODEC_VERSION_MINOR 6 -#define LIBAVCODEC_VERSION_MICRO 3 +#define LIBAVCODEC_VERSION_MINOR 7 +#define LIBAVCODEC_VERSION_MICRO 0 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ LIBAVCODEC_VERSION_MINOR, \ diff -r 179f8e1327ce -r 0030146fc2ba opt.c --- 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; } diff -r 179f8e1327ce -r 0030146fc2ba opt.h --- a/opt.h Tue Dec 16 21:08:16 2008 +0000 +++ b/opt.h Tue Dec 16 21:35:35 2008 +0000 @@ -105,6 +105,14 @@ attribute_deprecated const AVOption *av_set_string(void *obj, const char *name, const char *val); /** + * @return a pointer to the AVOption corresponding to the field set or + * NULL if no matching AVOption exists, or if the value \p val is not + * valid + * @see av_set_string3() + */ +attribute_deprecated const AVOption *av_set_string2(void *obj, const char *name, const char *val, int alloc); + +/** * Sets the field of obj with the given name to value. * * @param[in] obj A struct whose first element is a pointer to an @@ -120,14 +128,15 @@ * scalars or named flags separated by '+' or '-'. Prefixing a flag * with '+' causes it to be set without affecting the other flags; * similarly, '-' unsets a flag. - * @return a pointer to the AVOption corresponding to the field set or - * NULL if no matching AVOption exists, or if the value \p val is not - * valid + * @param[out] o_out if non-NULL put here a pointer to the AVOption + * found * @param alloc when 1 then the old value will be av_freed() and the * new av_strduped() * when 0 then no av_free() nor av_strdup() will be used + * @return 0 if the value has been set, an AVERROR* error code if no + * matching option exists, or if the value \p val is not valid */ -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); const AVOption *av_set_double(void *obj, const char *name, double n); const AVOption *av_set_q(void *obj, const char *name, AVRational n);