AVOptions: add av_opt_set_dict() mapping a dictionary struct to a context.

This way the caller can pass all the options in one nice package.
This commit is contained in:
Anton Khirnov 2011-05-22 12:52:50 +02:00
parent 0b7ccad6bf
commit 7e83e1c511
2 changed files with 39 additions and 0 deletions

View File

@ -29,6 +29,7 @@
#include "avstring.h"
#include "opt.h"
#include "eval.h"
#include "dict.h"
//FIXME order them and do a bin search
const AVOption *av_find_opt(void *v, const char *name, const char *unit, int mask, int flags)
@ -538,6 +539,27 @@ void av_opt_free(void *obj)
av_freep((uint8_t *)obj + o->offset);
}
int av_opt_set_dict(void *obj, AVDictionary **options)
{
AVDictionaryEntry *t = NULL;
AVDictionary *tmp = NULL;
int ret = 0;
while ((t = av_dict_get(*options, "", t, AV_DICT_IGNORE_SUFFIX))) {
ret = av_set_string3(obj, t->key, t->value, 1, NULL);
if (ret == AVERROR_OPTION_NOT_FOUND)
av_dict_set(&tmp, t->key, t->value, 0);
else if (ret < 0) {
av_log(obj, AV_LOG_ERROR, "Error setting option %s to value %s.\n", t->key, t->value);
break;
}
ret = 0;
}
av_dict_free(options);
*options = tmp;
return ret;
}
#ifdef TEST
#undef printf

View File

@ -29,6 +29,7 @@
#include "rational.h"
#include "avutil.h"
#include "dict.h"
enum AVOptionType{
FF_OPT_TYPE_FLAGS,
@ -191,4 +192,20 @@ void av_opt_free(void *obj);
*/
int av_opt_flag_is_set(void *obj, const char *field_name, const char *flag_name);
/*
* Set all the options from a given dictionary on an object.
*
* @param obj a struct whose first element is a pointer to AVClass
* @param options options to process. This dictionary will be freed and replaced
* by a new one containing all options not found in obj.
* Of course this new dictionary needs to be freed by caller
* with av_dict_free().
*
* @return 0 on success, a negative AVERROR if some option was found in obj,
* but could not be set.
*
* @see av_dict_copy()
*/
int av_opt_set_dict(void *obj, struct AVDictionary **options);
#endif /* AVUTIL_OPT_H */