[FFmpeg-devel] [PATCH 2/2] avutil/opt: add an unsigned option type
Stefano Sabatini
stefasab at gmail.com
Sun Mar 3 18:29:30 EET 2024
On date Tuesday 2024-02-27 10:59:47 -0300, James Almer wrote:
> Signed-off-by: James Almer <jamrial at gmail.com>
> ---
> libavutil/opt.c | 20 ++++++++++++++++++++
> libavutil/opt.h | 1 +
> libavutil/tests/opt.c | 9 +++++++++
> tests/ref/fate/opt | 32 ++++++++++++++++++++++++++++++--
> 4 files changed, 60 insertions(+), 2 deletions(-)
Use case?
> diff --git a/libavutil/opt.c b/libavutil/opt.c
> index 0681b19896..45d6aa5849 100644
> --- a/libavutil/opt.c
> +++ b/libavutil/opt.c
> @@ -72,6 +72,9 @@ static int read_number(const AVOption *o, const void *dst, double *num, int *den
> case AV_OPT_TYPE_INT:
> *intnum = *(int *)dst;
> return 0;
> + case AV_OPT_TYPE_UINT:
> + *intnum = *(unsigned *)dst;
> + return 0;
> #if FF_API_OLD_CHANNEL_LAYOUT
> FF_DISABLE_DEPRECATION_WARNINGS
> case AV_OPT_TYPE_CHANNEL_LAYOUT:
> @@ -130,6 +133,9 @@ static int write_number(void *obj, const AVOption *o, void *dst, double num, int
> case AV_OPT_TYPE_INT:
> *(int *)dst = llrint(num / den) * intnum;
> break;
> + case AV_OPT_TYPE_UINT:
> + *(unsigned *)dst = llrint(num / den) * intnum;
> + break;
> case AV_OPT_TYPE_DURATION:
> #if FF_API_OLD_CHANNEL_LAYOUT
> FF_DISABLE_DEPRECATION_WARNINGS
> @@ -231,6 +237,7 @@ static int set_string(void *obj, const AVOption *o, const char *val, uint8_t **d
> opt->type == AV_OPT_TYPE_UINT64 || \
> opt->type == AV_OPT_TYPE_CONST || \
> opt->type == AV_OPT_TYPE_FLAGS || \
> + opt->type == AV_OPT_TYPE_UINT || \
> opt->type == AV_OPT_TYPE_INT) \
> ? opt->default_val.i64 \
> : opt->default_val.dbl)
> @@ -529,6 +536,7 @@ FF_ENABLE_DEPRECATION_WARNINGS
> return set_string_binary(obj, o, val, dst);
> case AV_OPT_TYPE_FLAGS:
> case AV_OPT_TYPE_INT:
> + case AV_OPT_TYPE_UINT:
> case AV_OPT_TYPE_INT64:
> case AV_OPT_TYPE_UINT64:
> case AV_OPT_TYPE_FLOAT:
> @@ -871,6 +879,9 @@ int av_opt_get(void *obj, const char *name, int search_flags, uint8_t **out_val)
> case AV_OPT_TYPE_INT:
> ret = snprintf(buf, sizeof(buf), "%d", *(int *)dst);
> break;
> + case AV_OPT_TYPE_UINT:
> + ret = snprintf(buf, sizeof(buf), "%u", *(unsigned int *)dst);
> + break;
> case AV_OPT_TYPE_INT64:
> ret = snprintf(buf, sizeof(buf), "%"PRId64, *(int64_t *)dst);
> break;
> @@ -1276,6 +1287,9 @@ static void opt_list(void *obj, void *av_log_obj, const char *unit,
> case AV_OPT_TYPE_INT:
> av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<int>");
> break;
> + case AV_OPT_TYPE_UINT:
> + av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<unsigned>");
> + break;
> case AV_OPT_TYPE_INT64:
> av_log(av_log_obj, AV_LOG_INFO, "%-12s ", "<int64>");
> break;
> @@ -1358,6 +1372,7 @@ FF_ENABLE_DEPRECATION_WARNINGS
> if (av_opt_query_ranges(&r, obj, opt->name, AV_OPT_SEARCH_FAKE_OBJ) >= 0) {
> switch (opt->type) {
> case AV_OPT_TYPE_INT:
> + case AV_OPT_TYPE_UINT:
> case AV_OPT_TYPE_INT64:
> case AV_OPT_TYPE_UINT64:
> case AV_OPT_TYPE_DOUBLE:
> @@ -1405,6 +1420,7 @@ FF_ENABLE_DEPRECATION_WARNINGS
> av_log(av_log_obj, AV_LOG_INFO, "%s", buf);
> break;
> }
> + case AV_OPT_TYPE_UINT:
> case AV_OPT_TYPE_INT:
> case AV_OPT_TYPE_UINT64:
> case AV_OPT_TYPE_INT64: {
> @@ -1490,6 +1506,7 @@ void av_opt_set_defaults2(void *s, int mask, int flags)
> case AV_OPT_TYPE_BOOL:
> case AV_OPT_TYPE_FLAGS:
> case AV_OPT_TYPE_INT:
> + case AV_OPT_TYPE_UINT:
> case AV_OPT_TYPE_INT64:
> case AV_OPT_TYPE_UINT64:
> case AV_OPT_TYPE_DURATION:
> @@ -1858,6 +1875,7 @@ static int opt_size(enum AVOptionType type)
> switch(type) {
> case AV_OPT_TYPE_BOOL:
> case AV_OPT_TYPE_INT:
> + case AV_OPT_TYPE_UINT:
> case AV_OPT_TYPE_FLAGS:
> return sizeof(int);
> case AV_OPT_TYPE_DURATION:
> @@ -1997,6 +2015,7 @@ int av_opt_query_ranges_default(AVOptionRanges **ranges_arg, void *obj, const ch
> switch (field->type) {
> case AV_OPT_TYPE_BOOL:
> case AV_OPT_TYPE_INT:
> + case AV_OPT_TYPE_UINT:
> case AV_OPT_TYPE_INT64:
> case AV_OPT_TYPE_UINT64:
> case AV_OPT_TYPE_PIXEL_FMT:
> @@ -2089,6 +2108,7 @@ int av_opt_is_set_to_default(void *obj, const AVOption *o)
> case AV_OPT_TYPE_PIXEL_FMT:
> case AV_OPT_TYPE_SAMPLE_FMT:
> case AV_OPT_TYPE_INT:
> + case AV_OPT_TYPE_UINT:
> #if FF_API_OLD_CHANNEL_LAYOUT
> FF_DISABLE_DEPRECATION_WARNINGS
> case AV_OPT_TYPE_CHANNEL_LAYOUT:
> diff --git a/libavutil/opt.h b/libavutil/opt.h
> index 461b5d3b6b..9fec1b0509 100644
> --- a/libavutil/opt.h
> +++ b/libavutil/opt.h
> @@ -243,6 +243,7 @@ enum AVOptionType{
> #endif
> AV_OPT_TYPE_BOOL,
> AV_OPT_TYPE_CHLAYOUT,
> + AV_OPT_TYPE_UINT,
> };
>
> /**
> diff --git a/libavutil/tests/opt.c b/libavutil/tests/opt.c
> index a914d0359a..747042896f 100644
> --- a/libavutil/tests/opt.c
> +++ b/libavutil/tests/opt.c
> @@ -31,6 +31,7 @@
> typedef struct TestContext {
> const AVClass *class;
> int num;
> + unsigned unum;
> int toggle;
> char *string;
> int flags;
> @@ -67,6 +68,7 @@ typedef struct TestContext {
>
> static const AVOption test_options[]= {
> {"num", "set num", OFFSET(num), AV_OPT_TYPE_INT, { .i64 = 0 }, -1, 100, 1 },
> + {"unum", "set unum", OFFSET(unum), AV_OPT_TYPE_UINT, { .i64 = 1 }, 0, INT_MAX + 1U, 1 },
Do we have additional checks in case the validity interval includes
signed values? What happens in that case?
More information about the ffmpeg-devel
mailing list