summaryrefslogtreecommitdiffstats
path: root/libmpdemux/realrtsp/rtsp_session.c
diff options
context:
space:
mode:
authorrtognimp <rtognimp@b3059339-0415-0410-9bf9-f77b7e298cf2>2003-04-17 20:39:41 +0000
committerrtognimp <rtognimp@b3059339-0415-0410-9bf9-f77b7e298cf2>2003-04-17 20:39:41 +0000
commit2e8e95d779d064dd9830a558419105170cd373a4 (patch)
tree3156d962dcc96cf95a3c493b26a172e9c9807cd6 /libmpdemux/realrtsp/rtsp_session.c
parentf09836cc0e3b39d7944e0d29526d07a81182a348 (diff)
downloadmpv-2e8e95d779d064dd9830a558419105170cd373a4.tar.bz2
mpv-2e8e95d779d064dd9830a558419105170cd373a4.tar.xz
Real rstp:// streaming support, ported from xine
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@9923 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpdemux/realrtsp/rtsp_session.c')
-rw-r--r--libmpdemux/realrtsp/rtsp_session.c190
1 files changed, 190 insertions, 0 deletions
diff --git a/libmpdemux/realrtsp/rtsp_session.c b/libmpdemux/realrtsp/rtsp_session.c
new file mode 100644
index 0000000000..2574dd9f60
--- /dev/null
+++ b/libmpdemux/realrtsp/rtsp_session.c
@@ -0,0 +1,190 @@
+/*
+ * This file was ported to MPlayer from xine CVS rtsp_session.c,v 1.9 2003/02/11 16:20:40
+ */
+
+/*
+ * Copyright (C) 2000-2002 the xine project
+ *
+ * This file is part of xine, a free video player.
+ *
+ * xine 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.
+ *
+ * xine 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ *
+ *
+ * high level interface to rtsp servers.
+ */
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netdb.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "rtsp.h"
+#include "rtsp_session.h"
+#include "real.h"
+#include "rmff.h"
+#include "asmrp.h"
+
+/*
+#define LOG
+*/
+
+#define BUF_SIZE 4096
+#define HEADER_SIZE 4096
+
+struct rtsp_session_s {
+
+ rtsp_t *s;
+
+ /* receive buffer */
+ uint8_t recv[BUF_SIZE];
+ int recv_size;
+ int recv_read;
+
+ /* header buffer */
+ uint8_t header[HEADER_SIZE];
+ int header_len;
+ int header_read;
+
+};
+
+//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=malloc(sizeof(rtsp_session_t));
+ char *server;
+ char *mrl_line = NULL;
+ rmff_header_t *h;
+ uint32_t bandwidth=10485800;
+
+connect:
+
+ /* connect to server */
+ 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);
+ free(rtsp_session);
+ return NULL;
+ }
+
+ /* looking for server type */
+ if (rtsp_search_answers(rtsp_session->s,"Server"))
+ server=strdup(rtsp_search_answers(rtsp_session->s,"Server"));
+ else {
+ if (rtsp_search_answers(rtsp_session->s,"RealChallenge1"))
+ server=strdup("Real");
+ else
+ server=strdup("unknown");
+ }
+ if (strstr(server,"Real"))
+ {
+ /* we are talking to a real server ... */
+
+ h=real_setup_and_get_header(rtsp_session->s, bandwidth);
+ if (!h) {
+ /* got an redirect? */
+ if (rtsp_search_answers(rtsp_session->s, "Location"))
+ {
+ free(mrl_line);
+ mrl_line=strdup(rtsp_search_answers(rtsp_session->s, "Location"));
+ 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 */
+ } else
+ {
+ printf("rtsp_session: session can not be established.\n");
+ rtsp_close(rtsp_session->s);
+ free(rtsp_session);
+ return NULL;
+ }
+ }
+
+ rtsp_session->header_len=rmff_dump_header(h,rtsp_session->header,1024);
+
+ memcpy(rtsp_session->recv, rtsp_session->header, rtsp_session->header_len);
+ rtsp_session->recv_size = rtsp_session->header_len;
+ rtsp_session->recv_read = 0;
+
+ } else
+ {
+ printf("rtsp_session: rtsp server type is '%s' instead of Real. Please report.\n",server);
+ rtsp_close(rtsp_session->s);
+ free(server);
+ free(rtsp_session);
+ return NULL;
+ }
+ free(server);
+
+ return rtsp_session;
+}
+
+int rtsp_session_read (rtsp_session_t *this, char *data, int len) {
+
+ int to_copy=len;
+ char *dest=data;
+ char *source=this->recv + this->recv_read;
+ int fill=this->recv_size - this->recv_read;
+
+ if (len < 0) return 0;
+ while (to_copy > fill) {
+
+ memcpy(dest, source, fill);
+ to_copy -= fill;
+ dest += fill;
+ this->recv_read = 0;
+ source = this->recv;
+ this->recv_size = real_get_rdt_chunk (this->s, source);
+ fill = this->recv_size;
+
+ if (this->recv_size == 0) {
+#ifdef LOG
+ printf ("librtsp: %d of %d bytes provided\n", len-to_copy, len);
+#endif
+ return len-to_copy;
+ }
+ }
+
+ memcpy(dest, source, to_copy);
+ this->recv_read += to_copy;
+
+#ifdef LOG
+ printf ("librtsp: %d bytes provided\n", len);
+#endif
+
+ return len;
+}
+
+int rtsp_session_peek_header(rtsp_session_t *this, char *buf, int maxsize) {
+
+ int len;
+
+ len = (this->header_len < maxsize) ? this->header_len : maxsize;
+
+ memcpy(buf, this->header, len);
+ return len;
+}
+
+void rtsp_session_end(rtsp_session_t *session) {
+
+ rtsp_close(session->s);
+ free(session);
+}