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:
parent
6120a343aa
commit
7b1454c439
@ -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, \
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user