summaryrefslogtreecommitdiff
path: root/libavformat/utils.c
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2014-07-20 08:40:35 +0000
committerAnton Khirnov <anton@khirnov.net>2015-11-08 11:49:23 +0100
commitaeda1121c91395d1f0d434bc7f227423aa2ff97d (patch)
tree54bfe9b7a4e38a22bcd95a6fdf38bba8a8e00fe3 /libavformat/utils.c
parent3efd71b4d0b4a73ccbbbdc092e6bbd54d92633f4 (diff)
lavf: factor out freeing an AVStream
It will be needed in other functions.
Diffstat (limited to 'libavformat/utils.c')
-rw-r--r--libavformat/utils.c58
1 files changed, 33 insertions, 25 deletions
diff --git a/libavformat/utils.c b/libavformat/utils.c
index 1fe7c6fbbb..734f83f1cd 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -2442,10 +2442,39 @@ int av_read_pause(AVFormatContext *s)
return AVERROR(ENOSYS);
}
+static void free_stream(AVStream **pst)
+{
+ AVStream *st = *pst;
+ int i;
+
+ if (!st)
+ return;
+
+ for (i = 0; i < st->nb_side_data; i++)
+ av_freep(&st->side_data[i].data);
+ av_freep(&st->side_data);
+
+ if (st->parser)
+ av_parser_close(st->parser);
+
+ if (st->attached_pic.data)
+ av_packet_unref(&st->attached_pic);
+
+ av_dict_free(&st->metadata);
+ av_freep(&st->probe_data.buf);
+ av_free(st->index_entries);
+ av_free(st->codec->extradata);
+ av_free(st->codec->subtitle_header);
+ av_free(st->codec);
+ av_free(st->priv_data);
+ av_free(st->info);
+
+ av_freep(pst);
+}
+
void avformat_free_context(AVFormatContext *s)
{
- int i, j;
- AVStream *st;
+ int i;
if (!s)
return;
@@ -2454,30 +2483,9 @@ void avformat_free_context(AVFormatContext *s)
if (s->iformat && s->iformat->priv_class && s->priv_data)
av_opt_free(s->priv_data);
- for (i = 0; i < s->nb_streams; i++) {
- /* free all data in a stream component */
- st = s->streams[i];
-
- for (j = 0; j < st->nb_side_data; j++)
- av_freep(&st->side_data[j].data);
- av_freep(&st->side_data);
- st->nb_side_data = 0;
+ for (i = 0; i < s->nb_streams; i++)
+ free_stream(&s->streams[i]);
- if (st->parser) {
- av_parser_close(st->parser);
- }
- if (st->attached_pic.data)
- av_packet_unref(&st->attached_pic);
- av_dict_free(&st->metadata);
- av_freep(&st->probe_data.buf);
- av_free(st->index_entries);
- av_free(st->codec->extradata);
- av_free(st->codec->subtitle_header);
- av_free(st->codec);
- av_free(st->priv_data);
- av_free(st->info);
- av_free(st);
- }
for (i = s->nb_programs - 1; i >= 0; i--) {
av_dict_free(&s->programs[i]->metadata);
av_freep(&s->programs[i]->stream_index);