[FFmpeg-devel] [PATCH 1/2] lavu/dict: Add new flag to allow multiple equal keys.

Thilo Borgmann thilo.borgmann at mail.de
Sun Mar 13 21:00:23 CET 2016


Am 13.03.16 um 15:08 schrieb wm4:
> On Sat, 12 Mar 2016 15:13:21 +0100
> Thilo Borgmann <thilo.borgmann at mail.de> wrote:
> 
>> From a1d9ce388c69eabb256e6b351c2acd36d7f4076e Mon Sep 17 00:00:00 2001
>> From: Thilo Borgmann <thilo.borgmann at mail.de>
>> Date: Sat, 12 Mar 2016 14:52:17 +0100
>> Subject: [PATCH 1/2] lavu/dict: Add new flag to allow multiple equal keys.
>>
>> ---
>>  libavutil/dict.c | 5 ++++-
>>  libavutil/dict.h | 5 +++--
>>  2 files changed, 7 insertions(+), 3 deletions(-)
>>
>> diff --git a/libavutil/dict.c b/libavutil/dict.c
>> index 8bb65a1..70c0184 100644
>> --- a/libavutil/dict.c
>> +++ b/libavutil/dict.c
>> @@ -70,9 +70,12 @@ 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);
>> +    AVDictionaryEntry *tag = NULL;
>>      char *oldval = NULL, *copy_key = NULL, *copy_value = NULL;
>>  
>> +    if (!(flags & AV_DICT_MULTIKEY)) {
>> +        tag = av_dict_get(m, key, NULL, flags);
>> +    }
>>      if (flags & AV_DICT_DONT_STRDUP_KEY)
>>          copy_key = (void *)key;
>>      else
>> diff --git a/libavutil/dict.h b/libavutil/dict.h
>> index b0aa784..c589bcd 100644
>> --- a/libavutil/dict.h
>> +++ b/libavutil/dict.h
>> @@ -76,6 +76,7 @@
>>  #define AV_DICT_DONT_OVERWRITE 16   ///< Don't overwrite existing entries.
>>  #define AV_DICT_APPEND         32   /**< If the entry already exists, append to it.  Note that no
>>                                        delimiter is added, the strings are simply concatenated. */
>> +#define AV_DICT_MULTIKEY       64   /**< Allow to store several equal keys in the dictionary */
>>  
>>  typedef struct AVDictionaryEntry {
>>      char *key;
>> @@ -118,8 +119,8 @@ int av_dict_count(const AVDictionary *m);
>>   *
>>   * @param pm pointer to a pointer to a dictionary struct. If *pm is NULL
>>   * a dictionary struct is allocated and put in *pm.
>> - * @param key entry key to add to *pm (will be av_strduped depending on flags)
>> - * @param value entry value to add to *pm (will be av_strduped depending on flags).
>> + * @param key entry key to add to *pm (will either be av_strduped or added as a new key depending on flags)
>> + * @param value entry value to add to *pm (will be av_strduped or added as a new key depending on flags).
>>   *        Passing a NULL value will cause an existing entry to be deleted.
>>   * @return >= 0 on success otherwise an error code <0
>>   */
> 
> Changing the semantics of AVDictionary just like this seems rather
> questionable...

It changes nothing for existing code, just adds a new feature. I don't
think it hurts anyone or anything...

> Are you sure you don't want a list instead?

AVDictionary serves the purpose perfectly and already handles all the
key value seperation, parsing and error resilience... do we have a list
container ready to do that?
I'm not happy to use a deprecated thing either but AVTree seems not to
be ready yet (parsing from string, keeping insertion order of keys even
when rebalancing and most importantly enumeration (sequentially search
for keys) seems not to be ready for multiple keys - although the tree
itself can handle mutliple equal keys). This is why I decided to go with
adding a new flag to the AVDictionary rather than doing it with AVTree
nearly from scratch...

-Thilo


More information about the ffmpeg-devel mailing list