summaryrefslogtreecommitdiff
path: root/libavformat
diff options
context:
space:
mode:
authorMartin Storsjo <martin@martin.st>2011-01-24 09:49:02 +0000
committerJanne Grunau <janne-ffmpeg@jannau.net>2011-01-24 22:46:39 +0100
commit93e7490ee0c456d7e0fa43e3bf2cb4a8eed19194 (patch)
tree1480c30b5f46d1aaa10186fd418ba9bd31898668 /libavformat
parentfef5649a820b30432578e1440776e7a71bd523cc (diff)
rtsp: Split out a function undoing the setup made by ff_rtsp_make_setup_request
Signed-off-by: Janne Grunau <janne-ffmpeg@jannau.net>
Diffstat (limited to 'libavformat')
-rw-r--r--libavformat/rtsp.c59
-rw-r--r--libavformat/rtsp.h6
2 files changed, 43 insertions, 22 deletions
diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c
index feb61937fb..dcceb68a25 100644
--- a/libavformat/rtsp.c
+++ b/libavformat/rtsp.c
@@ -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);
diff --git a/libavformat/rtsp.h b/libavformat/rtsp.h
index 2ef68db18b..6dc64b19ae 100644
--- a/libavformat/rtsp.h
+++ b/libavformat/rtsp.h
@@ -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 */