summaryrefslogtreecommitdiff
path: root/libavformat/rtsp.c
diff options
context:
space:
mode:
authorMartin Storsjö <martin@martin.st>2010-03-11 08:24:18 +0000
committerMartin Storsjö <martin@martin.st>2010-03-11 08:24:18 +0000
commit26cb700c824130532296574ff3f57bb5ba747079 (patch)
tree2dee1b18d76b7a96e0ce3ccc2f56d80d2e47bca4 /libavformat/rtsp.c
parentd8b91fae1df740eae4e1fd65fda09fbe650d4c1a (diff)
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
Diffstat (limited to 'libavformat/rtsp.c')
-rw-r--r--libavformat/rtsp.c23
1 files 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;