diff options
author | Stefano Sabatini <stefano.sabatini-lala@poste.it> | 2008-12-16 21:35:35 +0000 |
---|---|---|
committer | Stefano Sabatini <stefano.sabatini-lala@poste.it> | 2008-12-16 21:35:35 +0000 |
commit | 7b1454c43942e014f43c30f3ebc5467436254f65 (patch) | |
tree | 9fd9a0376f3f3d5fcf6ff951777bc5e8a0cfefef | |
parent | 6120a343aa40a0bd895436570d3738f111901563 (diff) | |
download | ffmpeg-7b1454c43942e014f43c30f3ebc5467436254f65.tar.gz |
Implement av_set_string3().
Originally committed as revision 16175 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r-- | libavcodec/avcodec.h | 4 | ||||
-rw-r--r-- | libavcodec/opt.c | 35 | ||||
-rw-r--r-- | libavcodec/opt.h | 17 |
3 files changed, 39 insertions, 17 deletions
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 85448d8c6f..d98d2f21a9 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 d42c0b9c42..dbe05b3194 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 e830432109..c3e716ba96 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); |