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

Michael Niedermayer michaelni at gmx.at
Wed Nov 19 20:58:59 CET 2014


On Wed, Nov 19, 2014 at 02:25:48AM +0100, Lukasz Marek wrote:
> On 19.11.2014 01:13, Michael Niedermayer wrote:
> >On Wed, Nov 19, 2014 at 12:30:53AM +0100, Lukasz Marek wrote:
> >>On 18.11.2014 20:47, Michael Niedermayer wrote:
> >>>>>how will that work without any way to identify the version or format?
> >>>>>
> >>>>>also a serialization stream thats self containd seems much nicer to
> >>>>>handle as theres no need to keep track of the exact version (if we
> >>>>>end up having more than 1) the used seperators, ...
> >>>>>
> >>>>>also consider 2 libs or apps to interface with each other using this
> >>>>>serialization format, if one requires a change to the format how can
> >>>>>the other know without a version in it, it would need to know it by
> >>>>>external means. it can surely be done but it doesnt feel like
> >>>>>something desirable
> >>>>>
> >>>>
> >>>>I can do one of followings:
> >>>>- I can move this function to ffserver_config.c, where it is needed as
> >>>>presented here (to create simple pairs separated with comas)
> >>>>- Rename function to av_dict_get_string or something so it wont get
> >>>>confused with your idea of serialize function. I still think both version
> >>>>has own usecases
> >>>
> >>>iam fine with either of these
> >>
> >>OK, renamed. I swapped separators order to be the same as
> >>parse_string's ones. added tests for corner cases where potential
> >>escape chars are separators.
> >
> >[...]
> >
> >>+{
> >>+    AVDictionary *dict = NULL;
> >>+    char *buffer = NULL;
> >>+
> >>+    printf("Testing av_dict_get_string() and av_dict_parse_string()");
> >>+    av_dict_get_string(dict, &buffer, '=', ',');
> >>+    printf("%s\n", buffer);
> >>+    av_freep(&buffer);
> >>+    av_dict_set(&dict, "aaa", "aaa", 0);
> >>+    av_dict_set(&dict, "b,b", "bbb", 0);
> >>+    av_dict_set(&dict, "c=c", "ccc", 0);
> >>+    av_dict_set(&dict, "ddd", "d,d", 0);
> >>+    av_dict_set(&dict, "eee", "e=e", 0);
> >>+    av_dict_set(&dict, "f,f", "f=f", 0);
> >>+    av_dict_set(&dict, "g=g", "g,g", 0);
> >>+    test_separators(dict, ',', '=');
> >>+    av_dict_free(&dict);
> >>+    av_dict_set(&dict, "aaa", "aaa", 0);
> >
> >i tried this instead
> >av_dict_set(&dict, "a\\,=\'\"aa", "a\\,=\'\"aa", 0);
> >
> >and it doesnt seem to work
> 
> obviously av_get_token is broken, i'm not going to fix it soon, so
> consider patchset dropped unless no one does or wahtever

i dont think we need \ as a seperator, supporting that case would
only add work
I suggest this:

diff --git a/libavutil/dict.c b/libavutil/dict.c
index e071ec9..fb984ea 100644
--- a/libavutil/dict.c
+++ b/libavutil/dict.c
@@ -220,6 +220,9 @@ int av_dict_get_string(const AVDictionary *m, char **buffer,
     if (!buffer || pairs_sep == '\0' || key_val_sep == '\0' || pairs_sep == key_val_sep)
         return AVERROR(EINVAL);

+    if (pairs_sep == '\\' || key_val_sep == '\\')
+        return AVERROR(EINVAL);
+
     if (!av_dict_count(m)) {
         *buffer = av_strdup("");
         return *buffer ? 0 : AVERROR(ENOMEM);


[...]

-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Everything should be made as simple as possible, but not simpler.
-- Albert Einstein
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 181 bytes
Desc: Digital signature
URL: <https://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20141119/e9adb67e/attachment.asc>


More information about the ffmpeg-devel mailing list