From 26cb700c824130532296574ff3f57bb5ba747079 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Thu, 11 Mar 2010 08:24:18 +0000 Subject: [PATCH] RTSP muxer: Create the SDP with the numerical IP of the peer instead of using the original host name Originally committed as revision 22464 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavformat/rtsp.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c index 57406a11d2..97ab519883 100644 --- a/libavformat/rtsp.c +++ b/libavformat/rtsp.c @@ -1328,13 +1328,14 @@ static int rtsp_setup_input_streams(AVFormatContext *s) return 0; } -static int rtsp_setup_output_streams(AVFormatContext *s) +static int rtsp_setup_output_streams(AVFormatContext *s, const char *addr) { RTSPState *rt = s->priv_data; RTSPMessageHeader reply1, *reply = &reply1; char cmd[1024]; int i; char *sdp; + AVFormatContext sdp_ctx, *ctx_array[1]; /* Announce the stream */ snprintf(cmd, sizeof(cmd), @@ -1344,7 +1345,23 @@ static int rtsp_setup_output_streams(AVFormatContext *s) sdp = av_mallocz(8192); if (sdp == NULL) return AVERROR(ENOMEM); - if (avf_sdp_create(&s, 1, sdp, 8192)) { + /* We create the SDP based on the RTSP AVFormatContext where we + * aren't allowed to change the filename field. (We create the SDP + * based on the RTSP context since the contexts for the RTP streams + * don't exist yet.) In order to specify a custom URL with the actual + * peer IP instead of the originally specified hostname, we create + * a temporary copy of the AVFormatContext, where the custom URL is set. + * + * FIXME: Create the SDP without copying the AVFormatContext. + * This either requires setting up the RTP stream AVFormatContexts + * already here (complicating things immensely) or getting a more + * flexible SDP creation interface. + */ + sdp_ctx = *s; + ff_url_join(sdp_ctx.filename, sizeof(sdp_ctx.filename), + "rtsp", NULL, addr, -1, NULL); + ctx_array[0] = &sdp_ctx; + if (avf_sdp_create(ctx_array, 1, sdp, 8192)) { av_free(sdp); return AVERROR_INVALIDDATA; } @@ -1507,7 +1524,7 @@ redirect: if (s->iformat) err = rtsp_setup_input_streams(s); else - err = rtsp_setup_output_streams(s); + err = rtsp_setup_output_streams(s, host); if (err) goto fail;