summaryrefslogtreecommitdiffstats
path: root/libmpdemux
diff options
context:
space:
mode:
authorrtognimp <rtognimp@b3059339-0415-0410-9bf9-f77b7e298cf2>2003-05-28 21:40:53 +0000
committerrtognimp <rtognimp@b3059339-0415-0410-9bf9-f77b7e298cf2>2003-05-28 21:40:53 +0000
commit7f47ef5532312f2eebb2d002c8cd29dbe4682979 (patch)
tree18036f93fae59cc1cdd47ab90ac3d4ebaba915a8 /libmpdemux
parent39fe37918d72a05f1447574b418b75b40502f884 (diff)
downloadmpv-7f47ef5532312f2eebb2d002c8cd29dbe4682979.tar.bz2
mpv-7f47ef5532312f2eebb2d002c8cd29dbe4682979.tar.xz
Fix redirection in real rtsp connections.
Patch by yepyep (sdpplin.c part not committed) git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@10200 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpdemux')
-rw-r--r--libmpdemux/network.c22
-rw-r--r--libmpdemux/realrtsp/rtsp_session.c16
-rw-r--r--libmpdemux/realrtsp/rtsp_session.h2
3 files changed, 32 insertions, 8 deletions
diff --git a/libmpdemux/network.c b/libmpdemux/network.c
index 6969f6f8f4..b09effa647 100644
--- a/libmpdemux/network.c
+++ b/libmpdemux/network.c
@@ -912,8 +912,15 @@ realrtsp_streaming_start( stream_t *stream ) {
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 @@ realrtsp_streaming_start( stream_t *stream ) {
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;
diff --git a/libmpdemux/realrtsp/rtsp_session.c b/libmpdemux/realrtsp/rtsp_session.c
index e14653c5e6..54b987b67b 100644
--- a/libmpdemux/realrtsp/rtsp_session.c
+++ b/libmpdemux/realrtsp/rtsp_session.c
@@ -65,7 +65,7 @@ struct rtsp_session_s {
};
//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 @@ rtsp_session_t *rtsp_session_start(int fd, char *mrl, char *path, char *host, in
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 @@ connect:
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");
diff --git a/libmpdemux/realrtsp/rtsp_session.h b/libmpdemux/realrtsp/rtsp_session.h
index ec71b4f7e3..d22788f1c5 100644
--- a/libmpdemux/realrtsp/rtsp_session.h
+++ b/libmpdemux/realrtsp/rtsp_session.h
@@ -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);