[FFmpeg-devel] [PATCH 07/11] lavu/dict: add av_dict_serialize

Lukasz Marek lukasz.m.luki2 at gmail.com
Mon Nov 17 02:46:54 CET 2014


TODO: bump minor, update doc/APIchanges

Signed-off-by: Lukasz Marek <lukasz.m.luki2 at gmail.com>
---
 libavutil/dict.c | 27 +++++++++++++++++++++++++++
 libavutil/dict.h | 16 ++++++++++++++++
 2 files changed, 43 insertions(+)

diff --git a/libavutil/dict.c b/libavutil/dict.c
index 475e906..a41d61e 100644
--- a/libavutil/dict.c
+++ b/libavutil/dict.c
@@ -24,6 +24,7 @@
 #include "dict.h"
 #include "internal.h"
 #include "mem.h"
+#include "bprint.h"
 
 struct AVDictionary {
     int count;
@@ -207,3 +208,29 @@ void av_dict_copy(AVDictionary **dst, FF_CONST_AVUTIL53 AVDictionary *src, int f
     while ((t = av_dict_get(src, "", t, AV_DICT_IGNORE_SUFFIX)))
         av_dict_set(dst, t->key, t->value, flags);
 }
+
+int av_dict_serialize(const AVDictionary *m, char **buffer,
+                      const char pairs_sep, const char key_val_sep)
+{
+    AVDictionaryEntry *t = NULL;
+    AVBPrint bprint;
+    int cnt = 0;
+
+    if (!m || !buffer)
+        return AVERROR(EINVAL);
+
+    if (!av_dict_count(m)) {
+        *buffer = av_strdup("");
+        return *buffer ? 0 : AVERROR(ENOMEM);
+    }
+
+    av_bprint_init(&bprint, 64, AV_BPRINT_SIZE_UNLIMITED);
+
+    while ((t = av_dict_get(m, "", t, AV_DICT_IGNORE_SUFFIX))) {
+        if (cnt++)
+            av_bprint_append_data(&bprint, &pairs_sep, 1);
+        av_bprintf(&bprint, "%s%c%s", t->key, key_val_sep, t->value);
+    }
+
+    return av_bprint_finalize(&bprint, buffer);
+}
diff --git a/libavutil/dict.h b/libavutil/dict.h
index 9b3381b..6088837 100644
--- a/libavutil/dict.h
+++ b/libavutil/dict.h
@@ -172,6 +172,22 @@ void av_dict_copy(AVDictionary **dst, FF_CONST_AVUTIL53 AVDictionary *src, int f
 void av_dict_free(AVDictionary **m);
 
 /**
+ * Serialize a dictionary.
+ *
+ * Create a string containing dictionary's serialized entries.
+ * Such string may be passed back to av_dict_parse_string().
+ *
+ * @param[in]  m             dictionary to serialize
+ * @param[out] buffer        Pointer to buffer that will be allocated with string containg serialized entries.
+ *                           Buffer must be freed by the caller when is no longer needed.
+ * @param[in]  key_val_sep   character used to separate key from value
+ * @param[in]  pairs_sep     character used to separate two pairs from each other
+ * @return                   >= 0 on success, negative on error
+ */
+int av_dict_serialize(const AVDictionary *m, char **buffer,
+                      const char pairs_sep, const char key_val_sep);
+
+/**
  * @}
  */
 
-- 
1.9.1



More information about the ffmpeg-devel mailing list