rtsp: Split out a function undoing the setup made by ff_rtsp_make_setup_request
authorMartin Storsjo <martin@martin.st>
Mon, 24 Jan 2011 09:49:02 +0000 (09:49 +0000)
committerJanne Grunau <janne-ffmpeg@jannau.net>
Mon, 24 Jan 2011 21:46:39 +0000 (22:46 +0100)
Signed-off-by: Janne Grunau <janne-ffmpeg@jannau.net>
libavformat/rtsp.c
libavformat/rtsp.h

index feb6193..dcceb68 100644 (file)
@@ -474,6 +474,42 @@ int ff_sdp_parse(AVFormatContext *s, const char *content)
 }
 #endif /* CONFIG_RTPDEC */
 
+void ff_rtsp_undo_setup(AVFormatContext *s)
+{
+    RTSPState *rt = s->priv_data;
+    int i;
+
+    for (i = 0; i < rt->nb_rtsp_streams; i++) {
+        RTSPStream *rtsp_st = rt->rtsp_streams[i];
+        if (!rtsp_st)
+            continue;
+        if (rtsp_st->transport_priv) {
+            if (s->oformat) {
+                AVFormatContext *rtpctx = rtsp_st->transport_priv;
+                av_write_trailer(rtpctx);
+                if (rt->lower_transport == RTSP_LOWER_TRANSPORT_TCP) {
+                    uint8_t *ptr;
+                    url_close_dyn_buf(rtpctx->pb, &ptr);
+                    av_free(ptr);
+                } else {
+                    url_fclose(rtpctx->pb);
+                }
+                av_metadata_free(&rtpctx->streams[0]->metadata);
+                av_metadata_free(&rtpctx->metadata);
+                av_free(rtpctx->streams[0]);
+                av_free(rtpctx);
+            } else if (rt->transport == RTSP_TRANSPORT_RDT && CONFIG_RTPDEC)
+                ff_rdt_parse_close(rtsp_st->transport_priv);
+            else if (CONFIG_RTPDEC)
+                rtp_parse_close(rtsp_st->transport_priv);
+        }
+        rtsp_st->transport_priv = NULL;
+        if (rtsp_st->rtp_handle)
+            url_close(rtsp_st->rtp_handle);
+        rtsp_st->rtp_handle = NULL;
+    }
+}
+
 /* close and free RTSP streams */
 void ff_rtsp_close_streams(AVFormatContext *s)
 {
@@ -481,31 +517,10 @@ void ff_rtsp_close_streams(AVFormatContext *s)
     int i;
     RTSPStream *rtsp_st;
 
+    ff_rtsp_undo_setup(s);
     for (i = 0; i < rt->nb_rtsp_streams; i++) {
         rtsp_st = rt->rtsp_streams[i];
         if (rtsp_st) {
-            if (rtsp_st->transport_priv) {
-                if (s->oformat) {
-                    AVFormatContext *rtpctx = rtsp_st->transport_priv;
-                    av_write_trailer(rtpctx);
-                    if (rt->lower_transport == RTSP_LOWER_TRANSPORT_TCP) {
-                        uint8_t *ptr;
-                        url_close_dyn_buf(rtpctx->pb, &ptr);
-                        av_free(ptr);
-                    } else {
-                        url_fclose(rtpctx->pb);
-                    }
-                    av_metadata_free(&rtpctx->streams[0]->metadata);
-                    av_metadata_free(&rtpctx->metadata);
-                    av_free(rtpctx->streams[0]);
-                    av_free(rtpctx);
-                } else if (rt->transport == RTSP_TRANSPORT_RDT && CONFIG_RTPDEC)
-                    ff_rdt_parse_close(rtsp_st->transport_priv);
-                else if (CONFIG_RTPDEC)
-                    rtp_parse_close(rtsp_st->transport_priv);
-            }
-            if (rtsp_st->rtp_handle)
-                url_close(rtsp_st->rtp_handle);
             if (rtsp_st->dynamic_handler && rtsp_st->dynamic_protocol_context)
                 rtsp_st->dynamic_handler->close(
                     rtsp_st->dynamic_protocol_context);
index 2ef68db..6dc64b1 100644 (file)
@@ -511,4 +511,10 @@ int ff_rtsp_fetch_packet(AVFormatContext *s, AVPacket *pkt);
 int ff_rtsp_make_setup_request(AVFormatContext *s, const char *host, int port,
                                int lower_transport, const char *real_challenge);
 
+/**
+ * Undo the effect of ff_rtsp_make_setup_request, close the
+ * transport_priv and rtp_handle fields.
+ */
+void ff_rtsp_undo_setup(AVFormatContext *s);
+
 #endif /* AVFORMAT_RTSP_H */