aboutsummaryrefslogtreecommitdiffstats
path: root/libavformat
diff options
context:
space:
mode:
authorJames Almer <jamrial@gmail.com>2019-10-18 23:23:32 -0300
committerJames Almer <jamrial@gmail.com>2019-10-21 17:20:20 -0300
commit02cf2391966afb68269f0cd4d9ce876dc48ec66f (patch)
tree5e65401a7aa11fd89865e8a7b7b2c3604b0289d7 /libavformat
parent27bae5aacafed376350533e7cde2b396b589a15c (diff)
downloadffmpeg-02cf2391966afb68269f0cd4d9ce876dc48ec66f.tar.gz
avformat: call AVOutputFormat->deinit() when freeing the context
Despite the doxy stating that it's called when the muxer is destroyed, this was not true in practice. It's only called by av_write_trailer() and on init() failure. An AVFormatContext may be closed without writing the trailer if errors ocurred while muxing packets, so in order to prevent memory leaks, it should effectively be called when freeing the muxer. Signed-off-by: James Almer <jamrial@gmail.com>
Diffstat (limited to 'libavformat')
-rw-r--r--libavformat/mux.c17
-rw-r--r--libavformat/utils.c3
2 files changed, 13 insertions, 7 deletions
diff --git a/libavformat/mux.c b/libavformat/mux.c
index 0227c0dadc..411cca3fb2 100644
--- a/libavformat/mux.c
+++ b/libavformat/mux.c
@@ -485,6 +485,14 @@ static void flush_if_needed(AVFormatContext *s)
}
}
+static void deinit_muxer(AVFormatContext *s)
+{
+ if (s->oformat && s->oformat->deinit && s->internal->initialized)
+ s->oformat->deinit(s);
+ s->internal->initialized =
+ s->internal->streams_initialized = 0;
+}
+
int avformat_init_output(AVFormatContext *s, AVDictionary **options)
{
int ret = 0;
@@ -536,8 +544,7 @@ int avformat_write_header(AVFormatContext *s, AVDictionary **options)
return streams_already_initialized;
fail:
- if (s->oformat->deinit)
- s->oformat->deinit(s);
+ deinit_muxer(s);
return ret;
}
@@ -1286,11 +1293,7 @@ fail:
}
}
- if (s->oformat->deinit)
- s->oformat->deinit(s);
-
- s->internal->initialized =
- s->internal->streams_initialized = 0;
+ deinit_muxer(s);
if (s->pb)
avio_flush(s->pb);
diff --git a/libavformat/utils.c b/libavformat/utils.c
index 60f0229adc..cfb6d03397 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -4437,6 +4437,9 @@ void avformat_free_context(AVFormatContext *s)
if (!s)
return;
+ if (s->oformat && s->oformat->deinit && s->internal->initialized)
+ s->oformat->deinit(s);
+
av_opt_free(s);
if (s->iformat && s->iformat->priv_class && s->priv_data)
av_opt_free(s->priv_data);