Merge commit '11c5f438ff83da5040e85bfa6299f56b321d32ef'
authorHendrik Leppkes <h.leppkes@gmail.com>
Wed, 14 Oct 2015 12:01:11 +0000 (14:01 +0200)
committerHendrik Leppkes <h.leppkes@gmail.com>
Wed, 14 Oct 2015 12:01:11 +0000 (14:01 +0200)
* commit '11c5f438ff83da5040e85bfa6299f56b321d32ef':
  dict: Change return type of av_dict_copy()

Merged-by: Hendrik Leppkes <h.leppkes@gmail.com>
1  2 
doc/APIchanges
libavutil/dict.c
libavutil/dict.h
libavutil/version.h

diff --cc doc/APIchanges
@@@ -15,10 -13,14 +15,14 @@@ libavutil:     2015-08-2
  
  API changes, most recent first:
  
 -2015-xx-xx - xxxxxxx - lavu 55.2.0 - dict.h
++2015-10-14 - xxxxxxx - lavu 55.4.100 / lavu 55.2.0 - dict.h
+   Change return type of av_dict_copy() from void to int, so that a proper
+   error code can be reported.
 -2015-xx-xx - xxxxxxx - lavc 57.0.0 - avcodec.h
 +2015-09-29 - xxxxxxx - lavc 57.3.100 / lavc 57.2.0 - avcodec.h
    Change type of AVPacket.duration from int to int64_t.
  
 -2015-xx-xx - xxxxxxx - lavc 57.2.0 - d3d11va.h
 +2015-09-17 - xxxxxxx - lavc 57.3.100 / lavc 57.2.0 - d3d11va.h
    Add av_d3d11va_alloc_context(). This function must from now on be used for
    allocating AVD3D11VAContext.
  
