annotate stream/librtsp/rtsp_session.c @ 26628:80db5294fe36

Use a regular expression to filter out all external library parts from FFmpeg. In the rare cases we use some of those external libraries, add them explicitly instead of removing them if the library is disabled.
author diego
date Sat, 03 May 2008 15:40:12 +0000 (2008-05-03)
parents 4401909aac98
children a3f6dc43b585
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
1 /*
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
2 * This file was ported to MPlayer from xine CVS rtsp_session.c,v 1.9 2003/02/11 16:20:40
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
3 */
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
4
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
5 /*
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
6 * Copyright (C) 2000-2002 the xine project
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
7 *
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
8 * This file is part of xine, a free video player.
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
9 *
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
10 * xine is free software; you can redistribute it and/or modify
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
11 * it under the terms of the GNU General Public License as published by
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
12 * the Free Software Foundation; either version 2 of the License, or
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
13 * (at your option) any later version.
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
14 *
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
15 * xine is distributed in the hope that it will be useful,
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
18 * GNU General Public License for more details.
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
19 *
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
20 * You should have received a copy of the GNU General Public License
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
21 * along with this program; if not, write to the Free Software
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
22 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
23 *
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
24 *
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
25 * high level interface to rtsp servers.
18829
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
26 *
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
27 * 2006, Benjamin Zores and Vincent Mussard
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
28 * Support for MPEG-TS streaming through RFC compliant RTSP servers
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
29 */
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
30
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
31 #include <sys/types.h>
10281
54bcbf28698a Networking support under MinGW.
diego
parents: 10199
diff changeset
32 #include "config.h"
54bcbf28698a Networking support under MinGW.
diego
parents: 10199
diff changeset
33 #ifndef HAVE_WINSOCK2
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
34 #include <sys/socket.h>
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
35 #include <netinet/in.h>
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
36 #include <netdb.h>
10281
54bcbf28698a Networking support under MinGW.
diego
parents: 10199
diff changeset
37 #else
54bcbf28698a Networking support under MinGW.
diego
parents: 10199
diff changeset
38 #include <winsock2.h>
54bcbf28698a Networking support under MinGW.
diego
parents: 10199
diff changeset
39 #endif
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
40 #include <unistd.h>
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
41 #include <stdio.h>
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
42 #include <fcntl.h>
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
43 #include <stdlib.h>
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
44 #include <string.h>
17351
2518f4341587 OS X compilation fix: Include inttypes.h so that uint32_t is not undefined.
diego
parents: 17332
diff changeset
45 #include <inttypes.h>
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
46
18793
be9e036d38ad some printf() to mp_msg() replacements
ben
parents: 18792
diff changeset
47 #include "mp_msg.h"
19316
81b239327a3e fix compilation of librtsp
ben
parents: 19271
diff changeset
48 #include "../url.h"
18829
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
49 #include "../rtp.h"
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
50 #include "rtsp.h"
18829
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
51 #include "rtsp_rtp.h"
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
52 #include "rtsp_session.h"
18799
e16345b97dab moved generic rtsp related files from realrtsp to librtsp
ben
parents: 18798
diff changeset
53 #include "../realrtsp/real.h"
e16345b97dab moved generic rtsp related files from realrtsp to librtsp
ben
parents: 18798
diff changeset
54 #include "../realrtsp/rmff.h"
e16345b97dab moved generic rtsp related files from realrtsp to librtsp
ben
parents: 18798
diff changeset
55 #include "../realrtsp/asmrp.h"
e16345b97dab moved generic rtsp related files from realrtsp to librtsp
ben
parents: 18798
diff changeset
56 #include "../realrtsp/xbuffer.h"
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
57
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
58 /*
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
59 #define LOG
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
60 */
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
61
18829
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
62 #define RTSP_OPTIONS_PUBLIC "Public"
18822
a48dead7424a cosmetic changes to avoid constants redefinition
ben
parents: 18799
diff changeset
63 #define RTSP_OPTIONS_SERVER "Server"
a48dead7424a cosmetic changes to avoid constants redefinition
ben
parents: 18799
diff changeset
64 #define RTSP_OPTIONS_LOCATION "Location"
a48dead7424a cosmetic changes to avoid constants redefinition
ben
parents: 18799
diff changeset
65 #define RTSP_OPTIONS_REAL "RealChallenge1"
a48dead7424a cosmetic changes to avoid constants redefinition
ben
parents: 18799
diff changeset
66 #define RTSP_SERVER_TYPE_REAL "Real"
a48dead7424a cosmetic changes to avoid constants redefinition
ben
parents: 18799
diff changeset
67 #define RTSP_SERVER_TYPE_HELIX "Helix"
a48dead7424a cosmetic changes to avoid constants redefinition
ben
parents: 18799
diff changeset
68 #define RTSP_SERVER_TYPE_UNKNOWN "unknown"
a48dead7424a cosmetic changes to avoid constants redefinition
ben
parents: 18799
diff changeset
69
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
70 struct rtsp_session_s {
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
71 rtsp_t *s;
18792
6a015ba5bf45 move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents: 17351
diff changeset
72 struct real_rtsp_session_t* real_session;
18829
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
73 struct rtp_rtsp_session_t* rtp_session;
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
74 };
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
75
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
76 //rtsp_session_t *rtsp_session_start(char *mrl) {
20527
b8f069b793c2 Realrtsp authentication
rtogni
parents: 19595
diff changeset
77 rtsp_session_t *rtsp_session_start(int fd, char **mrl, char *path, char *host,
b8f069b793c2 Realrtsp authentication
rtogni
parents: 19595
diff changeset
78 int port, int *redir, uint32_t bandwidth, char *user, char *pass) {
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
79
18792
6a015ba5bf45 move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents: 17351
diff changeset
80 rtsp_session_t *rtsp_session = NULL;
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
81 char *server;
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
82 char *mrl_line = NULL;
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
83 rmff_header_t *h;
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
84
18792
6a015ba5bf45 move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents: 17351
diff changeset
85 rtsp_session = malloc (sizeof (rtsp_session_t));
6a015ba5bf45 move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents: 17351
diff changeset
86 rtsp_session->s = NULL;
6a015ba5bf45 move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents: 17351
diff changeset
87 rtsp_session->real_session = NULL;
18829
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
88 rtsp_session->rtp_session = NULL;
18792
6a015ba5bf45 move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents: 17351
diff changeset
89
10199
0c72c1d0d6a4 Fix redirection in real rtsp connections.
rtognimp
parents: 10198
diff changeset
90 //connect:
0c72c1d0d6a4 Fix redirection in real rtsp connections.
rtognimp
parents: 10198
diff changeset
91 *redir = 0;
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
92
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
93 /* connect to server */
10199
0c72c1d0d6a4 Fix redirection in real rtsp connections.
rtognimp
parents: 10198
diff changeset
94 rtsp_session->s=rtsp_connect(fd,*mrl,path,host,port,NULL);
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
95 if (!rtsp_session->s)
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
96 {
18793
be9e036d38ad some printf() to mp_msg() replacements
ben
parents: 18792
diff changeset
97 mp_msg (MSGT_OPEN, MSGL_ERR,"rtsp_session: failed to connect to server %s\n", path);
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
98 free(rtsp_session);
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
99 return NULL;
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
100 }
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
101
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
102 /* looking for server type */
18822
a48dead7424a cosmetic changes to avoid constants redefinition
ben
parents: 18799
diff changeset
103 if (rtsp_search_answers(rtsp_session->s,RTSP_OPTIONS_SERVER))
a48dead7424a cosmetic changes to avoid constants redefinition
ben
parents: 18799
diff changeset
104 server=strdup(rtsp_search_answers(rtsp_session->s,RTSP_OPTIONS_SERVER));
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
105 else {
18822
a48dead7424a cosmetic changes to avoid constants redefinition
ben
parents: 18799
diff changeset
106 if (rtsp_search_answers(rtsp_session->s,RTSP_OPTIONS_REAL))
a48dead7424a cosmetic changes to avoid constants redefinition
ben
parents: 18799
diff changeset
107 server=strdup(RTSP_SERVER_TYPE_REAL);
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
108 else
18822
a48dead7424a cosmetic changes to avoid constants redefinition
ben
parents: 18799
diff changeset
109 server=strdup(RTSP_SERVER_TYPE_UNKNOWN);
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
110 }
18822
a48dead7424a cosmetic changes to avoid constants redefinition
ben
parents: 18799
diff changeset
111 if (strstr(server,RTSP_SERVER_TYPE_REAL) || strstr(server,RTSP_SERVER_TYPE_HELIX))
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
112 {
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
113 /* we are talking to a real server ... */
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
114
20527
b8f069b793c2 Realrtsp authentication
rtogni
parents: 19595
diff changeset
115 h=real_setup_and_get_header(rtsp_session->s, bandwidth, user, pass);
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
116 if (!h) {
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
117 /* got an redirect? */
18822
a48dead7424a cosmetic changes to avoid constants redefinition
ben
parents: 18799
diff changeset
118 if (rtsp_search_answers(rtsp_session->s, RTSP_OPTIONS_LOCATION))
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
119 {
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
120 free(mrl_line);
18822
a48dead7424a cosmetic changes to avoid constants redefinition
ben
parents: 18799
diff changeset
121 mrl_line=strdup(rtsp_search_answers(rtsp_session->s, RTSP_OPTIONS_LOCATION));
18793
be9e036d38ad some printf() to mp_msg() replacements
ben
parents: 18792
diff changeset
122 mp_msg (MSGT_OPEN, MSGL_INFO,"rtsp_session: redirected to %s\n", mrl_line);
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
123 rtsp_close(rtsp_session->s);
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
124 free(server);
10199
0c72c1d0d6a4 Fix redirection in real rtsp connections.
rtognimp
parents: 10198
diff changeset
125 free(*mrl);
0c72c1d0d6a4 Fix redirection in real rtsp connections.
rtognimp
parents: 10198
diff changeset
126 free(rtsp_session);
0c72c1d0d6a4 Fix redirection in real rtsp connections.
rtognimp
parents: 10198
diff changeset
127 /* tell the caller to redirect, return url to redirect to in mrl */
0c72c1d0d6a4 Fix redirection in real rtsp connections.
rtognimp
parents: 10198
diff changeset
128 *mrl = mrl_line;
0c72c1d0d6a4 Fix redirection in real rtsp connections.
rtognimp
parents: 10198
diff changeset
129 *redir = 1;
0c72c1d0d6a4 Fix redirection in real rtsp connections.
rtognimp
parents: 10198
diff changeset
130 return NULL;
0c72c1d0d6a4 Fix redirection in real rtsp connections.
rtognimp
parents: 10198
diff changeset
131 // goto connect; /* *shudder* i made a design mistake somewhere */
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
132 } else
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
133 {
18793
be9e036d38ad some printf() to mp_msg() replacements
ben
parents: 18792
diff changeset
134 mp_msg (MSGT_OPEN, MSGL_ERR,"rtsp_session: session can not be established.\n");
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
135 rtsp_close(rtsp_session->s);
18792
6a015ba5bf45 move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents: 17351
diff changeset
136 free (server);
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
137 free(rtsp_session);
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
138 return NULL;
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
139 }
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
140 }
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
141
18792
6a015ba5bf45 move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents: 17351
diff changeset
142 rtsp_session->real_session = init_real_rtsp_session ();
22703
7526ff6035c1 Support application/smil as mimetype for smil-over-realrtsp
rtogni
parents: 22242
diff changeset
143 if(!strncmp(h->streams[0]->mime_type, "application/vnd.rn-rmadriver", h->streams[0]->mime_type_size) ||
7526ff6035c1 Support application/smil as mimetype for smil-over-realrtsp
rtogni
parents: 22242
diff changeset
144 !strncmp(h->streams[0]->mime_type, "application/smil", h->streams[0]->mime_type_size)) {
22242
4cabf7499fef Add support for smil playlist served over realrtsp
rtogni
parents: 21842
diff changeset
145 rtsp_session->real_session->header_len = 0;
4cabf7499fef Add support for smil playlist served over realrtsp
rtogni
parents: 21842
diff changeset
146 rtsp_session->real_session->recv_size = 0;
4cabf7499fef Add support for smil playlist served over realrtsp
rtogni
parents: 21842
diff changeset
147 rtsp_session->real_session->rdt_rawdata = 1;
4cabf7499fef Add support for smil playlist served over realrtsp
rtogni
parents: 21842
diff changeset
148 mp_msg(MSGT_OPEN, MSGL_V, "smil-over-realrtsp playlist, switching to raw rdt mode\n");
4cabf7499fef Add support for smil playlist served over realrtsp
rtogni
parents: 21842
diff changeset
149 } else {
18792
6a015ba5bf45 move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents: 17351
diff changeset
150 rtsp_session->real_session->header_len =
22803
4401909aac98 Check buffer size in header dump functions
rtogni
parents: 22703
diff changeset
151 rmff_dump_header (h, (char *) rtsp_session->real_session->header, HEADER_SIZE);
4401909aac98 Check buffer size in header dump functions
rtogni
parents: 22703
diff changeset
152
4401909aac98 Check buffer size in header dump functions
rtogni
parents: 22703
diff changeset
153 if (rtsp_session->real_session->header_len < 0) {
4401909aac98 Check buffer size in header dump functions
rtogni
parents: 22703
diff changeset
154 mp_msg (MSGT_OPEN, MSGL_ERR,"rtsp_session: error while dumping RMFF headers, session can not be established.\n");
4401909aac98 Check buffer size in header dump functions
rtogni
parents: 22703
diff changeset
155 free_real_rtsp_session(rtsp_session->real_session);
4401909aac98 Check buffer size in header dump functions
rtogni
parents: 22703
diff changeset
156 rtsp_close(rtsp_session->s);
4401909aac98 Check buffer size in header dump functions
rtogni
parents: 22703
diff changeset
157 free (server);
4401909aac98 Check buffer size in header dump functions
rtogni
parents: 22703
diff changeset
158 free (mrl_line);
4401909aac98 Check buffer size in header dump functions
rtogni
parents: 22703
diff changeset
159 free(rtsp_session);
4401909aac98 Check buffer size in header dump functions
rtogni
parents: 22703
diff changeset
160 return NULL;
4401909aac98 Check buffer size in header dump functions
rtogni
parents: 22703
diff changeset
161 }
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
162
18792
6a015ba5bf45 move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents: 17351
diff changeset
163 rtsp_session->real_session->recv =
6a015ba5bf45 move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents: 17351
diff changeset
164 xbuffer_copyin (rtsp_session->real_session->recv, 0,
6a015ba5bf45 move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents: 17351
diff changeset
165 rtsp_session->real_session->header,
6a015ba5bf45 move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents: 17351
diff changeset
166 rtsp_session->real_session->header_len);
6a015ba5bf45 move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents: 17351
diff changeset
167
6a015ba5bf45 move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents: 17351
diff changeset
168 rtsp_session->real_session->recv_size =
6a015ba5bf45 move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents: 17351
diff changeset
169 rtsp_session->real_session->header_len;
22242
4cabf7499fef Add support for smil playlist served over realrtsp
rtogni
parents: 21842
diff changeset
170 }
18792
6a015ba5bf45 move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents: 17351
diff changeset
171 rtsp_session->real_session->recv_read = 0;
18829
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
172 } else /* not a Real server : try RTP instead */
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
173 {
18829
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
174 char *public = NULL;
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
175
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
176 /* look for the Public: field in response to RTSP OPTIONS */
19595
c19e6c7487b1 Avoid a potential strdup(NULL)
rtogni
parents: 19316
diff changeset
177 if (!(public = rtsp_search_answers (rtsp_session->s, RTSP_OPTIONS_PUBLIC)))
18829
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
178 {
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
179 rtsp_close (rtsp_session->s);
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
180 free (server);
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
181 free (mrl_line);
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
182 free (rtsp_session);
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
183 return NULL;
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
184 }
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
185
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
186 /* check for minimalistic RTSP RFC compliance */
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
187 if (!strstr (public, RTSP_METHOD_DESCRIBE)
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
188 || !strstr (public, RTSP_METHOD_SETUP)
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
189 || !strstr (public, RTSP_METHOD_PLAY)
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
190 || !strstr (public, RTSP_METHOD_TEARDOWN))
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
191 {
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
192 mp_msg (MSGT_OPEN, MSGL_ERR,
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
193 "Remote server does not meet minimal RTSP 1.0 compliance.\n");
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
194 rtsp_close (rtsp_session->s);
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
195 free (server);
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
196 free (mrl_line);
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
197 free (rtsp_session);
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
198 return NULL;
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
199 }
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
200
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
201 rtsp_session->rtp_session = rtp_setup_and_play (rtsp_session->s);
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
202
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
203 /* neither a Real or an RTP server */
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
204 if (!rtsp_session->rtp_session)
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
205 {
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
206 mp_msg (MSGT_OPEN, MSGL_ERR, "rtsp_session: unsupported RTSP server. ");
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
207 mp_msg (MSGT_OPEN, MSGL_ERR, "Server type is '%s'.\n", server);
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
208 rtsp_close (rtsp_session->s);
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
209 free (server);
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
210 free (mrl_line);
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
211 free (rtsp_session);
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
212 return NULL;
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
213 }
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
214 }
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
215 free(server);
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
216
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
217 return rtsp_session;
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
218 }
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
219
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
220 int rtsp_session_read (rtsp_session_t *this, char *data, int len) {
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
221
18792
6a015ba5bf45 move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents: 17351
diff changeset
222 if (this->real_session) {
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
223 int to_copy=len;
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
224 char *dest=data;
18792
6a015ba5bf45 move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents: 17351
diff changeset
225 char *source =
6a015ba5bf45 move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents: 17351
diff changeset
226 (char *) (this->real_session->recv + this->real_session->recv_read);
6a015ba5bf45 move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents: 17351
diff changeset
227 int fill = this->real_session->recv_size - this->real_session->recv_read;
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
228
21842
f0040ff1ba40 Don't drop last rdt packet on eof
rtogni
parents: 21836
diff changeset
229 if(this->real_session->rdteof)
f0040ff1ba40 Don't drop last rdt packet on eof
rtogni
parents: 21836
diff changeset
230 return -1;
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
231 if (len < 0) return 0;
21836
7c5e893dff54 Make sure we do not crash when eof is reset, e.g. due to an attempt to seek.
reimar
parents: 20527
diff changeset
232 if (this->real_session->recv_size < 0) return -1;
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
233 while (to_copy > fill) {
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
234
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
235 memcpy(dest, source, fill);
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
236 to_copy -= fill;
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
237 dest += fill;
18792
6a015ba5bf45 move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents: 17351
diff changeset
238 this->real_session->recv_read = 0;
6a015ba5bf45 move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents: 17351
diff changeset
239 this->real_session->recv_size =
22242
4cabf7499fef Add support for smil playlist served over realrtsp
rtogni
parents: 21842
diff changeset
240 real_get_rdt_chunk (this->s, (char **)&(this->real_session->recv), this->real_session->rdt_rawdata);
21842
f0040ff1ba40 Don't drop last rdt packet on eof
rtogni
parents: 21836
diff changeset
241 if (this->real_session->recv_size < 0) {
f0040ff1ba40 Don't drop last rdt packet on eof
rtogni
parents: 21836
diff changeset
242 this->real_session->rdteof = 1;
f0040ff1ba40 Don't drop last rdt packet on eof
rtogni
parents: 21836
diff changeset
243 this->real_session->recv_size = 0;
f0040ff1ba40 Don't drop last rdt packet on eof
rtogni
parents: 21836
diff changeset
244 }
18792
6a015ba5bf45 move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents: 17351
diff changeset
245 source = (char *) this->real_session->recv;
6a015ba5bf45 move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents: 17351
diff changeset
246 fill = this->real_session->recv_size;
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
247
18792
6a015ba5bf45 move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents: 17351
diff changeset
248 if (this->real_session->recv_size == 0) {
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
249 #ifdef LOG
18793
be9e036d38ad some printf() to mp_msg() replacements
ben
parents: 18792
diff changeset
250 mp_msg (MSGT_OPEN, MSGL_INFO, "librtsp: %d of %d bytes provided\n", len-to_copy, len);
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
251 #endif
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
252 return len-to_copy;
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
253 }
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
254 }
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
255
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
256 memcpy(dest, source, to_copy);
18792
6a015ba5bf45 move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents: 17351
diff changeset
257 this->real_session->recv_read += to_copy;
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
258
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
259 #ifdef LOG
18793
be9e036d38ad some printf() to mp_msg() replacements
ben
parents: 18792
diff changeset
260 mp_msg (MSGT_OPEN, MSGL_INFO, "librtsp: %d bytes provided\n", len);
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
261 #endif
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
262
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
263 return len;
18792
6a015ba5bf45 move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents: 17351
diff changeset
264 }
18829
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
265 else if (this->rtp_session)
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
266 {
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
267 int l = 0;
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
268
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
269 l = read_rtp_from_server (this->rtp_session->rtp_socket, data, len);
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
270 /* send RTSP and RTCP keepalive */
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
271 rtcp_send_rr (this->s, this->rtp_session);
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
272
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
273 if (l == 0)
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
274 rtsp_session_end (this);
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
275
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
276 return l;
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
277 }
18792
6a015ba5bf45 move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents: 17351
diff changeset
278
6a015ba5bf45 move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents: 17351
diff changeset
279 return 0;
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
280 }
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
281
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
282 void rtsp_session_end(rtsp_session_t *session) {
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
283
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
284 rtsp_close(session->s);
18792
6a015ba5bf45 move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents: 17351
diff changeset
285 if (session->real_session)
6a015ba5bf45 move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents: 17351
diff changeset
286 free_real_rtsp_session (session->real_session);
18829
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
287 if (session->rtp_session)
317e0fd394c5 added new native rtsp demuxer code for mpeg-ts over rtp (now both real and non-real servers should be handled)
ben
parents: 18822
diff changeset
288 rtp_session_free (session->rtp_session);
9922
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
289 free(session);
6cb7a295ab0e Real rstp:// streaming support, ported from xine
rtognimp
parents:
diff changeset
290 }