On Mon, 4 Mar 2024, Anton Khirnov wrote:
--- doc/APIchanges | 3 + libavutil/opt.c | 362 +++++++++++++++++++++++++++++++++++++----- libavutil/opt.h | 62 +++++++- libavutil/tests/opt.c | 51 ++++++ tests/ref/fate/opt | 35 +++- 5 files changed, 468 insertions(+), 45 deletions(-) diff --git a/doc/APIchanges b/doc/APIchanges index 7d46ebb006..3209614ed6 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -2,6 +2,9 @@ The last version increases of all libraries were on 2023-02-09 API changes, most recent first: +2024-02-xx - xxxxxxxxxx - lavu 58.xx.100 - opt.h + Add AV_OPT_TYPE_FLAG_ARRAY and AVOptionArrayDef. + 2024-02-28 - xxxxxxxxxx - swr 4.14.100 - swresample.h swr_convert() now accepts arrays of const pointers (to input and output).
[...]
diff --git a/libavutil/opt.h b/libavutil/opt.h index e402f6a0a0..77797b3fbe 100644 --- a/libavutil/opt.h +++ b/libavutil/opt.h @@ -253,6 +253,17 @@ enum AVOptionType{ #endif AV_OPT_TYPE_BOOL, AV_OPT_TYPE_CHLAYOUT, + + /** + * May be combined with another regular option type to declare an array + * option. + * + * For array options, @ref AVOption.offset should refer to a pointer + * corresponding to the option type. The pointer should be immediately + * followed by an unsigned int that will store the number of elements in the + * array. + */ + AV_OPT_TYPE_FLAG_ARRAY = (1 << 16), }; /** @@ -298,6 +309,46 @@ enum AVOptionType{ */ #define AV_OPT_FLAG_CHILD_CONSTS (1 << 18) +/** + * Must be set as default_val for AV_OPT_TYPE_FLAG_ARRAY options. + */ +typedef struct AVOptionArrayDef { + /** + * Must be set to sizeof(AVOptionArrayDef), in order to allow extending this + * struct without breaking ABI. + */ + size_t sizeof_self; + + /** + * Native access only. + * + * Default value of the option, as would be serialized by av_opt_get() (i.e. + * using the value of sep as the separator). + */ + const char *def; + + /** + * Minimum number of elements in the array. When this field is non-zero, def + * must be non-NULL and contain at least this number of elements. + */ + unsigned size_min; + /** + * Maximum number of elements in the array, 0 when unlimited. + */ + unsigned size_max; + + /** + * Separator between array elements in string representations of this + * option, used by av_opt_set() and av_opt_get(). It must be a printable + * ASCII character, excluding alphanumeric and the backslash. A comma is + * used when sep=0. + * + * The separator and the backslash must be backslash-escaped in order to + * appear in string representations of the option value. + */ + uint8_t sep; +} AVOptionArrayDef; + /** * AVOption */ @@ -320,8 +371,7 @@ typedef struct AVOption { enum AVOptionType type; /** - * Native access only. - * + * Native access only, except when documented otherwise. * the default value for scalar options */ union { @@ -330,6 +380,14 @@ typedef struct AVOption { const char *str; /* TODO those are unused now */ AVRational q; + + /** + * Used for AV_OPT_TYPE_FLAG_ARRAY options. May be NULL.
This contradicts with the documentation of AVOptionArrayDef above, because there you write that default_val MUST be set.
+ * + * Foreign access to some members allowed, as noted in AVOptionArrayDef + * documentation. + */ + const AVOptionArrayDef *arr; } default_val;
Regards, Marton _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".