avformat/segment: Free SegmentListEntries in deinit, not write_trailer

This fixes leaks when the trailer is never written.

Reviewed-by: Ridley Combs <rcombs@rcombs.me>
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
This commit is contained in:
Andreas Rheinhardt 2020-09-05 23:36:03 +02:00
parent 30de02998d
commit 848f96a2a6

View File

@ -660,6 +660,8 @@ static int select_reference_stream(AVFormatContext *s)
static void seg_free(AVFormatContext *s)
{
SegmentContext *seg = s->priv_data;
SegmentListEntry *cur;
ff_format_io_close(s, &seg->list_pb);
if (seg->avf) {
if (seg->is_nullctx)
@ -672,6 +674,14 @@ static void seg_free(AVFormatContext *s)
av_freep(&seg->times);
av_freep(&seg->frames);
av_freep(&seg->cur_entry.filename);
cur = seg->segment_list_entries;
while (cur) {
SegmentListEntry *next = cur->next;
av_freep(&cur->filename);
av_free(cur);
cur = next;
}
}
static int seg_init(AVFormatContext *s)
@ -971,7 +981,6 @@ static int seg_write_trailer(struct AVFormatContext *s)
{
SegmentContext *seg = s->priv_data;
AVFormatContext *oc = seg->avf;
SegmentListEntry *cur, *next;
int ret = 0;
if (!oc)
@ -994,14 +1003,6 @@ fail:
av_opt_free(seg);
cur = seg->segment_list_entries;
while (cur) {
next = cur->next;
av_freep(&cur->filename);
av_free(cur);
cur = next;
}
avformat_free_context(oc);
seg->avf = NULL;
return ret;