1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2024-11-26 19:01:44 +02:00

Implement av_set_string3().

Originally committed as revision 16175 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Stefano Sabatini 2008-12-16 21:35:35 +00:00
parent 6120a343aa
commit 7b1454c439
3 changed files with 39 additions and 17 deletions

View File

@ -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, \

View File

@ -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;
}

View File

@ -104,6 +104,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.
*
@ -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);