Mercurial > mplayer.hg
changeset 25135:66f628d13442
Support stream redirection from http to mms, fix bug #927.
author | ulion |
---|---|
date | Mon, 26 Nov 2007 00:41:21 +0000 |
parents | dcf1bfb29dc8 |
children | e029d2fcd20f |
files | stream/http.c stream/stream.c stream/stream.h |
diffstat | 3 files changed, 36 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/stream/http.c Mon Nov 26 00:28:05 2007 +0000 +++ b/stream/http.c Mon Nov 26 00:41:21 2007 +0000 @@ -721,7 +721,7 @@ HTTP_header_t *http_hdr = NULL; unsigned int i; int fd = stream->fd; - int res = 0; + int res = STREAM_UNSUPPORTED; int redirect = 0; int auth_retry=0; int seekable=0; @@ -783,6 +783,7 @@ *file_format = DEMUXER_TYPE_AAC; else *file_format = DEMUXER_TYPE_AUDIO; + res = STREAM_ERROR; goto out; } case 400: // Server Full @@ -836,6 +837,14 @@ next_url = http_get_field( http_hdr, "Location" ); if( next_url!=NULL ) { stream->streaming_ctrl->url = url_redirect( &url, next_url ); + if (!strcasecmp(url->protocol, "mms")) { + res = STREAM_REDIRECTED; + goto err_out; + } + if (strcasecmp(url->protocol, "http")) { + mp_msg(MSGT_NETWORK,MSGL_ERR,"Unsupported http %d redirect to %s protocol\n", http_hdr->status_code, url->protocol); + goto err_out; + } redirect = 1; } break; @@ -853,7 +862,6 @@ err_out: if (fd > 0) closesocket( fd ); fd = -1; - res = STREAM_UNSUPPORTED; http_free( http_hdr ); http_hdr = NULL; out: @@ -908,6 +916,8 @@ if (stream->fd >= 0) closesocket(stream->fd); stream->fd = -1; + if (seekable == STREAM_REDIRECTED) + return seekable; streaming_ctrl_free(stream->streaming_ctrl); stream->streaming_ctrl = NULL; return STREAM_UNSUPPORTED;
--- a/stream/stream.c Mon Nov 26 00:28:05 2007 +0000 +++ b/stream/stream.c Mon Nov 26 00:41:21 2007 +0000 @@ -145,7 +145,8 @@ }; stream_t* open_stream_plugin(stream_info_t* sinfo,char* filename,int mode, - char** options, int* file_format, int* ret) { + char** options, int* file_format, int* ret, + char** redirected_url) { void* arg = NULL; stream_t* s; m_struct_t* desc = (m_struct_t*)sinfo->opts; @@ -178,6 +179,16 @@ s->flags |= mode; *ret = sinfo->open(s,mode,arg,file_format); if((*ret) != STREAM_OK) { +#ifdef MPLAYER_NETWORK + if (*ret == STREAM_REDIRECTED && redirected_url) { + if (s->streaming_ctrl && s->streaming_ctrl->url + && s->streaming_ctrl->url->url) + *redirected_url = strdup(s->streaming_ctrl->url->url); + else + *redirected_url = NULL; + } + streaming_ctrl_free(s->streaming_ctrl); +#endif free(s->url); free(s); return NULL; @@ -204,6 +215,7 @@ int i,j,l,r; stream_info_t* sinfo; stream_t* s; + char *redirected_url = NULL; for(i = 0 ; auto_open_streams[i] ; i++) { sinfo = auto_open_streams[i]; @@ -218,9 +230,17 @@ ((strncmp(sinfo->protocols[j],filename,l) == 0) && (strncmp("://",filename+l,3) == 0))) { *file_format = DEMUXER_TYPE_UNKNOWN; - s = open_stream_plugin(sinfo,filename,mode,options,file_format,&r); + s = open_stream_plugin(sinfo,filename,mode,options,file_format,&r, + &redirected_url); if(s) return s; - if(r != STREAM_UNSUPPORTED) { + if(r == STREAM_REDIRECTED && redirected_url) { + mp_msg(MSGT_OPEN,MSGL_V, "[%s] open %s redirected to %s\n", + sinfo->info, filename, redirected_url); + s = open_stream_full(redirected_url, mode, options, file_format); + free(redirected_url); + return s; + } + else if(r != STREAM_UNSUPPORTED) { mp_msg(MSGT_OPEN,MSGL_ERR, MSGTR_FailedToOpen,filename); return NULL; }
--- a/stream/stream.h Mon Nov 26 00:28:05 2007 +0000 +++ b/stream/stream.h Mon Nov 26 00:41:21 2007 +0000 @@ -43,6 +43,7 @@ #define STREAM_SEEK (STREAM_SEEK_BW|STREAM_SEEK_FW) //////////// Open return code +#define STREAM_REDIRECTED -2 /// This can't open the requested protocol (used by stream wich have a /// * protocol when they don't know the requested protocol) #define STREAM_UNSUPPORTED -1