Mercurial > libavcodec.hg
changeset 7224:d5a52b28c9de libavcodec
Fix the av_set_string() free / alloc issue.
author | michael |
---|---|
date | Tue, 08 Jul 2008 23:50:03 +0000 |
parents | 0133a6c7480f |
children | f8b6ec3e5538 |
files | opt.c opt.h |
diffstat | 2 files changed, 21 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/opt.c Tue Jul 08 16:02:20 2008 +0000 +++ b/opt.c Tue Jul 08 23:50:03 2008 +0000 @@ -115,7 +115,7 @@ return -1; } -const AVOption *av_set_string(void *obj, const char *name, const char *val){ +const AVOption *av_set_string2(void *obj, const char *name, const char *val, int alloc){ const AVOption *o= av_find_opt(obj, name, NULL, 0, 0); if(o && o->offset==0 && o->type == FF_OPT_TYPE_CONST && o->unit){ return set_all_opt(obj, o->unit, o->default_val); @@ -195,10 +195,19 @@ return NULL; } + if(alloc){ + av_free((void*)(((uint8_t*)obj) + o->offset)); + val= av_strdup(val); + } + memcpy(((uint8_t*)obj) + o->offset, &val, sizeof(val)); return o; } +const AVOption *av_set_string(void *obj, const char *name, const char *val){ + return av_set_string2(obj, name, val, 0); +} + const AVOption *av_set_double(void *obj, const char *name, double n){ return av_set_number(obj, name, n, 1, 1); }
--- a/opt.h Tue Jul 08 16:02:20 2008 +0000 +++ b/opt.h Tue Jul 08 23:50:03 2008 +0000 @@ -98,7 +98,17 @@ * has been found */ const AVOption *av_find_opt(void *obj, const char *name, const char *unit, int mask, int flags); -const AVOption *av_set_string(void *obj, const char *name, const char *val); + +attribute_deprecated const AVOption *av_set_string(void *obj, const char *name, const char *val); + +/** + * Sets the field of obj with the given name to value. + * @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 + */ +const AVOption *av_set_string2(void *obj, const char *name, const char *val, int alloc); + const AVOption *av_set_double(void *obj, const char *name, double n); const AVOption *av_set_q(void *obj, const char *name, AVRational n); const AVOption *av_set_int(void *obj, const char *name, int64_t n);