aboutsummaryrefslogtreecommitdiffstats
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
parente021eeb9f06f4f4d83690d07b47cdcc4172a61e1 (diff)
downloadffmpeg-3bdf4971bab4d6f945035c42c551f76bf426d29b.tar.gz
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.
-rw-r--r--doc/APIchanges3
-rw-r--r--libavutil/opt.c52
-rw-r--r--libavutil/opt.h32
-rw-r--r--libavutil/version.h2
4 files changed, 74 insertions, 15 deletions
diff --git a/doc/APIchanges b/doc/APIchanges
index 60c6062cb6..ecbee08a5d 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.4.100 - opt.h
+ Add av_opt_get_key_value().
+
2012-11-03 - xxxxxxx - lavu 52.3.100 - opt.h
Add AV_OPT_TYPE_SAMPLE_FMT value to AVOptionType enum.
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)
diff --git a/libavutil/opt.h b/libavutil/opt.h
index 5d2031a54a..4a3b7f513a 100644
--- a/libavutil/opt.h
+++ b/libavutil/opt.h
@@ -456,6 +456,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()
+ *
+ * @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.
+ */
+ 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 ce1298fef6..809530e0d8 100644
--- a/libavutil/version.h
+++ b/libavutil/version.h
@@ -75,7 +75,7 @@
*/
#define LIBAVUTIL_VERSION_MAJOR 52
-#define LIBAVUTIL_VERSION_MINOR 3
+#define LIBAVUTIL_VERSION_MINOR 4
#define LIBAVUTIL_VERSION_MICRO 100
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \