[FFmpeg-devel] [PATCH 3/4] lavu/opt: implement av_opt_get_key_value().

Stefano Sabatini stefasab at gmail.com
Sat Nov 3 11:28:15 CET 2012


On date Friday 2012-11-02 13:36:14 +0100, Nicolas George encoded:
> This function does the low-level work of av_opt_set_from_string()
> but can be used when there is no option context or when a generic
> handling of unknown keys is needed.
> 
> av_opt_set_from_string() is changed to make use of it.
> 
> Signed-off-by: Nicolas George <nicolas.george at normalesup.org>
> ---
>  doc/APIchanges      |    3 +++
>  libavutil/opt.c     |   52 +++++++++++++++++++++++++++++++++++++--------------
>  libavutil/opt.h     |   32 +++++++++++++++++++++++++++++++
>  libavutil/version.h |    2 +-
>  4 files changed, 74 insertions(+), 15 deletions(-)
> 
> diff --git a/doc/APIchanges b/doc/APIchanges
> index aa82846..fddd73f 100644
> --- a/doc/APIchanges
> +++ b/doc/APIchanges
> @@ -15,6 +15,9 @@ libavutil:     2012-10-22
>  
>  API changes, most recent first:
>  
> +2012-11-02 - xxxxxxx - lavu  52.2.100 - opt.h
> +  Add av_opt_get_key_value().
> +
>  2012-10-21 - xxxxxxx - lavc  54.68.100 - avcodec.h
>                         lavfi  3.20.100 - avfilter.h
>    Add AV_PKT_DATA_STRINGS_METADATA side data type, used to transmit key/value
> diff --git a/libavutil/opt.c b/libavutil/opt.c
> index 46f93de..b577500 100644
> --- a/libavutil/opt.c
> +++ b/libavutil/opt.c
> @@ -828,13 +828,37 @@ static int get_key(const char **ropts, const char *delim, char **rkey)
>      return 0;
>  }
>  
> +int av_opt_get_key_value(const char **ropts,
> +                         const char *key_val_sep, const char *pairs_sep,
> +                         unsigned flags,
> +                         char **rkey, char **rval)
> +{
> +    int ret;
> +    char *key = NULL, *val;
> +    const char *opts = *ropts;
> +
> +    if ((ret = get_key(&opts, key_val_sep, &key)) < 0 &&
> +        !(flags & AV_OPT_FLAG_IMPLICIT_KEY))
> +        return AVERROR(EINVAL);
> +    if (!(val = av_get_token(&opts, pairs_sep))) {
> +        av_free(key);
> +        return AVERROR(ENOMEM);
> +    }
> +    if (*opts && strchr(pairs_sep, *opts))
> +        opts++;
> +    *ropts = opts;
> +    *rkey  = key;
> +    *rval  = val;

maybe you can use directly ropts, rkey, rval

> +    return 0;
> +}
> +
>  int av_opt_set_from_string(void *ctx, const char *opts,
>                             const char *const *shorthand,
>                             const char *key_val_sep, const char *pairs_sep)
>  {
>      int ret, count = 0;
>      const char *dummy_shorthand = NULL;
> -    char *parsed_key, *value;

> +    char *av_uninit(parsed_key), *av_uninit(value);

What's this useful for?

>      const char *key;
>  
>      if (!opts)
> @@ -843,25 +867,25 @@ int av_opt_set_from_string(void *ctx, const char *opts,
>          shorthand = &dummy_shorthand;
>  
>      while (*opts) {
> -        parsed_key = NULL; /* so we can free it anyway */
> -        if ((ret = get_key(&opts, key_val_sep, &parsed_key)) < 0) {
> -            if (*shorthand) {
> -                key = *(shorthand++);
> -            } else {
> +        ret = av_opt_get_key_value(&opts, key_val_sep, pairs_sep,
> +                                   *shorthand ? AV_OPT_FLAG_IMPLICIT_KEY : 0,
> +                                   &parsed_key, &value);
> +        if (ret < 0) {
> +            if (ret == AVERROR(EINVAL))
>                  av_log(ctx, AV_LOG_ERROR, "No option name near '%s'\n", opts);
> -                return AVERROR(EINVAL);
> -            }
> -        } else {
> +            else
> +                av_log(ctx, AV_LOG_ERROR, "Unable to parse '%s': %s\n", opts,
> +                       av_err2str(ret));
> +            return ret;
> +        }
> +        if (parsed_key) {
>              key = parsed_key;
>              while (*shorthand) /* discard all remaining shorthand */
>                  shorthand++;
> +        } else {
> +            key = *(shorthand++);
>          }
>  
> -        if (!(value = av_get_token(&opts, pairs_sep)))
> -            return AVERROR(ENOMEM);
> -        if (*opts && strchr(pairs_sep, *opts))
> -            opts++;
> -
>          av_log(ctx, AV_LOG_DEBUG, "Setting '%s' to value '%s'\n", key, value);
>          if ((ret = av_opt_set(ctx, key, value, 0)) < 0) {
>              if (ret == AVERROR_OPTION_NOT_FOUND)
> diff --git a/libavutil/opt.h b/libavutil/opt.h
> index 81fefd9..a1165f0 100644
> --- a/libavutil/opt.h
> +++ b/libavutil/opt.h
> @@ -455,6 +455,38 @@ int av_opt_flag_is_set(void *obj, const char *field_name, const char *flag_name)
>  int av_opt_set_dict(void *obj, struct AVDictionary **options);
>  
>  /**
> + * Extract a key-value pair from the beginning of a string.
> + *
> + * @param ropts        pointer to the options string, will be updated to
> + *                     point to the rest of the string
> + * @param key_val_sep  a 0-terminated list of characters used to separate
> + *                     key from value, for example '='
> + * @param pairs_sep    a 0-terminated list of characters used to separate
> + *                     two pairs from each other, for example ':' or ','
> + * @param flags        flags; see the AV_OPT_FLAG_* values below
> + * @param rkey         parsed key; must be freed using av_free()
> + * @param rval         parsed value; must be freed using av_free()

Possibly mention what "r" stands for (return or whatever).

> + *
> + * @return  0 for success, or a negative value corresponding to an AVERROR
> + *          code in case of error; in particular:
> + *          AVERROR(EINVAL) if no key is present
> + *
> + */
> +int av_opt_get_key_value(const char **ropts,
> +                         const char *key_val_sep, const char *pairs_sep,
> +                         unsigned flags,
> +                         char **rkey, char **rval);
> +
> +enum {
> +
> +    /**
> +     * Accept to parse a value without a key; the key will then be returned
> +     * as NULL

Final dot missing

> +     */
> +    AV_OPT_FLAG_IMPLICIT_KEY = 1,
> +};
> +
> +/**
>   * @defgroup opt_eval_funcs Evaluating option strings
>   * @{
>   * This group of functions can be used to evaluate option strings
> diff --git a/libavutil/version.h b/libavutil/version.h
> index 94a4a47..60a7450 100644
> --- a/libavutil/version.h
> +++ b/libavutil/version.h
> @@ -75,7 +75,7 @@
>   */
>  
>  #define LIBAVUTIL_VERSION_MAJOR  52
> -#define LIBAVUTIL_VERSION_MINOR   1
> +#define LIBAVUTIL_VERSION_MINOR   2
>  #define LIBAVUTIL_VERSION_MICRO 100
>  
>  #define LIBAVUTIL_VERSION_INT   AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \

LGTM, thanks.
-- 
FFmpeg = Fierce and Free Mastodontic Portable Ecumenical God


More information about the ffmpeg-devel mailing list