# HG changeset patch # User rtognimp # Date 1054158053 0 # Node ID 0c72c1d0d6a41bf25e0e10b4b58d906c437fb050 # Parent 5c773d4f3a60e77c0cd0615f1cabac99af940974 Fix redirection in real rtsp connections. Patch by yepyep (sdpplin.c part not committed) diff -r 5c773d4f3a60 -r 0c72c1d0d6a4 libmpdemux/network.c --- 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; diff -r 5c773d4f3a60 -r 0c72c1d0d6a4 libmpdemux/realrtsp/rtsp_session.c --- 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"); diff -r 5c773d4f3a60 -r 0c72c1d0d6a4 libmpdemux/realrtsp/rtsp_session.h --- 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);