diff options
author | Stefano Sabatini <stefasab@gmail.com> | 2012-12-01 04:07:24 +0400 |
---|---|---|
committer | Stefano Sabatini <stefasab@gmail.com> | 2012-12-01 22:33:30 +0400 |
commit | c9ff32215b433d505f251c1f212b1fa0a5e17b73 (patch) | |
tree | cbdbaaadd90ee4f16f0a4fe6afebea29e8a2c907 /libavutil/opt.c | |
parent | b5cedf8b66c79bcc380d66dec0b850c8d7797c45 (diff) |
lavu/opt: allow to set sample and pixel format with av_opt_set_int()
This change requires the user to specify min and max value, and makes
possible to prevent the user to set AV_{SAMPLE,PIX}_FMT_NONE if
forbidden.
Add required ifdeffery in case of mixed libraries, when libavutil is
updated but not the other libraries.
This is a followup of 08d0969c1402ccec4dce44bd430128fb59d7b790.
Diffstat (limited to 'libavutil/opt.c')
-rw-r--r-- | libavutil/opt.c | 31 |
1 files changed, 23 insertions, 8 deletions
diff --git a/libavutil/opt.c b/libavutil/opt.c index 930ace59e7..0ff45c8116 100644 --- a/libavutil/opt.c +++ b/libavutil/opt.c @@ -95,6 +95,8 @@ static int write_number(void *obj, const AVOption *o, void *dst, double num, int switch (o->type) { case AV_OPT_TYPE_FLAGS: + case AV_OPT_TYPE_PIXEL_FMT: + case AV_OPT_TYPE_SAMPLE_FMT: case AV_OPT_TYPE_INT: *(int *)dst= llrint(num/den)*intnum; break; case AV_OPT_TYPE_INT64: *(int64_t *)dst= llrint(num/den)*intnum; break; case AV_OPT_TYPE_FLOAT: *(float *)dst= num*intnum/den; break; @@ -427,11 +429,14 @@ int av_opt_set_image_size(void *obj, const char *name, int w, int h, int search_ } static int set_format(void *obj, const char *name, int fmt, int search_flags, - enum AVOptionType type, const char *desc, int max) + enum AVOptionType type, const char *desc, int nb_fmts) { void *target_obj; 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; if (o->type != type) { @@ -440,10 +445,20 @@ static int set_format(void *obj, const char *name, int fmt, int search_flags, return AVERROR(EINVAL); } - if (fmt < -1 || fmt > max) { +#if LIBAVUTIL_VERSION_MAJOR < 53 + if (class->version && class->version < AV_VERSION_INT(52, 11, 100)) { + min = -1; + max = nb_fmts-1; + } else +#endif + { + min = FFMIN(o->min, -1); + max = FFMAX(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 [-1 - %d]\n", - fmt, name, desc, max); + "Value %d for parameter '%s' out of %s format range [%d - %d]\n", + fmt, name, desc, min, max); return AVERROR(ERANGE); } *(int *)(((uint8_t *)target_obj) + o->offset) = fmt; @@ -452,12 +467,12 @@ static int set_format(void *obj, const char *name, int fmt, int search_flags, int av_opt_set_pixel_fmt(void *obj, const char *name, enum AVPixelFormat fmt, int search_flags) { - return set_format(obj, name, fmt, search_flags, AV_OPT_TYPE_PIXEL_FMT, "pixel", AV_PIX_FMT_NB-1); + return set_format(obj, name, fmt, search_flags, AV_OPT_TYPE_PIXEL_FMT, "pixel", AV_PIX_FMT_NB); } int av_opt_set_sample_fmt(void *obj, const char *name, enum AVSampleFormat fmt, int search_flags) { - return set_format(obj, name, fmt, search_flags, AV_OPT_TYPE_SAMPLE_FMT, "sample", AV_SAMPLE_FMT_NB-1); + return set_format(obj, name, fmt, search_flags, AV_OPT_TYPE_SAMPLE_FMT, "sample", AV_SAMPLE_FMT_NB); } #if FF_API_OLD_AVOPTIONS @@ -1179,8 +1194,8 @@ static const AVOption test_options[]= { {"lame", "set lame flag ", 0, AV_OPT_TYPE_CONST, {.i64 = TEST_FLAG_LAME}, INT_MIN, INT_MAX, 0, "flags" }, {"mu", "set mu flag ", 0, AV_OPT_TYPE_CONST, {.i64 = TEST_FLAG_MU}, INT_MIN, INT_MAX, 0, "flags" }, {"size", "set size", OFFSET(w), AV_OPT_TYPE_IMAGE_SIZE,{0}, 0, 0 }, -{"pix_fmt", "set pixfmt", OFFSET(pix_fmt), AV_OPT_TYPE_PIXEL_FMT, {.i64 = AV_PIX_FMT_NONE}}, -{"sample_fmt", "set samplefmt", OFFSET(sample_fmt), AV_OPT_TYPE_SAMPLE_FMT, {.i64 = AV_SAMPLE_FMT_NONE}}, +{"pix_fmt", "set pixfmt", OFFSET(pix_fmt), AV_OPT_TYPE_PIXEL_FMT, {.i64 = AV_PIX_FMT_NONE}, -1, AV_PIX_FMT_NB-1}, +{"sample_fmt", "set samplefmt", OFFSET(sample_fmt), AV_OPT_TYPE_SAMPLE_FMT, {.i64 = AV_SAMPLE_FMT_NONE}, -1, AV_SAMPLE_FMT_NB-1}, {NULL}, }; |