changeset 10199:0c72c1d0d6a4

Fix redirection in real rtsp connections. Patch by yepyep (sdpplin.c part not committed)
author rtognimp
date Wed, 28 May 2003 21:40:53 +0000
parents 5c773d4f3a60
children d94b4fa2f810
files libmpdemux/network.c libmpdemux/realrtsp/rtsp_session.c libmpdemux/realrtsp/rtsp_session.h
diffstat 3 files changed, 32 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/libmpdemux/network.c	Tue May 27 19:58:28 2003 +0000
+++ b/libmpdemux/network.c	Wed May 28 21:40:53 2003 +0000
@@ -912,8 +912,15 @@
 	rtsp_session_t *rtsp;
 	char *mrl;
 	int port;
+	int redirected, temp;
 	char aport[10];
 	if( stream==NULL ) return -1;
+	
+	temp = 5; // counter so we don't get caught in infinite redirections (you never know)
+	
+	do {
+	
+	redirected = 0;
 
 	fd = connect2Server( stream->streaming_ctrl->url->hostname,
 		port = (stream->streaming_ctrl->url->port ? stream->streaming_ctrl->url->port : 554) );
@@ -925,9 +932,20 @@
 	strcpy(mrl,stream->streaming_ctrl->url->url);
 	strcat(mrl,":");
 	strcat(mrl,aport);
-	rtsp = rtsp_session_start(fd,mrl, stream->streaming_ctrl->url->file,
-		stream->streaming_ctrl->url->hostname, port);
+	rtsp = rtsp_session_start(fd,&mrl, stream->streaming_ctrl->url->file,
+		stream->streaming_ctrl->url->hostname, port, &redirected);
+
+	if ( redirected == 1 ) {
+		url_free(stream->streaming_ctrl->url);
+		stream->streaming_ctrl->url = url_new(mrl);
+		close(fd);
+	}
+
 	free(mrl);
+	temp--;
+
+	} while( (redirected != 0) && (temp > 0) );	
+
 	if(!rtsp) return -1;
 
 	stream->fd=fd;
--- a/libmpdemux/realrtsp/rtsp_session.c	Tue May 27 19:58:28 2003 +0000
+++ b/libmpdemux/realrtsp/rtsp_session.c	Wed May 28 21:40:53 2003 +0000
@@ -65,7 +65,7 @@
 };
 
 //rtsp_session_t *rtsp_session_start(char *mrl) {
-rtsp_session_t *rtsp_session_start(int fd, char *mrl, char *path, char *host, int port) {
+rtsp_session_t *rtsp_session_start(int fd, char **mrl, char *path, char *host, int port, int *redir) {
 
   rtsp_session_t *rtsp_session=malloc(sizeof(rtsp_session_t));
   char *server;
@@ -73,10 +73,11 @@
   rmff_header_t *h;
   uint32_t bandwidth=10485800;
 
-connect:
+//connect:
+  *redir = 0;
 
   /* connect to server */
-  rtsp_session->s=rtsp_connect(fd,mrl,path,host,port,NULL);
+  rtsp_session->s=rtsp_connect(fd,*mrl,path,host,port,NULL);
   if (!rtsp_session->s)
   {
     printf("rtsp_session: failed to connect to server %s\n", path);
@@ -107,8 +108,13 @@
         printf("rtsp_session: redirected to %s\n", mrl_line);
 	rtsp_close(rtsp_session->s);
 	free(server);
-  /* FIXME: this won't work in MPlayer, connection opened by caller */
-	goto connect; /* *shudder* i made a design mistake somewhere */
+        free(*mrl);
+        free(rtsp_session);
+        /* tell the caller to redirect, return url to redirect to in mrl */
+        *mrl = mrl_line;
+        *redir = 1;
+        return NULL;
+//	goto connect; /* *shudder* i made a design mistake somewhere */
       } else
       {
         printf("rtsp_session: session can not be established.\n");
--- a/libmpdemux/realrtsp/rtsp_session.h	Tue May 27 19:58:28 2003 +0000
+++ b/libmpdemux/realrtsp/rtsp_session.h	Wed May 28 21:40:53 2003 +0000
@@ -30,7 +30,7 @@
 
 typedef struct rtsp_session_s rtsp_session_t;
 
-rtsp_session_t *rtsp_session_start(int fd, char *mrl, char *path, char *host, int port);
+rtsp_session_t *rtsp_session_start(int fd, char **mrl, char *path, char *host, int port, int *redir);
 
 int rtsp_session_read(rtsp_session_t *session, char *data, int len);