[FFmpeg-cvslog] lavu/opt: implement av_opt_get_key_value().

Nicolas George git at videolan.org
Sun Nov 4 11:00:17 CET 2012


ffmpeg | branch: master | Nicolas George <nicolas.george at normalesup.org> | Fri Nov  2 11:55:53 2012 +0100| [3bdf4971bab4d6f945035c42c551f76bf426d29b] | committer: Nicolas George

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.

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=3bdf4971bab4d6f945035c42c551f76bf426d29b
---

 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 60c6062..ecbee08 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 35475eb..11e757e 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 5d2031a..4a3b7f5 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 ce1298f..809530e 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, \



More information about the ffmpeg-cvslog mailing list