diff options
author | Nicolas George <nicolas.george@normalesup.org> | 2012-11-02 14:55:53 +0400 |
---|---|---|
committer | Nicolas George <nicolas.george@normalesup.org> | 2012-11-04 13:47:52 +0400 |
commit | 3bdf4971bab4d6f945035c42c551f76bf426d29b (patch) | |
tree | d98ab3fa3d1ef1eed919e2558539bd1b6e5df26a /libavutil/opt.c | |
parent | e021eeb9f06f4f4d83690d07b47cdcc4172a61e1 (diff) |
lavu/opt: implement av_opt_get_key_value().
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.
Diffstat (limited to 'libavutil/opt.c')
-rw-r--r-- | libavutil/opt.c | 52 |
1 files changed, 38 insertions, 14 deletions
diff --git a/libavutil/opt.c b/libavutil/opt.c index 35475ebb03..11e757eb43 100644 --- a/libavutil/opt.c +++ b/libavutil/opt.c @@ -854,13 +854,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; + 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); const char *key; if (!opts) @@ -869,25 +893,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) |