mirror of https://git.ffmpeg.org/ffmpeg.git
avutil/opt: add full support for AV_OPT_TYPE_DICT
Now it is possible to set them from a string, to serialize them and to use a default value. Signed-off-by: Marton Balint <cus@passwd.hu>
This commit is contained in:
parent
6c883e214a
commit
5edacc4609
|
@ -446,6 +446,22 @@ static int set_string_sample_fmt(void *obj, const AVOption *o, const char *val,
|
||||||
AV_SAMPLE_FMT_NB, av_get_sample_fmt, "sample format");
|
AV_SAMPLE_FMT_NB, av_get_sample_fmt, "sample format");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int set_string_dict(void *obj, const AVOption *o, const char *val, uint8_t **dst)
|
||||||
|
{
|
||||||
|
AVDictionary *options = NULL;
|
||||||
|
|
||||||
|
if (val) {
|
||||||
|
int ret = av_dict_parse_string(&options, val, "=", ":", 0);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
av_dict_free((AVDictionary **)dst);
|
||||||
|
*dst = (uint8_t *)options;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int av_opt_set(void *obj, const char *name, const char *val, int search_flags)
|
int av_opt_set(void *obj, const char *name, const char *val, int search_flags)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
@ -527,6 +543,8 @@ int av_opt_set(void *obj, const char *name, const char *val, int search_flags)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case AV_OPT_TYPE_DICT:
|
||||||
|
return set_string_dict(obj, o, val, dst);
|
||||||
}
|
}
|
||||||
|
|
||||||
av_log(obj, AV_LOG_ERROR, "Invalid option type.\n");
|
av_log(obj, AV_LOG_ERROR, "Invalid option type.\n");
|
||||||
|
@ -855,6 +873,12 @@ int av_opt_get(void *obj, const char *name, int search_flags, uint8_t **out_val)
|
||||||
i64 = *(int64_t *)dst;
|
i64 = *(int64_t *)dst;
|
||||||
ret = snprintf(buf, sizeof(buf), "0x%"PRIx64, i64);
|
ret = snprintf(buf, sizeof(buf), "0x%"PRIx64, i64);
|
||||||
break;
|
break;
|
||||||
|
case AV_OPT_TYPE_DICT:
|
||||||
|
if (!*(AVDictionary **)dst && (search_flags & AV_OPT_ALLOW_NULL)) {
|
||||||
|
*out_val = NULL;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return av_dict_get_string(*(AVDictionary **)dst, (char **)out_val, '=', ':');
|
||||||
default:
|
default:
|
||||||
return AVERROR(EINVAL);
|
return AVERROR(EINVAL);
|
||||||
}
|
}
|
||||||
|
@ -1174,6 +1198,9 @@ static void opt_list(void *obj, void *av_log_obj, const char *unit,
|
||||||
case AV_OPT_TYPE_BINARY:
|
case AV_OPT_TYPE_BINARY:
|
||||||
av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<binary>");
|
av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<binary>");
|
||||||
break;
|
break;
|
||||||
|
case AV_OPT_TYPE_DICT:
|
||||||
|
av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<dictionary>");
|
||||||
|
break;
|
||||||
case AV_OPT_TYPE_IMAGE_SIZE:
|
case AV_OPT_TYPE_IMAGE_SIZE:
|
||||||
av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<image_size>");
|
av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<image_size>");
|
||||||
break;
|
break;
|
||||||
|
@ -1247,6 +1274,7 @@ static void opt_list(void *obj, void *av_log_obj, const char *unit,
|
||||||
!((opt->type == AV_OPT_TYPE_COLOR ||
|
!((opt->type == AV_OPT_TYPE_COLOR ||
|
||||||
opt->type == AV_OPT_TYPE_IMAGE_SIZE ||
|
opt->type == AV_OPT_TYPE_IMAGE_SIZE ||
|
||||||
opt->type == AV_OPT_TYPE_STRING ||
|
opt->type == AV_OPT_TYPE_STRING ||
|
||||||
|
opt->type == AV_OPT_TYPE_DICT ||
|
||||||
opt->type == AV_OPT_TYPE_VIDEO_RATE) &&
|
opt->type == AV_OPT_TYPE_VIDEO_RATE) &&
|
||||||
!opt->default_val.str)) {
|
!opt->default_val.str)) {
|
||||||
av_log(av_log_obj, AV_LOG_INFO, " (default ");
|
av_log(av_log_obj, AV_LOG_INFO, " (default ");
|
||||||
|
@ -1297,6 +1325,7 @@ static void opt_list(void *obj, void *av_log_obj, const char *unit,
|
||||||
case AV_OPT_TYPE_COLOR:
|
case AV_OPT_TYPE_COLOR:
|
||||||
case AV_OPT_TYPE_IMAGE_SIZE:
|
case AV_OPT_TYPE_IMAGE_SIZE:
|
||||||
case AV_OPT_TYPE_STRING:
|
case AV_OPT_TYPE_STRING:
|
||||||
|
case AV_OPT_TYPE_DICT:
|
||||||
case AV_OPT_TYPE_VIDEO_RATE:
|
case AV_OPT_TYPE_VIDEO_RATE:
|
||||||
av_log(av_log_obj, AV_LOG_INFO, "\"%s\"", opt->default_val.str);
|
av_log(av_log_obj, AV_LOG_INFO, "\"%s\"", opt->default_val.str);
|
||||||
break;
|
break;
|
||||||
|
@ -1386,8 +1415,8 @@ void av_opt_set_defaults2(void *s, int mask, int flags)
|
||||||
set_string_binary(s, opt, opt->default_val.str, dst);
|
set_string_binary(s, opt, opt->default_val.str, dst);
|
||||||
break;
|
break;
|
||||||
case AV_OPT_TYPE_DICT:
|
case AV_OPT_TYPE_DICT:
|
||||||
/* Cannot set defaults for these types */
|
set_string_dict(s, opt, opt->default_val.str, dst);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
av_log(s, AV_LOG_DEBUG, "AVOption type %d of option %s not implemented yet\n",
|
av_log(s, AV_LOG_DEBUG, "AVOption type %d of option %s not implemented yet\n",
|
||||||
opt->type, opt->name);
|
opt->type, opt->name);
|
||||||
|
@ -1971,9 +2000,21 @@ int av_opt_is_set_to_default(void *obj, const AVOption *o)
|
||||||
av_free(tmp.data);
|
av_free(tmp.data);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
case AV_OPT_TYPE_DICT:
|
case AV_OPT_TYPE_DICT: {
|
||||||
/* Binary and dict have not default support yet. Any pointer is not default. */
|
AVDictionary *dict1 = NULL;
|
||||||
return !!(*(void **)dst);
|
AVDictionary *dict2 = *(AVDictionary **)dst;
|
||||||
|
AVDictionaryEntry *en1 = NULL;
|
||||||
|
AVDictionaryEntry *en2 = NULL;
|
||||||
|
ret = av_dict_parse_string(&dict1, o->default_val.str, "=", ":", 0);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
do {
|
||||||
|
en1 = av_dict_get(dict1, "", en1, AV_DICT_IGNORE_SUFFIX);
|
||||||
|
en2 = av_dict_get(dict2, "", en2, AV_DICT_IGNORE_SUFFIX);
|
||||||
|
} while (en1 && en2 && !strcmp(en1->key, en2->key) && !strcmp(en1->value, en2->value));
|
||||||
|
av_dict_free(&dict1);
|
||||||
|
return (!en1 && !en2);
|
||||||
|
}
|
||||||
case AV_OPT_TYPE_IMAGE_SIZE:
|
case AV_OPT_TYPE_IMAGE_SIZE:
|
||||||
if (!o->default_val.str || !strcmp(o->default_val.str, "none"))
|
if (!o->default_val.str || !strcmp(o->default_val.str, "none"))
|
||||||
w = h = 0;
|
w = h = 0;
|
||||||
|
|
|
@ -670,6 +670,9 @@ const AVClass *av_opt_child_class_next(const AVClass *parent, const AVClass *pre
|
||||||
* scalars or named flags separated by '+' or '-'. Prefixing a flag
|
* scalars or named flags separated by '+' or '-'. Prefixing a flag
|
||||||
* with '+' causes it to be set without affecting the other flags;
|
* with '+' causes it to be set without affecting the other flags;
|
||||||
* similarly, '-' unsets a flag.
|
* similarly, '-' unsets a flag.
|
||||||
|
* If the field is of a dictionary type, it has to be a ':' separated list of
|
||||||
|
* key=value parameters. Values containing ':' special characters must be
|
||||||
|
* escaped.
|
||||||
* @param search_flags flags passed to av_opt_find2. I.e. if AV_OPT_SEARCH_CHILDREN
|
* @param search_flags flags passed to av_opt_find2. I.e. if AV_OPT_SEARCH_CHILDREN
|
||||||
* is passed here, then the option may be set on a child of obj.
|
* is passed here, then the option may be set on a child of obj.
|
||||||
*
|
*
|
||||||
|
@ -730,9 +733,10 @@ int av_opt_set_dict_val(void *obj, const char *name, const AVDictionary *val, in
|
||||||
/**
|
/**
|
||||||
* @note the returned string will be av_malloc()ed and must be av_free()ed by the caller
|
* @note the returned string will be av_malloc()ed and must be av_free()ed by the caller
|
||||||
*
|
*
|
||||||
* @note if AV_OPT_ALLOW_NULL is set in search_flags in av_opt_get, and the option has
|
* @note if AV_OPT_ALLOW_NULL is set in search_flags in av_opt_get, and the
|
||||||
* AV_OPT_TYPE_STRING or AV_OPT_TYPE_BINARY and is set to NULL, *out_val will be set
|
* option is of type AV_OPT_TYPE_STRING, AV_OPT_TYPE_BINARY or AV_OPT_TYPE_DICT
|
||||||
* to NULL instead of an allocated empty string.
|
* and is set to NULL, *out_val will be set to NULL instead of an allocated
|
||||||
|
* empty string.
|
||||||
*/
|
*/
|
||||||
int av_opt_get (void *obj, const char *name, int search_flags, uint8_t **out_val);
|
int av_opt_get (void *obj, const char *name, int search_flags, uint8_t **out_val);
|
||||||
int av_opt_get_int (void *obj, const char *name, int search_flags, int64_t *out_val);
|
int av_opt_get_int (void *obj, const char *name, int search_flags, int64_t *out_val);
|
||||||
|
|
Loading…
Reference in New Issue