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, *copy_key = NULL, *copy_value = NULL;



    if (flags & AV_DICT_DONT_STRDUP_KEY)

        copy_key = (void *)key;

    else

        copy_key = av_strdup(key);

    if (flags & AV_DICT_DONT_STRDUP_VAL)

        copy_value = (void *)value;

    else if (copy_key)

        copy_value = av_strdup(value);

    if (!m)

        m = *pm = av_mallocz(sizeof(*m));

    if (!m || (key && !copy_key) || (value && !copy_value))

        goto err_out;



    if (tag) {

        if (flags & AV_DICT_DONT_OVERWRITE) {

            av_free(copy_key);

            av_free(copy_value);

            return 0;

        }

        if (flags & AV_DICT_APPEND)

            oldval = tag->value;

        else

            av_free(tag->value);

        av_free(tag->key);

        *tag = m->elems[--m->count];

    } else {

        AVDictionaryEntry *tmp = av_realloc(m->elems,

                                            (m->count + 1) * sizeof(*m->elems));

        if (!tmp)

            goto err_out;

        m->elems = tmp;

    }

    if (copy_value) {

        m->elems[m->count].key = copy_key;

        m->elems[m->count].value = copy_value;

        if (oldval && flags & AV_DICT_APPEND) {

            size_t len = strlen(oldval) + strlen(copy_value) + 1;

            char *newval = av_mallocz(len);

            if (!newval)

                goto err_out;

            av_strlcat(newval, oldval, len);

            av_freep(&oldval);

            av_strlcat(newval, copy_value, len);

            m->elems[m->count].value = newval;

            av_freep(&copy_value);

        }

        m->count++;

    } else {

        av_freep(&copy_key);

    }

    if (!m->count) {

        av_freep(&m->elems);

        av_freep(pm);

    }



    return 0;



err_out:

    if (m && !m->count) {

        av_freep(&m->elems);

        av_freep(pm);

    }

    av_free(copy_key);

    av_free(copy_value);

    return AVERROR(ENOMEM);

}

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, *copy_key = NULL, *copy_value = NULL;



    if (flags & AV_DICT_DONT_STRDUP_KEY)

        copy_key = (void *)key;

    else

        copy_key = av_strdup(key);

    if (flags & AV_DICT_DONT_STRDUP_VAL)

        copy_value = (void *)value;

    else if (copy_key)

        copy_value = av_strdup(value);

    if (!m)

        m = *pm = av_mallocz(sizeof(*m));

    if (!m || (key && !copy_key) || (value && !copy_value))

        goto err_out;



    if (tag) {

        if (flags & AV_DICT_DONT_OVERWRITE) {

            av_free(copy_key);

            av_free(copy_value);

            return 0;

        }

        if (flags & AV_DICT_APPEND)

            oldval = tag->value;

        else

            av_free(tag->value);

        av_free(tag->key);

        *tag = m->elems[--m->count];

    } else {

        AVDictionaryEntry *tmp = av_realloc(m->elems,

                                            (m->count + 1) * sizeof(*m->elems));

        if (!tmp)

            goto err_out;

        m->elems = tmp;

    }

    if (copy_value) {

        m->elems[m->count].key = copy_key;

        m->elems[m->count].value = copy_value;

        if (oldval && flags & AV_DICT_APPEND) {

            size_t len = strlen(oldval) + strlen(copy_value) + 1;

            char *newval = av_mallocz(len);

            if (!newval)

                goto err_out;

            av_strlcat(newval, oldval, len);

            av_freep(&oldval);

            av_strlcat(newval, copy_value, len);

            m->elems[m->count].value = newval;

            av_freep(&copy_value);

        }

        m->count++;

    } else {

        av_freep(&copy_key);

    }

    if (!m->count) {

        av_freep(&m->elems);

        av_freep(pm);

    }



    return 0;



err_out:

    if (m && !m->count) {

        av_freep(&m->elems);

        av_freep(pm);

    }

    av_free(copy_key);

    av_free(copy_value);

    return AVERROR(ENOMEM);

}

int FUNC_0(AVDictionary **VAR_0, const char *VAR_1, const char *VAR_2,

                int VAR_3)

