X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavutil%2Fopt.c;h=ca4edb827e0534fab414fb8843f1ec74ba173f15;hb=3ff5ca89fc8783cabed56887f556bdd83279ffb0;hp=2a06eb6f39fbed10c53434a15cb28fb017ec5fce;hpb=17cbc6457b7a0c38fececc3e0ecff99cc8c96526;p=ffmpeg diff --git a/libavutil/opt.c b/libavutil/opt.c index 2a06eb6f39f..ca4edb827e0 100644 --- a/libavutil/opt.c +++ b/libavutil/opt.c @@ -583,7 +583,6 @@ static int set_format(void *obj, const char *name, int fmt, int search_flags, const AVOption *o = av_opt_find2(obj, name, NULL, 0, search_flags, &target_obj); int min, max; - const AVClass *class = *(AVClass **)obj; if (!o || !target_obj) return AVERROR_OPTION_NOT_FOUND; @@ -593,16 +592,9 @@ static int set_format(void *obj, const char *name, int fmt, int search_flags, return AVERROR(EINVAL); } -#if LIBAVUTIL_VERSION_MAJOR < 54 - if (class->version && class->version < AV_VERSION_INT(52, 11, 100)) { - min = -1; - max = nb_fmts-1; - } else -#endif - { - min = FFMAX(o->min, -1); - max = FFMIN(o->max, nb_fmts-1); - } + min = FFMAX(o->min, -1); + max = FFMIN(o->max, nb_fmts-1); + if (fmt < min || fmt > max) { av_log(obj, AV_LOG_ERROR, "Value %d for parameter '%s' out of %s format range [%d - %d]\n", @@ -680,6 +672,24 @@ const char *av_get_string(void *obj, const char *name, const AVOption **o_out, c } #endif +int av_opt_set_dict_val(void *obj, const char *name, const AVDictionary *val, int search_flags) +{ + void *target_obj; + AVDictionary **dst; + const AVOption *o = av_opt_find2(obj, name, NULL, 0, search_flags, &target_obj); + + if (!o || !target_obj) + return AVERROR_OPTION_NOT_FOUND; + if (o->flags & AV_OPT_FLAG_READONLY) + return AVERROR(EINVAL); + + dst = (AVDictionary **)(((uint8_t *)target_obj) + o->offset); + av_dict_free(dst); + av_dict_copy(dst, val, 0); + + return 0; +} + int av_opt_get(void *obj, const char *name, int search_flags, uint8_t **out_val) { void *dst, *target_obj; @@ -927,6 +937,23 @@ int av_opt_get_channel_layout(void *obj, const char *name, int search_flags, int return 0; } +int av_opt_get_dict_val(void *obj, const char *name, int search_flags, AVDictionary **out_val) +{ + void *target_obj; + AVDictionary *src; + const AVOption *o = av_opt_find2(obj, name, NULL, 0, search_flags, &target_obj); + + if (!o || !target_obj) + return AVERROR_OPTION_NOT_FOUND; + if (o->type != AV_OPT_TYPE_DICT) + return AVERROR(EINVAL); + + src = *(AVDictionary **)(((uint8_t *)target_obj) + o->offset); + av_dict_copy(out_val, src, 0); + + return 0; +} + int av_opt_flag_is_set(void *obj, const char *field_name, const char *flag_name) { const AVOption *field = av_opt_find(obj, field_name, NULL, 0, 0); @@ -1155,9 +1182,8 @@ void av_opt_set_defaults(void *s) void av_opt_set_defaults2(void *s, int mask, int flags) { #endif - const AVClass *class = *(AVClass **)s; const AVOption *opt = NULL; - while ((opt = av_opt_next(s, opt)) != NULL) { + while ((opt = av_opt_next(s, opt))) { void *dst = ((uint8_t*)s) + opt->offset; #if FF_API_OLD_AVOPTIONS if ((opt->flags & mask) != flags) @@ -1204,23 +1230,14 @@ void av_opt_set_defaults2(void *s, int mask, int flags) set_string_video_rate(s, opt, opt->default_val.str, dst); break; case AV_OPT_TYPE_PIXEL_FMT: -#if LIBAVUTIL_VERSION_MAJOR < 54 - if (class->version && class->version < AV_VERSION_INT(52, 10, 100)) - av_opt_set(s, opt->name, opt->default_val.str, 0); - else -#endif - write_number(s, opt, dst, 1, 1, opt->default_val.i64); + write_number(s, opt, dst, 1, 1, opt->default_val.i64); break; case AV_OPT_TYPE_SAMPLE_FMT: -#if LIBAVUTIL_VERSION_MAJOR < 54 - if (class->version && class->version < AV_VERSION_INT(52, 10, 100)) - av_opt_set(s, opt->name, opt->default_val.str, 0); - else -#endif - write_number(s, opt, dst, 1, 1, opt->default_val.i64); + write_number(s, opt, dst, 1, 1, opt->default_val.i64); break; case AV_OPT_TYPE_BINARY: - /* Cannot set default for binary */ + case AV_OPT_TYPE_DICT: + /* Cannot set defaults for these types */ break; default: av_log(s, AV_LOG_DEBUG, "AVOption type %d of option %s not implemented yet\n", opt->type, opt->name); @@ -1414,9 +1431,21 @@ int av_opt_set_from_string(void *ctx, const char *opts, void av_opt_free(void *obj) { const AVOption *o = NULL; - while ((o = av_opt_next(obj, o))) - if (o->type == AV_OPT_TYPE_STRING || o->type == AV_OPT_TYPE_BINARY) + while ((o = av_opt_next(obj, o))) { + switch (o->type) { + case AV_OPT_TYPE_STRING: + case AV_OPT_TYPE_BINARY: av_freep((uint8_t *)obj + o->offset); + break; + + case AV_OPT_TYPE_DICT: + av_dict_free((AVDictionary **)(((uint8_t *)obj) + o->offset)); + break; + + default: + break; + } + } } int av_opt_set_dict2(void *obj, AVDictionary **options, int search_flags)