From d053290d8dd4dfddebc7285628360b67e185d63d Mon Sep 17 00:00:00 2001 From: James Almer Date: Tue, 27 Feb 2024 17:30:40 -0300 Subject: [PATCH] avutil/opt: add an unsigned option type Signed-off-by: James Almer --- doc/APIchanges | 3 +++ libavutil/opt.c | 17 +++++++++++++++++ libavutil/opt.h | 2 ++ libavutil/tests/opt.c | 9 +++++++++ libavutil/version.h | 4 ++-- tests/ref/fate/opt | 32 ++++++++++++++++++++++++++++++-- 6 files changed, 63 insertions(+), 4 deletions(-) diff --git a/doc/APIchanges b/doc/APIchanges index 0566fcdcc5..824beec9d3 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -2,6 +2,9 @@ The last version increases of all libraries were on 2024-03-07 API changes, most recent first: +2024-05-04 - xxxxxxxxxx - lavu 59.17.100 - opt.h + Add AV_OPT_TYPE_UINT and av_opt_eval_uint(). + 2024-04-24 - 8616cfe0890 - lavu 59.16.100 - opt.h Add AV_OPT_SERIALIZE_SEARCH_CHILDREN. diff --git a/libavutil/opt.c b/libavutil/opt.c index ecbf7efe5f..a892e056cb 100644 --- a/libavutil/opt.c +++ b/libavutil/opt.c @@ -62,6 +62,7 @@ static const size_t opt_elem_size[] = { [AV_OPT_TYPE_FLAGS] = sizeof(unsigned), [AV_OPT_TYPE_INT] = sizeof(int), [AV_OPT_TYPE_INT64] = sizeof(int64_t), + [AV_OPT_TYPE_UINT] = sizeof(unsigned), [AV_OPT_TYPE_UINT64] = sizeof(uint64_t), [AV_OPT_TYPE_DOUBLE] = sizeof(double), [AV_OPT_TYPE_FLOAT] = sizeof(float), @@ -166,6 +167,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 int *)dst; + return 0; case AV_OPT_TYPE_DURATION: case AV_OPT_TYPE_INT64: case AV_OPT_TYPE_UINT64: @@ -219,6 +223,7 @@ static int write_number(void *obj, const AVOption *o, void *dst, double num, int case AV_OPT_TYPE_BOOL: case AV_OPT_TYPE_FLAGS: case AV_OPT_TYPE_INT: + case AV_OPT_TYPE_UINT: *(int *)dst = llrint(num / den) * intnum; break; case AV_OPT_TYPE_DURATION: @@ -319,6 +324,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) @@ -605,6 +611,7 @@ static int opt_set_elem(void *obj, void *target_obj, const AVOption *o, 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: @@ -767,6 +774,7 @@ int av_opt_eval_ ## name(void *obj, const AVOption *o, \ OPT_EVAL_NUMBER(flags, AV_OPT_TYPE_FLAGS, int) OPT_EVAL_NUMBER(int, AV_OPT_TYPE_INT, int) +OPT_EVAL_NUMBER(uint, AV_OPT_TYPE_UINT, unsigned) OPT_EVAL_NUMBER(int64, AV_OPT_TYPE_INT64, int64_t) OPT_EVAL_NUMBER(float, AV_OPT_TYPE_FLOAT, float) OPT_EVAL_NUMBER(double, AV_OPT_TYPE_DOUBLE, double) @@ -997,6 +1005,9 @@ static int opt_get_elem(const AVOption *o, uint8_t **pbuf, size_t buf_len, case AV_OPT_TYPE_INT: ret = snprintf(*pbuf, buf_len, "%d", *(int *)dst); break; + case AV_OPT_TYPE_UINT: + ret = snprintf(*pbuf, buf_len, "%u", *(unsigned *)dst); + break; case AV_OPT_TYPE_INT64: ret = snprintf(*pbuf, buf_len, "%"PRId64, *(int64_t *)dst); break; @@ -1444,6 +1455,7 @@ static void log_type(void *av_log_obj, const AVOption *o, [AV_OPT_TYPE_FLAGS] = "", [AV_OPT_TYPE_INT] = "", [AV_OPT_TYPE_INT64] = "", + [AV_OPT_TYPE_UINT] = "", [AV_OPT_TYPE_UINT64] = "", [AV_OPT_TYPE_DOUBLE] = "", [AV_OPT_TYPE_FLOAT] = "", @@ -1515,6 +1527,7 @@ static void log_default(void *obj, void *av_log_obj, const AVOption *opt) 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: { @@ -1600,6 +1613,7 @@ static void opt_list(void *obj, void *av_log_obj, const char *unit, 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: @@ -1676,6 +1690,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: @@ -2177,6 +2192,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: @@ -2281,6 +2297,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: case AV_OPT_TYPE_DURATION: case AV_OPT_TYPE_INT64: case AV_OPT_TYPE_UINT64: diff --git a/libavutil/opt.h b/libavutil/opt.h index 2fdfb65c23..2d76ec6105 100644 --- a/libavutil/opt.h +++ b/libavutil/opt.h @@ -260,6 +260,7 @@ enum AVOptionType{ AV_OPT_TYPE_COLOR, AV_OPT_TYPE_BOOL, AV_OPT_TYPE_CHLAYOUT, + AV_OPT_TYPE_UINT, /** * May be combined with another regular option type to declare an array @@ -883,6 +884,7 @@ int av_opt_get_dict_val(void *obj, const char *name, int search_flags, AVDiction */ int av_opt_eval_flags (void *obj, const AVOption *o, const char *val, int *flags_out); int av_opt_eval_int (void *obj, const AVOption *o, const char *val, int *int_out); +int av_opt_eval_uint (void *obj, const AVOption *o, const char *val, unsigned *uint_out); int av_opt_eval_int64 (void *obj, const AVOption *o, const char *val, int64_t *int64_out); int av_opt_eval_float (void *obj, const AVOption *o, const char *val, float *float_out); int av_opt_eval_double(void *obj, const AVOption *o, const char *val, double *double_out); diff --git a/libavutil/tests/opt.c b/libavutil/tests/opt.c index 7842b0567d..d189938d9b 100644 --- a/libavutil/tests/opt.c +++ b/libavutil/tests/opt.c @@ -32,6 +32,7 @@ typedef struct TestContext { const AVClass *class; struct ChildContext *child; int num; + int unum; int toggle; char *string; int flags; @@ -87,6 +88,7 @@ static const AVOptionArrayDef array_dict = { 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 = 1U << 31 }, 0, 1U << 31, 1 }, {"toggle", "set toggle", OFFSET(toggle), AV_OPT_TYPE_INT, { .i64 = 1 }, 0, 1, 1 }, {"rational", "set rational", OFFSET(rational), AV_OPT_TYPE_RATIONAL, { .dbl = 1 }, 0, 10, 1 }, {"string", "set string", OFFSET(string), AV_OPT_TYPE_STRING, { .str = "default" }, CHAR_MIN, CHAR_MAX, 1 }, @@ -186,6 +188,7 @@ int main(void) av_opt_set_defaults(&test_ctx); printf("num=%d\n", test_ctx.num); + printf("unum=%u\n", test_ctx.unum); printf("toggle=%d\n", test_ctx.toggle); printf("string=%s\n", test_ctx.string); printf("escape=%s\n", test_ctx.escape); @@ -386,6 +389,12 @@ int main(void) "num=-1", "num=-2", "num=101", + "unum=bogus", + "unum=44", + "unum=44.4", + "unum=-1", + "unum=2147483648", + "unum=2147483649", "num64=bogus", "num64=44", "num64=44.4", diff --git a/libavutil/version.h b/libavutil/version.h index 735f6832e3..3b5a2e7aaa 100644 --- a/libavutil/version.h +++ b/libavutil/version.h @@ -79,8 +79,8 @@ */ #define LIBAVUTIL_VERSION_MAJOR 59 -#define LIBAVUTIL_VERSION_MINOR 16 -#define LIBAVUTIL_VERSION_MICRO 101 +#define LIBAVUTIL_VERSION_MINOR 17 +#define LIBAVUTIL_VERSION_MICRO 100 #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ LIBAVUTIL_VERSION_MINOR, \ diff --git a/tests/ref/fate/opt b/tests/ref/fate/opt index 4e6112c8c5..578350bc33 100644 --- a/tests/ref/fate/opt +++ b/tests/ref/fate/opt @@ -1,5 +1,6 @@ Testing default values num=0 +unum=2147483648 toggle=1 string=default escape=\=, @@ -25,6 +26,7 @@ array_dict[0]: k01 v,01 array_dict[1]: k10 v=1:0 TestContext AVOptions: -num E.......... set num (from -1 to 100) (default 0) + -unum E.......... set unum (from 0 to 2.14748e+09) (default 2147483648) -toggle E.......... set toggle (from 0 to 1) (default 1) -rational E.......... set rational (from 0 to 10) (default 1/1) -string E.......... set string (default "default") @@ -57,6 +59,7 @@ TestContext AVOptions: Testing av_opt_is_set_to_default() name: num default:1 error: +name: unum default:0 error: name: toggle default:0 error: name: rational default:0 error: name: string default:0 error: @@ -87,6 +90,7 @@ name: array_int default:0 error: name: array_str default:0 error: name:array_dict default:0 error: name: num default:1 error: +name: unum default:1 error: name: toggle default:1 error: name: rational default:1 error: name: string default:1 error: @@ -119,6 +123,7 @@ name:array_dict default:1 error: Testing av_opt_get/av_opt_set() name: num get: 0 set: OK get: 0 OK +name: unum get: 2147483648 set: OK get: 2147483648 OK name: toggle get: 1 set: OK get: 1 OK name: rational get: 1/1 set: OK get: 1/1 OK name: string get: default set: OK get: default OK @@ -150,8 +155,9 @@ array_dict=NULL; nb_array_dict=0 av_opt_get("array_dict") -> NULL Test av_opt_serialize() -num=0,toggle=1,rational=1/1,string=default,escape=\\\=\,,flags=0x00000001,size=200x300,pix_fmt=0bgr,sample_fmt=s16,video_rate=25/1,duration=0.001,color=0xffc0cbff,cl=hexagonal,bin=62696E00,bin1=,bin2=,num64=4294967296,flt=0.333333,dbl=0.333333,bool1=auto,bool2=true,bool3=false,dict1=,dict2=happy\=\\:-),array_int=,array_str=str0|str\\|1|str\\\\2,array_dict=k00\=v\\\\\\\\00:k01\=v\\\,01\,k10\=v\\\\\=1\\\\:0 +num=0,unum=2147483648,toggle=1,rational=1/1,string=default,escape=\\\=\,,flags=0x00000001,size=200x300,pix_fmt=0bgr,sample_fmt=s16,video_rate=25/1,duration=0.001,color=0xffc0cbff,cl=hexagonal,bin=62696E00,bin1=,bin2=,num64=4294967296,flt=0.333333,dbl=0.333333,bool1=auto,bool2=true,bool3=false,dict1=,dict2=happy\=\\:-),array_int=,array_str=str0|str\\|1|str\\\\2,array_dict=k00\=v\\\\\\\\00:k01\=v\\\,01\,k10\=v\\\\\=1\\\\:0 Setting entry with key 'num' to value '0' +Setting entry with key 'unum' to value '2147483648' Setting entry with key 'toggle' to value '1' Setting entry with key 'rational' to value '1/1' Setting entry with key 'string' to value 'default' @@ -178,7 +184,7 @@ Setting entry with key 'dict2' to value 'happy=\:-)' Setting entry with key 'array_int' to value '' Setting entry with key 'array_str' to value 'str0|str\|1|str\\2' Setting entry with key 'array_dict' to value 'k00=v\\\\00:k01=v\,01,k10=v\\=1\\:0' -num=0,toggle=1,rational=1/1,string=default,escape=\\\=\,,flags=0x00000001,size=200x300,pix_fmt=0bgr,sample_fmt=s16,video_rate=25/1,duration=0.001,color=0xffc0cbff,cl=hexagonal,bin=62696E00,bin1=,bin2=,num64=4294967296,flt=0.333333,dbl=0.333333,bool1=auto,bool2=true,bool3=false,dict1=,dict2=happy\=\\:-),array_int=,array_str=str0|str\\|1|str\\\\2,array_dict=k00\=v\\\\\\\\00:k01\=v\\\,01\,k10\=v\\\\\=1\\\\:0 +num=0,unum=2147483648,toggle=1,rational=1/1,string=default,escape=\\\=\,,flags=0x00000001,size=200x300,pix_fmt=0bgr,sample_fmt=s16,video_rate=25/1,duration=0.001,color=0xffc0cbff,cl=hexagonal,bin=62696E00,bin1=,bin2=,num64=4294967296,flt=0.333333,dbl=0.333333,bool1=auto,bool2=true,bool3=false,dict1=,dict2=happy\=\\:-),array_int=,array_str=str0|str\\|1|str\\\\2,array_dict=k00\=v\\\\\\\\00:k01\=v\\\,01\,k10\=v\\\\\=1\\\\:0 child_num=0,flt=0.333333,dbl=0.333333,array_int= Testing av_set_options_string() @@ -359,6 +365,28 @@ Setting options string 'num=101' Setting entry with key 'num' to value '101' Value 101.000000 for parameter 'num' out of range [-1 - 100] Error 'num=101' +Setting options string 'unum=bogus' +Setting entry with key 'unum' to value 'bogus' +Undefined constant or missing '(' in 'bogus' +Unable to parse option value "bogus" +Error 'unum=bogus' +Setting options string 'unum=44' +Setting entry with key 'unum' to value '44' +OK 'unum=44' +Setting options string 'unum=44.4' +Setting entry with key 'unum' to value '44.4' +OK 'unum=44.4' +Setting options string 'unum=-1' +Setting entry with key 'unum' to value '-1' +Value -1.000000 for parameter 'unum' out of range [0 - 2.14748e+09] +Error 'unum=-1' +Setting options string 'unum=2147483648' +Setting entry with key 'unum' to value '2147483648' +OK 'unum=2147483648' +Setting options string 'unum=2147483649' +Setting entry with key 'unum' to value '2147483649' +Value 2147483649.000000 for parameter 'unum' out of range [0 - 2.14748e+09] +Error 'unum=2147483649' Setting options string 'num64=bogus' Setting entry with key 'num64' to value 'bogus' Undefined constant or missing '(' in 'bogus'