Mercurial > mplayer.hg
changeset 18794:42001f5086d2
new RTSP demuxer dedicated file, based on old code from realrtsp one but intended to be much more generic
author | ben |
---|---|
date | Fri, 23 Jun 2006 20:17:12 +0000 |
parents | be9e036d38ad |
children | 4e089f3ebde1 |
files | libmpdemux/Makefile libmpdemux/realrtsp/rtsp.c libmpdemux/rtsp.c |
diffstat | 3 files changed, 176 insertions(+), 94 deletions(-) [+] |
line wrap: on
line diff
--- a/libmpdemux/Makefile Fri Jun 23 19:34:06 2006 +0000 +++ b/libmpdemux/Makefile Fri Jun 23 20:17:12 2006 +0000 @@ -130,6 +130,7 @@ asf_mmst_streaming.c \ pnm.c \ rtp.c \ + rtsp.c \ SRCS += realrtsp/asmrp.c \ realrtsp/real.c \
--- a/libmpdemux/realrtsp/rtsp.c Fri Jun 23 19:34:06 2006 +0000 +++ b/libmpdemux/realrtsp/rtsp.c Fri Jun 23 20:17:12 2006 +0000 @@ -65,7 +65,6 @@ #define HEADER_SIZE 1024 #define MAX_FIELDS 256 -extern int network_bandwidth; struct rtsp_s { int s; @@ -889,96 +888,3 @@ answer++; } } - -static int realrtsp_streaming_read( int fd, char *buffer, int size, streaming_ctrl_t *stream_ctrl ) { - return rtsp_session_read(stream_ctrl->data, buffer, size); -} - - -static int realrtsp_streaming_start( stream_t *stream ) { - int fd; - rtsp_session_t *rtsp; - char *mrl; - char *file; - int port; - int redirected, temp; - 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),1 ); - if(fd<0 && !stream->streaming_ctrl->url->port) - fd = connect2Server(stream->streaming_ctrl->url->hostname, port = 7070, 1); - if(fd<0) return -1; - - file = stream->streaming_ctrl->url->file; - if (file[0] == '/') - file++; - mrl = malloc(sizeof(char)*(strlen(stream->streaming_ctrl->url->hostname)+strlen(file)+16)); - sprintf(mrl,"rtsp://%s:%i/%s",stream->streaming_ctrl->url->hostname,port,file); - rtsp = rtsp_session_start(fd,&mrl, file, stream->streaming_ctrl->url->hostname, port, &redirected, stream->streaming_ctrl->bandwidth); - - if( redirected == 1) { - url_free(stream->streaming_ctrl->url); - stream->streaming_ctrl->url = url_new(mrl); - closesocket(fd); - } - - free(mrl); - temp--; - } while( (redirected != 0) && (temp > 0) ); - - if(!rtsp) return -1; - - stream->fd=fd; - stream->streaming_ctrl->data=rtsp; - - stream->streaming_ctrl->streaming_read = realrtsp_streaming_read; - //stream->streaming_ctrl->streaming_seek = nop_streaming_seek; - stream->streaming_ctrl->prebuffer_size = 128*1024; // 8 KBytes - stream->streaming_ctrl->buffering = 1; - stream->streaming_ctrl->status = streaming_playing_e; - return 0; -} - - -static int open_s(stream_t *stream,int mode, void* opts, int* file_format) { - URL_t *url; - - mp_msg(MSGT_OPEN, MSGL_INFO, "STREAM_RTSP, URL: %s\n", stream->url); - stream->streaming_ctrl = streaming_ctrl_new(); - if( stream->streaming_ctrl==NULL ) - return STREAM_ERROR; - - stream->streaming_ctrl->bandwidth = network_bandwidth; - url = url_new(stream->url); - stream->streaming_ctrl->url = check4proxies(url); - //url_free(url); - - stream->fd = -1; - if(realrtsp_streaming_start( stream ) < 0) { - streaming_ctrl_free(stream->streaming_ctrl); - stream->streaming_ctrl = NULL; - return STREAM_UNSUPORTED; - } - - fixup_network_stream_cache(stream); - stream->type = STREAMTYPE_STREAM; - return STREAM_OK; -} - - -stream_info_t stream_info_rtsp = { - "RealNetworks rtsp streaming", - "realrtsp", - "Roberto Togni, xine team", - "ported from xine", - open_s, - {"rtsp", NULL}, - NULL, - 0 // Urls are an option string -};
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libmpdemux/rtsp.c Fri Jun 23 20:17:12 2006 +0000 @@ -0,0 +1,175 @@ +/* + * Copyright (C) 2006 Benjamin Zores + * based on previous Real RTSP support from Roberto Togni and xine team. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <stdlib.h> +#include <stdio.h> +#include <sys/types.h> +#include <ctype.h> +#include "config.h" +#ifndef HAVE_WINSOCK2 +#include <netinet/in.h> +#include <sys/socket.h> +#include <arpa/inet.h> +#define closesocket close +#else +#include <winsock2.h> +#include <ws2tcpip.h> +#endif +#include <errno.h> + +#include "stream.h" +#include "realrtsp/rtsp.h" +#include "realrtsp/rtsp_session.h" + +#define RTSP_DEFAULT_PORT 554 + +extern int network_bandwidth; + +static int +rtsp_streaming_read (int fd, char *buffer, + int size, streaming_ctrl_t *stream_ctrl) +{ + return rtsp_session_read (stream_ctrl->data, buffer, size); +} + +static int +rtsp_streaming_start (stream_t *stream) +{ + int fd; + rtsp_session_t *rtsp; + char *mrl; + char *file; + int port; + int redirected, temp; + + if (!stream) + return -1; + + /* counter so we don't get caught in infinite redirections */ + temp = 5; + + do { + redirected = 0; + + fd = connect2Server (stream->streaming_ctrl->url->hostname, + port = (stream->streaming_ctrl->url->port ? + stream->streaming_ctrl->url->port : + RTSP_DEFAULT_PORT), 1); + + if (fd < 0 && !stream->streaming_ctrl->url->port) + fd = connect2Server (stream->streaming_ctrl->url->hostname, + port = 7070, 1); + + if (fd < 0) + return -1; + + file = stream->streaming_ctrl->url->file; + if (file[0] == '/') + file++; + + mrl = malloc (strlen (stream->streaming_ctrl->url->hostname) + + strlen (file) + 16); + + sprintf (mrl, "rtsp://%s:%i/%s", + stream->streaming_ctrl->url->hostname, port, file); + + rtsp = rtsp_session_start (fd, &mrl, file, + stream->streaming_ctrl->url->hostname, + port, &redirected, + stream->streaming_ctrl->bandwidth); + + if (redirected == 1) + { + url_free (stream->streaming_ctrl->url); + stream->streaming_ctrl->url = url_new (mrl); + closesocket (fd); + } + + free (mrl); + temp--; + } while ((redirected != 0) && (temp > 0)); + + if (!rtsp) + return -1; + + stream->fd = fd; + stream->streaming_ctrl->data = rtsp; + + stream->streaming_ctrl->streaming_read = rtsp_streaming_read; + stream->streaming_ctrl->streaming_seek = NULL; + stream->streaming_ctrl->prebuffer_size = 128*1024; // 640 KBytes + stream->streaming_ctrl->buffering = 1; + stream->streaming_ctrl->status = streaming_playing_e; + + return 0; +} + +static void +rtsp_streaming_close (struct stream_st *s) +{ + rtsp_session_t *rtsp = NULL; + + rtsp = (rtsp_session_t *) s->streaming_ctrl->data; + if (rtsp) + rtsp_session_end (rtsp); +} + +static int +rtsp_streaming_open (stream_t *stream, int mode, void *opts, int *file_format) +{ + URL_t *url; + extern int index_mode; + + mp_msg (MSGT_OPEN, MSGL_INFO, "STREAM_RTSP, URL: %s\n", stream->url); + stream->streaming_ctrl = streaming_ctrl_new (); + if (!stream->streaming_ctrl) + return STREAM_ERROR; + + stream->streaming_ctrl->bandwidth = network_bandwidth; + url = url_new (stream->url); + stream->streaming_ctrl->url = check4proxies (url); + + stream->fd = -1; + if (rtsp_streaming_start (stream) < 0) + { + streaming_ctrl_free (stream->streaming_ctrl); + stream->streaming_ctrl = NULL; + return STREAM_UNSUPORTED; + } + + fixup_network_stream_cache (stream); + stream->type = STREAMTYPE_STREAM; + stream->close = rtsp_streaming_close; + + return STREAM_OK; +} + +stream_info_t stream_info_rtsp = { + "RTSP streaming", + "rtsp", + "Benjamin Zores, Roberto Togni", + "ported from xine", + rtsp_streaming_open, + {"rtsp", NULL}, + NULL, + 0 /* Urls are an option string */ +};