|
|
|
@ -19,6 +19,7 @@ |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
#include <strings.h> |
|
|
|
|
#include "avstring.h" |
|
|
|
|
#include "dict.h" |
|
|
|
|
#include "internal.h" |
|
|
|
|
#include "mem.h" |
|
|
|
@ -51,6 +52,7 @@ int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags |
|
|
|
|
{ |
|
|
|
|
AVDictionary *m = *pm; |
|
|
|
|
AVDictionaryEntry *tag = av_dict_get(m, key, NULL, flags); |
|
|
|
|
char *oldval = NULL; |
|
|
|
|
|
|
|
|
|
if(!m) |
|
|
|
|
m = *pm = av_mallocz(sizeof(*m)); |
|
|
|
@ -58,6 +60,9 @@ int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags |
|
|
|
|
if(tag) { |
|
|
|
|
if (flags & AV_DICT_DONT_OVERWRITE) |
|
|
|
|
return 0; |
|
|
|
|
if (flags & AV_DICT_APPEND) |
|
|
|
|
oldval = tag->value; |
|
|
|
|
else |
|
|
|
|
av_free(tag->value); |
|
|
|
|
av_free(tag->key); |
|
|
|
|
*tag = m->elems[--m->count]; |
|
|
|
@ -75,6 +80,12 @@ int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags |
|
|
|
|
m->elems[m->count].key = av_strdup(key ); |
|
|
|
|
if (flags & AV_DICT_DONT_STRDUP_VAL) { |
|
|
|
|
m->elems[m->count].value = value; |
|
|
|
|
} else if (oldval && flags & AV_DICT_APPEND) { |
|
|
|
|
int len = strlen(oldval) + strlen(value) + 1; |
|
|
|
|
if (!(oldval = av_realloc(oldval, len))) |
|
|
|
|
return AVERROR(ENOMEM); |
|
|
|
|
av_strlcat(oldval, value, len); |
|
|
|
|
m->elems[m->count].value = oldval; |
|
|
|
|
} else |
|
|
|
|
m->elems[m->count].value = av_strdup(value); |
|
|
|
|
m->count++; |
|
|
|
|