[FFmpeg-devel] [PATCH 1/4] avutil: add av_format_option_for_user() callback system
James Almer
jamrial at gmail.com
Mon May 11 07:26:24 CEST 2015
On 10/05/15 10:18 PM, Michael Niedermayer wrote:
> Signed-off-by: Michael Niedermayer <michaelni at gmx.at>
> ---
> libavutil/opt.c | 32 ++++++++++++++++++++++++++++++++
> libavutil/opt.h | 21 +++++++++++++++++++++
> 2 files changed, 53 insertions(+)
>
If this is meant to solve the whole debate from the "Tell users about -use_absolute_path"
thread, then i think it's a bit overkill. "Set <AVOption> to <value>" is generic enough
that works in any situation, be it for API user or ffmpeg.c, and could be used in every
av_log message.
> diff --git a/libavutil/opt.c b/libavutil/opt.c
> index 62db1b5..12b5532 100644
> --- a/libavutil/opt.c
> +++ b/libavutil/opt.c
> @@ -1876,6 +1876,8 @@ int av_opt_serialize(void *obj, int opt_flags, int flags, char **buffer,
> continue;
> if (flags & AV_OPT_SERIALIZE_SKIP_DEFAULTS && av_opt_is_set_to_default(obj, o) > 0)
> continue;
> + if (o->type == AV_OPT_TYPE_PTR)
> + continue;
> if ((ret = av_opt_get(obj, o->name, 0, &buf)) < 0) {
> av_bprint_finalize(&bprint, NULL);
> return ret;
> @@ -1893,6 +1895,36 @@ int av_opt_serialize(void *obj, int opt_flags, int flags, char **buffer,
> return 0;
> }
>
> +static const char* default_format_option_for_user(void *obj, const char* name, const char* value, char *tmp, int tmp_len)
> +{
> + snprintf(tmp, tmp_len, "set '%s' to '%s'", name, value);
> + return tmp;
> +}
> +
> +const char* av_format_option_for_user(void *obj, const char* name, const char* value, char *tmp, int tmp_len)
> +{
> + const AVClass *c = *(AVClass**)obj;
> + av_format_option_for_user_func *ptr = av_opt_ptr(c, obj, "format_option_for_user_func");
> + av_format_option_for_user_func format_option_for_user = NULL;
> +
> + if (ptr)
> + format_option_for_user = *ptr;
> +
> + if (!format_option_for_user)
> + format_option_for_user = default_format_option_for_user;
> +
> + return format_option_for_user(obj, name, value, tmp, tmp_len);
> +}
> +
> +void av_set_format_option_for_user_func(void *obj, av_format_option_for_user_func f)
> +{
> + const AVClass *c = *(AVClass**)obj;
> + av_format_option_for_user_func *ptr = av_opt_ptr(c, obj, "format_option_for_user_func");
> +
> + if (ptr)
> + *ptr = f;
> +}
> +
The functions should use the av_opt prefix (something like av_opt_format_option,
av_opt_set_format_option, av_opt_format_for_user, etc).
"format_option_for_user_func" is IMO too long.
> #ifdef TEST
>
> typedef struct TestContext
> diff --git a/libavutil/opt.h b/libavutil/opt.h
> index 5fc8a9b..4283b83 100644
> --- a/libavutil/opt.h
> +++ b/libavutil/opt.h
> @@ -218,6 +218,8 @@
> * before the file is actually opened.
> */
>
> +typedef const char * (*av_format_option_for_user_func)(void *obj, const char* name, const char* value, char *tmp, int tmp_len);
> +
> enum AVOptionType{
> AV_OPT_TYPE_FLAGS,
> AV_OPT_TYPE_INT,
> @@ -236,6 +238,7 @@ enum AVOptionType{
> AV_OPT_TYPE_DURATION = MKBETAG('D','U','R',' '),
> AV_OPT_TYPE_COLOR = MKBETAG('C','O','L','R'),
> AV_OPT_TYPE_CHANNEL_LAYOUT = MKBETAG('C','H','L','A'),
> + AV_OPT_TYPE_PTR = MKBETAG('P','T','R',' '),
> #if FF_API_OLD_AVOPTIONS
> FF_OPT_TYPE_FLAGS = 0,
> FF_OPT_TYPE_INT,
> @@ -894,6 +897,24 @@ int av_opt_is_set_to_default_by_name(void *obj, const char *name, int search_fla
> */
> int av_opt_serialize(void *obj, int opt_flags, int flags, char **buffer,
> const char key_val_sep, const char pairs_sep);
> +
> +/**
> + * Formats the given AVOption for display to the user.
> + *
> + * This uses a callback with the name "format_option_for_user_func" if such field
> + * exists in obj.
> + *
> + * @param obj pointer to a AVClass based object.
> + * @param name name of the AVOption
> + * @param value value to set the AVOption to, may be NULL
> + * @param tmp space in which the formatted option is constructed
> + * @param tmp_len, length of the tmp array
> + * @returns pointer to the formated string, this may match tmp
> + */
> +const char* av_format_option_for_user(void *obj, const char* name, const char* value, char *tmp, int tmp_len);
> +
> +void av_set_format_option_for_user_func(void *obj, av_format_option_for_user_func f);
> +
> /**
> * @}
> */
>
More information about the ffmpeg-devel
mailing list