[FFmpeg-devel] [PATCH 4/6] Use avformat_free_context for cleaning up muxers

Martin Storsjö martin
Fri Feb 4 11:04:18 CET 2011


---
 ffmpeg.c                   |   16 +---------------
 libavformat/movenchint.c   |   20 +++-----------------
 libavformat/rtpenc_chain.c |    6 +-----
 libavformat/rtsp.c         |    8 +-------
 libavformat/sapenc.c       |    8 +-------
 5 files changed, 7 insertions(+), 51 deletions(-)

diff --git a/ffmpeg.c b/ffmpeg.c
index 6d4c0f6..b0d3320 100644
--- a/ffmpeg.c
+++ b/ffmpeg.c
@@ -505,25 +505,11 @@ static int ffmpeg_exit(int ret)
 
     /* close files */
     for(i=0;i<nb_output_files;i++) {
-        /* maybe av_close_output_file ??? */
         AVFormatContext *s = output_files[i];
         int j;
         if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
             url_fclose(s->pb);
-        for(j=0;j<s->nb_streams;j++) {
-            av_metadata_free(&s->streams[j]->metadata);
-            av_free(s->streams[j]->codec);
-            av_free(s->streams[j]->info);
-            av_free(s->streams[j]);
-        }
-        for(j=0;j<s->nb_programs;j++) {
-            av_metadata_free(&s->programs[j]->metadata);
-        }
-        for(j=0;j<s->nb_chapters;j++) {
-            av_metadata_free(&s->chapters[j]->metadata);
-        }
-        av_metadata_free(&s->metadata);
-        av_free(s);
+        avformat_free_context(s);
         av_free(output_streams_for_file[i]);
     }
     for(i=0;i<nb_input_files;i++) {
diff --git a/libavformat/movenchint.c b/libavformat/movenchint.c
index 6a9df07..10913dd 100644
--- a/libavformat/movenchint.c
+++ b/libavformat/movenchint.c
@@ -81,17 +81,9 @@ fail:
         url_close_dyn_buf(track->rtp_ctx->pb, &buf);
         av_free(buf);
     }
-    if (track->rtp_ctx && track->rtp_ctx->streams[0]) {
-        av_metadata_free(&track->rtp_ctx->streams[0]->metadata);
-        av_free(track->rtp_ctx->streams[0]->codec->extradata);
-        av_free(track->rtp_ctx->streams[0]->codec);
-        av_free(track->rtp_ctx->streams[0]->info);
-        av_free(track->rtp_ctx->streams[0]);
-    }
     if (track->rtp_ctx) {
-        av_metadata_free(&track->rtp_ctx->metadata);
-        av_free(track->rtp_ctx->priv_data);
-        av_freep(&track->rtp_ctx);
+        avformat_free_context(track->rtp_ctx);
+        track->rtp_ctx = NULL;
     }
     av_freep(&track->enc);
     /* Set a default timescale, to avoid crashes in dump_format */
@@ -488,12 +480,6 @@ void ff_mov_close_hinting(MOVTrack *track) {
         url_close_dyn_buf(rtp_ctx->pb, &ptr);
         av_free(ptr);
     }
-    av_metadata_free(&rtp_ctx->streams[0]->metadata);
-    av_metadata_free(&rtp_ctx->metadata);
-    av_free(rtp_ctx->streams[0]->codec->extradata);
-    av_free(rtp_ctx->streams[0]->codec);
-    av_free(rtp_ctx->streams[0]->info);
-    av_free(rtp_ctx->streams[0]);
-    av_freep(&rtp_ctx);
+    avformat_free_context(rtp_ctx);
 }
 
diff --git a/libavformat/rtpenc_chain.c b/libavformat/rtpenc_chain.c
index 09b4ebd..e1f200c 100644
--- a/libavformat/rtpenc_chain.c
+++ b/libavformat/rtpenc_chain.c
@@ -66,11 +66,7 @@ AVFormatContext *ff_rtp_chain_mux_open(AVFormatContext *s, AVStream *st,
             url_close_dyn_buf(rtpctx->pb, &ptr);
             av_free(ptr);
         }
-        av_free(rtpctx->streams[0]->codec->extradata);
-        av_free(rtpctx->streams[0]->codec);
-        av_free(rtpctx->streams[0]->info);
-        av_free(rtpctx->streams[0]);
-        av_free(rtpctx);
+        avformat_free_context(rtpctx);
         return NULL;
     }
 
diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c
index d31e8ee..d3e88e9 100644
--- a/libavformat/rtsp.c
+++ b/libavformat/rtsp.c
@@ -498,13 +498,7 @@ void ff_rtsp_undo_setup(AVFormatContext *s)
                 } else {
                     url_fclose(rtpctx->pb);
                 }
-                av_metadata_free(&rtpctx->streams[0]->metadata);
-                av_metadata_free(&rtpctx->metadata);
-                av_free(rtpctx->streams[0]->codec->extradata);
-                av_free(rtpctx->streams[0]->codec);
-                av_free(rtpctx->streams[0]->info);
-                av_free(rtpctx->streams[0]);
-                av_free(rtpctx);
+                avformat_free_context(rtpctx);
             } else if (rt->transport == RTSP_TRANSPORT_RDT && CONFIG_RTPDEC)
                 ff_rdt_parse_close(rtsp_st->transport_priv);
             else if (CONFIG_RTPDEC)
diff --git a/libavformat/sapenc.c b/libavformat/sapenc.c
index 634f033..9bbacef 100644
--- a/libavformat/sapenc.c
+++ b/libavformat/sapenc.c
@@ -46,13 +46,7 @@ static int sap_write_close(AVFormatContext *s)
             continue;
         av_write_trailer(rtpctx);
         url_fclose(rtpctx->pb);
-        av_metadata_free(&rtpctx->streams[0]->metadata);
-        av_metadata_free(&rtpctx->metadata);
-        av_free(rtpctx->streams[0]->codec->extradata);
-        av_free(rtpctx->streams[0]->codec);
-        av_free(rtpctx->streams[0]->info);
-        av_free(rtpctx->streams[0]);
-        av_free(rtpctx);
+        avformat_free_context(rtpctx);
         s->streams[i]->priv_data = NULL;
     }
 
-- 
1.7.3.1




More information about the ffmpeg-devel mailing list