diff --git a/ffmpeg.c b/ffmpeg.c index 5e2e38a870..aac071e747 100644 --- a/ffmpeg.c +++ b/ffmpeg.c @@ -396,9 +396,17 @@ static int av_exit(int ret) if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb) url_fclose(s->pb); for(j=0;jnb_streams;j++) { + av_metadata_free(&s->streams[j]->metadata); av_free(s->streams[j]->codec); av_free(s->streams[j]); } + for(j=0;jnb_programs;j++) { + av_metadata_free(&s->programs[j]->metadata); + } + for(j=0;jnb_chapters;j++) { + av_metadata_free(&s->chapters[j]->metadata); + } + av_metadata_free(&s->metadata); av_free(s); } for(i=0;icount--){ + av_free(m->elems[m->count].key); + av_free(m->elems[m->count].value); + } + av_free(m->elems); + } + av_freep(pm); +} + #if LIBAVFORMAT_VERSION_MAJOR < 53 #define FILL_METADATA(s, key, value) { \ if (value && *value && \ diff --git a/libavformat/utils.c b/libavformat/utils.c index e3fdd7f744..eb5549979f 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -2285,6 +2285,7 @@ void av_close_input_stream(AVFormatContext *s) if (st->parser) { av_parser_close(st->parser); } + av_metadata_free(&st->metadata); av_free(st->index_entries); av_free(st->codec->extradata); av_free(st->codec); @@ -2295,6 +2296,7 @@ void av_close_input_stream(AVFormatContext *s) for(i=s->nb_programs-1; i>=0; i--) { av_freep(&s->programs[i]->provider_name); av_freep(&s->programs[i]->name); + av_metadata_free(&s->programs[i]->metadata); av_freep(&s->programs[i]->stream_index); av_freep(&s->programs[i]); } @@ -2303,17 +2305,11 @@ void av_close_input_stream(AVFormatContext *s) av_freep(&s->priv_data); while(s->nb_chapters--) { av_free(s->chapters[s->nb_chapters]->title); + av_metadata_free(&s->chapters[s->nb_chapters]->metadata); av_free(s->chapters[s->nb_chapters]); } av_freep(&s->chapters); - if(s->metadata){ - while(s->metadata->count--){ - av_freep(&s->metadata->elems[s->metadata->count].key); - av_freep(&s->metadata->elems[s->metadata->count].value); - } - av_freep(&s->metadata->elems); - } - av_freep(&s->metadata); + av_metadata_free(&s->metadata); av_free(s); }