From: Stefano Sabatini Date: Tue, 16 Dec 2008 21:35:35 +0000 (+0000) Subject: Implement av_set_string3(). X-Git-Tag: v0.5~1617 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=7b1454c43942e014f43c30f3ebc5467436254f65;p=platform%2Fupstream%2Flibav.git Implement av_set_string3(). Originally committed as revision 16175 to svn://svn.ffmpeg.org/ffmpeg/trunk --- diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 85448d8..d98d2f2 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -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 --git a/libavcodec/opt.c b/libavcodec/opt.c index d42c0b9..dbe05b3 100644 --- a/libavcodec/opt.c +++ b/libavcodec/opt.c @@ -107,10 +107,16 @@ static int hexchar2int(char c) { 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 @@ const AVOption *av_set_string2(void *obj, const char *name, const char *val, int 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 @@ const AVOption *av_set_string2(void *obj, const char *name, const char *val, int 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 @@ const AVOption *av_set_string2(void *obj, const char *name, const char *val, int 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 @@ const AVOption *av_set_string2(void *obj, const char *name, const char *val, int 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 @@ const AVOption *av_set_string2(void *obj, const char *name, const char *val, int } 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 --git a/libavcodec/opt.h b/libavcodec/opt.h index e830432..c3e716b 100644 --- a/libavcodec/opt.h +++ b/libavcodec/opt.h @@ -105,6 +105,14 @@ const AVOption *av_find_opt(void *obj, const char *name, const char *unit, int m 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 @@ attribute_deprecated const AVOption *av_set_string(void *obj, const char *name, * 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);