[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