{

    AVDictionary *m = *VAR_0;

    AVDictionaryEntry *tag = av_dict_get(m, VAR_1, NULL, VAR_3);

    char *VAR_4 = NULL, *VAR_5 = NULL, *VAR_6 = NULL;



    if (VAR_3 & AV_DICT_DONT_STRDUP_KEY)

        VAR_5 = (void *)VAR_1;

    else

        VAR_5 = av_strdup(VAR_1);

    if (VAR_3 & AV_DICT_DONT_STRDUP_VAL)

        VAR_6 = (void *)VAR_2;

    else if (VAR_5)

        VAR_6 = av_strdup(VAR_2);

    if (!m)

        m = *VAR_0 = av_mallocz(sizeof(*m));

    if (!m || (VAR_1 && !VAR_5) || (VAR_2 && !VAR_6))

        goto err_out;



    if (tag) {

        if (VAR_3 & AV_DICT_DONT_OVERWRITE) {

            av_free(VAR_5);

            av_free(VAR_6);

            return 0;

        }

        if (VAR_3 & AV_DICT_APPEND)

            VAR_4 = tag->VAR_2;

        else

            av_free(tag->VAR_2);

        av_free(tag->VAR_1);

        *tag = m->elems[--m->count];

    } else {

        AVDictionaryEntry *tmp = av_realloc(m->elems,

                                            (m->count + 1) * sizeof(*m->elems));

        if (!tmp)

            goto err_out;

        m->elems = tmp;

    }

    if (VAR_6) {

        m->elems[m->count].VAR_1 = VAR_5;

        m->elems[m->count].VAR_2 = VAR_6;

        if (VAR_4 && VAR_3 & AV_DICT_APPEND) {

            size_t len = strlen(VAR_4) + strlen(VAR_6) + 1;

            char *VAR_7 = av_mallocz(len);

            if (!VAR_7)

                goto err_out;

            av_strlcat(VAR_7, VAR_4, len);

            av_freep(&VAR_4);

            av_strlcat(VAR_7, VAR_6, len);

            m->elems[m->count].VAR_2 = VAR_7;

            av_freep(&VAR_6);

        }

        m->count++;

    } else {

        av_freep(&VAR_5);

    }

    if (!m->count) {

        av_freep(&m->elems);

        av_freep(VAR_0);

    }



    return 0;



err_out:

    if (m && !m->count) {

        av_freep(&m->elems);

        av_freep(VAR_0);

    }

    av_free(VAR_5);

    av_free(VAR_6);

    return AVERROR(ENOMEM);

}

int FUNC_0(AVDictionary **VAR_0, const char *VAR_1, const char *VAR_2,
int VAR_3)
{ AVDictionary *m = *VAR_0; AVDictionaryEntry *tag = av_dict_get(m, VAR_1, NULL, VAR_3); char *VAR_4 = NULL, *VAR_5 = NULL, *VAR_6 = NULL; if (VAR_3 & AV_DICT_DONT_STRDUP_KEY)
VAR_5 = (void *)VAR_1; else
VAR_5 = av_strdup(VAR_1); if (VAR_3 & AV_DICT_DONT_STRDUP_VAL)
VAR_6 = (void *)VAR_2; else if (VAR_5)
VAR_6 = av_strdup(VAR_2); if (!m)
m = *VAR_0 = av_mallocz(sizeof(*m)); if (!m || (VAR_1 && !VAR_5) || (VAR_2 && !VAR_6))
goto err_out; if (tag) { if (VAR_3 & AV_DICT_DONT_OVERWRITE) { av_free(VAR_5); av_free(VAR_6); return 0; } if (VAR_3 & AV_DICT_APPEND)
VAR_4 = tag->VAR_2; else
av_free(tag->VAR_2); av_free(tag->VAR_1); *tag = m->elems[--m->count]; } else { AVDictionaryEntry *tmp = av_realloc(m->elems,
(m->count + 1) * sizeof(*m->elems)); if (!tmp)
goto err_out; m->elems = tmp; } if (VAR_6) { m->elems[m->count].VAR_1 = VAR_5; m->elems[m->count].VAR_2 = VAR_6; if (VAR_4 && VAR_3 & AV_DICT_APPEND) { size_t len = strlen(VAR_4) + strlen(VAR_6) + 1; char *VAR_7 = av_mallocz(len); if (!VAR_7)
goto err_out; av_strlcat(VAR_7, VAR_4, len); av_freep(&VAR_4); av_strlcat(VAR_7, VAR_6, len); m->elems[m->count].VAR_2 = VAR_7; av_freep(&VAR_6); } m->count++; } else { av_freep(&VAR_5); } if (!m->count) { av_freep(&m->elems); av_freep(VAR_0); } return 0; err_out:
if (m && !m->count) { av_freep(&m->elems); av_freep(VAR_0); } av_free(VAR_5); av_free(VAR_6); return AVERROR(ENOMEM); }