summaryrefslogtreecommitdiff
path: root/libavutil/opt.c
diff options
context:
space:
mode:
authorNicolas George <nicolas.george@normalesup.org>2012-11-02 11:55:53 +0100
committerNicolas George <nicolas.george@normalesup.org>2012-11-04 10:47:52 +0100
commit3bdf4971bab4d6f945035c42c551f76bf426d29b (patch)
treed98ab3fa3d1ef1eed919e2558539bd1b6e5df26a /libavutil/opt.c
parente021eeb9f06f4f4d83690d07b47cdcc4172a61e1 (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.c52
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)