lavf: factor ff_free_stream() out
authorMichael Niedermayer <michaelni@gmx.at>
Tue, 21 Aug 2012 04:13:54 +0000 (06:13 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Tue, 21 Aug 2012 04:13:54 +0000 (06:13 +0200)
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
libavformat/internal.h
libavformat/utils.c

index 56bf2b0..cd91eb1 100644 (file)
@@ -344,4 +344,6 @@ int ff_read_packet(AVFormatContext *s, AVPacket *pkt);
 int ff_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out,
                                  AVPacket *pkt, int flush);
 
+void ff_free_stream(AVFormatContext *s, AVStream *st);
+
 #endif /* AVFORMAT_INTERNAL_H */
index bf8cba4..38d2e08 100644 (file)
@@ -2996,6 +2996,25 @@ int av_read_pause(AVFormatContext *s)
     return AVERROR(ENOSYS);
 }
 
+void ff_free_stream(AVFormatContext *s, AVStream *st){
+    av_assert0(s->nb_streams>0);
+    av_assert0(s->streams[ s->nb_streams-1 ] == st);
+
+    if (st->parser) {
+        av_parser_close(st->parser);
+    }
+    if (st->attached_pic.data)
+        av_free_packet(&st->attached_pic);
+    av_dict_free(&st->metadata);
+    av_freep(&st->index_entries);
+    av_freep(&st->codec->extradata);
+    av_freep(&st->codec->subtitle_header);
+    av_freep(&st->codec);
+    av_freep(&st->priv_data);
+    av_freep(&st->info);
+    av_freep(&s->streams[ --s->nb_streams ]);
+}
+
 void avformat_free_context(AVFormatContext *s)
 {
     int i;
@@ -3005,22 +3024,8 @@ 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];
-        if (st->parser) {
-            av_parser_close(st->parser);
-        }
-        if (st->attached_pic.data)
-            av_free_packet(&st->attached_pic);
-        av_dict_free(&st->metadata);
-        av_freep(&st->index_entries);
-        av_freep(&st->codec->extradata);
-        av_freep(&st->codec->subtitle_header);
-        av_freep(&st->codec);
-        av_freep(&st->priv_data);
-        av_freep(&st->info);
-        av_freep(&st);
+    for(i=s->nb_streams-1; i>=0; i--) {
+        ff_free_stream(s, s->streams[i]);
     }
     for(i=s->nb_programs-1; i>=0; i--) {
         av_dict_free(&s->programs[i]->metadata);