@@@ -214,148 -190,11 +214,153 @@@ int av_dict_copy(AVDictionary **dst, co
  {
      AVDictionaryEntry *t = NULL;
  
-     while ((t = av_dict_get(src, "", t, AV_DICT_IGNORE_SUFFIX)))
-         av_dict_set(dst, t->key, t->value, flags);
+     while ((t = av_dict_get(src, "", t, AV_DICT_IGNORE_SUFFIX))) {
+         int ret = av_dict_set(dst, t->key, t->value, flags);
+         if (ret < 0)
+             return ret;
+     }
+     return 0;
  }
 +
 +int av_dict_get_string(const AVDictionary *m, char **buffer,
 +                       const char key_val_sep, const char pairs_sep)
 +{
 +    AVDictionaryEntry *t = NULL;
 +    AVBPrint bprint;
 +    int cnt = 0;
 +    char special_chars[] = {pairs_sep, key_val_sep, '\0'};
 +
 +    if (!buffer || pairs_sep == '\0' || key_val_sep == '\0' || pairs_sep == key_val_sep ||
 +        pairs_sep == '\\' || key_val_sep == '\\')
 +        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_bprint_escape(&bprint, t->key, special_chars, AV_ESCAPE_MODE_BACKSLASH, 0);
 +        av_bprint_append_data(&bprint, &key_val_sep, 1);
 +        av_bprint_escape(&bprint, t->value, special_chars, AV_ESCAPE_MODE_BACKSLASH, 0);
 +    }
 +    return av_bprint_finalize(&bprint, buffer);
 +}
 +
 +#ifdef TEST
 +static void print_dict(const AVDictionary *m)
 +{
 +    AVDictionaryEntry *t = NULL;
 +    while ((t = av_dict_get(m, "", t, AV_DICT_IGNORE_SUFFIX)))
 +        printf("%s %s   ", t->key, t->value);
 +    printf("\n");
 +}
 +
 +static void test_separators(const AVDictionary *m, const char pair, const char val)
 +{
 +    AVDictionary *dict = NULL;
 +    char pairs[] = {pair , '\0'};
 +    char vals[]  = {val, '\0'};
 +
 +    char *buffer = NULL;
 +    av_dict_copy(&dict, m, 0);
 +    print_dict(dict);
 +    av_dict_get_string(dict, &buffer, val, pair);
 +    printf("%s\n", buffer);
 +    av_dict_free(&dict);
 +    av_dict_parse_string(&dict, buffer, vals, pairs, 0);
 +    av_freep(&buffer);
 +    print_dict(dict);
 +    av_dict_free(&dict);
 +}
 +
 +int main(void)
 +{
 +    AVDictionary *dict = NULL;
 +    AVDictionaryEntry *e;
 +    char *buffer = NULL;
 +
 +    printf("Testing av_dict_get_string() and av_dict_parse_string()\n");
 +    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);
 +    av_dict_set(&dict, "bbb", "bbb", 0);
 +    av_dict_set(&dict, "ccc", "ccc", 0);
 +    av_dict_set(&dict, "\\,=\'\"", "\\,=\'\"", 0);
 +    test_separators(dict, '"',  '=');
 +    test_separators(dict, '\'', '=');
 +    test_separators(dict, ',', '"');
 +    test_separators(dict, ',', '\'');
 +    test_separators(dict, '\'', '"');
 +    test_separators(dict, '"', '\'');
 +    av_dict_free(&dict);
 +
 +    printf("\nTesting av_dict_set()\n");
 +    av_dict_set(&dict, "a", "a", 0);
 +    av_dict_set(&dict, "b", av_strdup("b"), AV_DICT_DONT_STRDUP_VAL);
 +    av_dict_set(&dict, av_strdup("c"), "c", AV_DICT_DONT_STRDUP_KEY);
 +    av_dict_set(&dict, av_strdup("d"), av_strdup("d"), AV_DICT_DONT_STRDUP_KEY | AV_DICT_DONT_STRDUP_VAL);
 +    av_dict_set(&dict, "e", "e", AV_DICT_DONT_OVERWRITE);
 +    av_dict_set(&dict, "e", "f", AV_DICT_DONT_OVERWRITE);
 +    av_dict_set(&dict, "f", "f", 0);
 +    av_dict_set(&dict, "f", NULL, 0);
 +    av_dict_set(&dict, "ff", "f", 0);
 +    av_dict_set(&dict, "ff", "f", AV_DICT_APPEND);
 +    e = NULL;
 +    while ((e = av_dict_get(dict, "", e, AV_DICT_IGNORE_SUFFIX)))
 +        printf("%s %s\n", e->key, e->value);
 +    av_dict_free(&dict);
 +
 +    av_dict_set(&dict, NULL, "a", 0);
 +    av_dict_set(&dict, NULL, "b", 0);
 +    av_dict_get(dict, NULL, NULL, 0);
 +    e = NULL;
 +    while ((e = av_dict_get(dict, "", e, AV_DICT_IGNORE_SUFFIX)))
 +        printf("'%s' '%s'\n", e->key, e->value);
 +    av_dict_free(&dict);
 +
 +
 +    //valgrind sensible test
 +    printf("\nTesting av_dict_set_int()\n");
 +    av_dict_set_int(&dict, "1", 1, AV_DICT_DONT_STRDUP_VAL);
 +    av_dict_set_int(&dict, av_strdup("2"), 2, AV_DICT_DONT_STRDUP_KEY);
 +    av_dict_set_int(&dict, av_strdup("3"), 3, AV_DICT_DONT_STRDUP_KEY | AV_DICT_DONT_STRDUP_VAL);
 +    av_dict_set_int(&dict, "4", 4, 0);
 +    av_dict_set_int(&dict, "5", 5, AV_DICT_DONT_OVERWRITE);
 +    av_dict_set_int(&dict, "5", 6, AV_DICT_DONT_OVERWRITE);
 +    av_dict_set_int(&dict, "12", 1, 0);
 +    av_dict_set_int(&dict, "12", 2, AV_DICT_APPEND);
 +    e = NULL;
 +    while ((e = av_dict_get(dict, "", e, AV_DICT_IGNORE_SUFFIX)))
 +        printf("%s %s\n", e->key, e->value);
 +    av_dict_free(&dict);
 +
 +    //valgrind sensible test
 +    printf("\nTesting av_dict_set() with existing AVDictionaryEntry.key as key\n");
 +    av_dict_set(&dict, "key", "old", 0);
 +    e = av_dict_get(dict, "key", NULL, 0);
 +    av_dict_set(&dict, e->key, "new val OK", 0);
 +    e = av_dict_get(dict, "key", NULL, 0);
 +    printf("%s\n", e->value);
 +    av_dict_set(&dict, e->key, e->value, 0);
 +    e = av_dict_get(dict, "key", NULL, 0);
 +    printf("%s\n", e->value);
 +    av_dict_free(&dict);
 +
 +    return 0;
 +}
 +#endif
Simple merge
@@@ -55,9 -53,9 +55,9 @@@
   * @{
   */
  
 -#define LIBAVUTIL_VERSION_MAJOR 55
 -#define LIBAVUTIL_VERSION_MINOR  2
 -#define LIBAVUTIL_VERSION_MICRO  0
 +#define LIBAVUTIL_VERSION_MAJOR  55
- #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, \
                                                 LIBAVUTIL_VERSION_MINOR, \