summaryrefslogtreecommitdiff
path: root/libavutil
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2013-12-07 12:41:09 +0100
committerMichael Niedermayer <michaelni@gmx.at>2013-12-07 14:09:36 +0100
commite8ac905daea47572abf90c873cd184dbfbbf34a7 (patch)
tree22ecabdbc04465fc84fa3c5622187f29b5222901 /libavutil
parent0aedf90e62a828c84a6efe3497ab7438aae8bf2f (diff)
avutil/opt: Implement av_opt_set_defaults* in O(N) instead of O(N²) time
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavutil')
-rw-r--r--libavutil/opt.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/libavutil/opt.c b/libavutil/opt.c
index 76959fa20b..f6aa496b8c 100644
--- a/libavutil/opt.c
+++ b/libavutil/opt.c
@@ -1101,6 +1101,7 @@ void av_opt_set_defaults2(void *s, int mask, int flags)
const AVClass *class = *(AVClass **)s;
const AVOption *opt = NULL;
while ((opt = av_opt_next(s, opt)) != NULL) {
+ void *dst = ((uint8_t*)s) + opt->offset;
#if FF_API_OLD_AVOPTIONS
if ((opt->flags & mask) != flags)
continue;
@@ -1114,26 +1115,32 @@ void av_opt_set_defaults2(void *s, int mask, int flags)
case AV_OPT_TYPE_INT64:
case AV_OPT_TYPE_DURATION:
case AV_OPT_TYPE_CHANNEL_LAYOUT:
- av_opt_set_int(s, opt->name, opt->default_val.i64, 0);
+ write_number(s, opt, dst, 1, 1, opt->default_val.i64);
break;
case AV_OPT_TYPE_DOUBLE:
case AV_OPT_TYPE_FLOAT: {
double val;
val = opt->default_val.dbl;
- av_opt_set_double(s, opt->name, val, 0);
+ write_number(s, opt, dst, val, 1, 1);
}
break;
case AV_OPT_TYPE_RATIONAL: {
AVRational val;
val = av_d2q(opt->default_val.dbl, INT_MAX);
- av_opt_set_q(s, opt->name, val, 0);
+ write_number(s, opt, dst, 1, val.den, val.num);
}
break;
case AV_OPT_TYPE_COLOR:
+ set_string_color(s, opt, opt->default_val.str, dst);
+ break;
case AV_OPT_TYPE_STRING:
+ set_string(s, opt, opt->default_val.str, dst);
+ break;
case AV_OPT_TYPE_IMAGE_SIZE:
+ set_string_image_size(s, opt, opt->default_val.str, dst);
+ break;
case AV_OPT_TYPE_VIDEO_RATE:
- av_opt_set(s, opt->name, opt->default_val.str, 0);
+ set_string_video_rate(s, opt, opt->default_val.str, dst);
break;
case AV_OPT_TYPE_PIXEL_FMT:
#if LIBAVUTIL_VERSION_MAJOR < 53
@@ -1141,7 +1148,7 @@ void av_opt_set_defaults2(void *s, int mask, int flags)
av_opt_set(s, opt->name, opt->default_val.str, 0);
else
#endif
- av_opt_set_pixel_fmt(s, opt->name, opt->default_val.i64, 0);
+ write_number(s, opt, dst, 1, 1, opt->default_val.i64);
break;
case AV_OPT_TYPE_SAMPLE_FMT:
#if LIBAVUTIL_VERSION_MAJOR < 53
@@ -1149,7 +1156,7 @@ void av_opt_set_defaults2(void *s, int mask, int flags)
av_opt_set(s, opt->name, opt->default_val.str, 0);
else
#endif
- av_opt_set_sample_fmt(s, opt->name, opt->default_val.i64, 0);
+ write_number(s, opt, dst, 1, 1, opt->default_val.i64);
break;
case AV_OPT_TYPE_BINARY:
/* Cannot set default for binary */