Mercurial > mplayer.hg
annotate stream/librtsp/rtsp_session.c @ 31366:0bf908d29807
SIGPIPE is not really a crash, try to exit cleanly in case we receive one.
Particularly in the network code it would be better to ignore it, but
some window managers use it to indicate a close request.
author | reimar |
---|---|
date | Wed, 16 Jun 2010 17:33:17 +0000 |
parents | 629b30951662 |
children | 8fa2f43cb760 |
rev | line source |
---|---|
9922 | 1 /* |
2 * This file was ported to MPlayer from xine CVS rtsp_session.c,v 1.9 2003/02/11 16:20:40 | |
3 */ | |
4 | |
5 /* | |
6 * Copyright (C) 2000-2002 the xine project | |
7 * | |
8 * This file is part of xine, a free video player. | |
9 * | |
10 * xine is free software; you can redistribute it and/or modify | |
11 * it under the terms of the GNU General Public License as published by | |
12 * the Free Software Foundation; either version 2 of the License, or | |
13 * (at your option) any later version. | |
14 * | |
15 * xine is distributed in the hope that it will be useful, | |
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
18 * GNU General Public License for more details. | |
19 * | |
20 * You should have received a copy of the GNU General Public License | |
21 * along with this program; if not, write to the Free Software | |
22 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA | |
23 * | |
24 * | |
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 | 29 */ |
30 | |
31 #include <sys/types.h> | |
27472
c0b233cd30ca
Revert moving closesocket definition and network headers to network.h.
diego
parents:
27464
diff
changeset
|
32 #include "config.h" |
28402 | 33 #if !HAVE_WINSOCK2_H |
27472
c0b233cd30ca
Revert moving closesocket definition and network headers to network.h.
diego
parents:
27464
diff
changeset
|
34 #include <sys/socket.h> |
c0b233cd30ca
Revert moving closesocket definition and network headers to network.h.
diego
parents:
27464
diff
changeset
|
35 #include <netinet/in.h> |
c0b233cd30ca
Revert moving closesocket definition and network headers to network.h.
diego
parents:
27464
diff
changeset
|
36 #include <netdb.h> |
c0b233cd30ca
Revert moving closesocket definition and network headers to network.h.
diego
parents:
27464
diff
changeset
|
37 #else |
c0b233cd30ca
Revert moving closesocket definition and network headers to network.h.
diego
parents:
27464
diff
changeset
|
38 #include <winsock2.h> |
c0b233cd30ca
Revert moving closesocket definition and network headers to network.h.
diego
parents:
27464
diff
changeset
|
39 #endif |
c0b233cd30ca
Revert moving closesocket definition and network headers to network.h.
diego
parents:
27464
diff
changeset
|
40 |
c0b233cd30ca
Revert moving closesocket definition and network headers to network.h.
diego
parents:
27464
diff
changeset
|
41 |
9922 | 42 #include <unistd.h> |
43 #include <stdio.h> | |
44 #include <fcntl.h> | |
45 #include <stdlib.h> | |
46 #include <string.h> | |
17351
2518f4341587
OS X compilation fix: Include inttypes.h so that uint32_t is not undefined.
diego
parents:
17332
diff
changeset
|
47 #include <inttypes.h> |
9922 | 48 |
18793 | 49 #include "mp_msg.h" |
9922 | 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 | 52 #include "rtsp_session.h" |
27473
ae5da477539e
Move '#define closesocket close' preprocessor directive to a common place
diego
parents:
27472
diff
changeset
|
53 #include "stream/network.h" |
27463
e16088a911c1
consistency cosmetics: Avoid using .. in #include paths.
diego
parents:
27461
diff
changeset
|
54 #include "stream/url.h" |
e16088a911c1
consistency cosmetics: Avoid using .. in #include paths.
diego
parents:
27461
diff
changeset
|
55 #include "stream/rtp.h" |
e16088a911c1
consistency cosmetics: Avoid using .. in #include paths.
diego
parents:
27461
diff
changeset
|
56 #include "stream/realrtsp/real.h" |
e16088a911c1
consistency cosmetics: Avoid using .. in #include paths.
diego
parents:
27461
diff
changeset
|
57 #include "stream/realrtsp/rmff.h" |
e16088a911c1
consistency cosmetics: Avoid using .. in #include paths.
diego
parents:
27461
diff
changeset
|
58 #include "stream/realrtsp/asmrp.h" |
e16088a911c1
consistency cosmetics: Avoid using .. in #include paths.
diego
parents:
27461
diff
changeset
|
59 #include "stream/realrtsp/xbuffer.h" |
9922 | 60 |
61 /* | |
62 #define LOG | |
63 */ | |
64 | |
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
|
65 #define RTSP_OPTIONS_PUBLIC "Public" |
18822 | 66 #define RTSP_OPTIONS_SERVER "Server" |
67 #define RTSP_OPTIONS_LOCATION "Location" | |
68 #define RTSP_OPTIONS_REAL "RealChallenge1" | |
69 #define RTSP_SERVER_TYPE_REAL "Real" | |
70 #define RTSP_SERVER_TYPE_HELIX "Helix" | |
71 #define RTSP_SERVER_TYPE_UNKNOWN "unknown" | |
72 | |
9922 | 73 struct rtsp_session_s { |
74 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
|
75 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
|
76 struct rtp_rtsp_session_t* rtp_session; |
9922 | 77 }; |
78 | |
27103
a3f6dc43b585
Move rtsp_close away by simplification - avoids symbol clash with libnemesi
lu_zero
parents:
22803
diff
changeset
|
79 /* |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
80 * closes an rtsp connection |
27103
a3f6dc43b585
Move rtsp_close away by simplification - avoids symbol clash with libnemesi
lu_zero
parents:
22803
diff
changeset
|
81 */ |
a3f6dc43b585
Move rtsp_close away by simplification - avoids symbol clash with libnemesi
lu_zero
parents:
22803
diff
changeset
|
82 |
a3f6dc43b585
Move rtsp_close away by simplification - avoids symbol clash with libnemesi
lu_zero
parents:
22803
diff
changeset
|
83 static void rtsp_close(rtsp_t *s) { |
a3f6dc43b585
Move rtsp_close away by simplification - avoids symbol clash with libnemesi
lu_zero
parents:
22803
diff
changeset
|
84 |
a3f6dc43b585
Move rtsp_close away by simplification - avoids symbol clash with libnemesi
lu_zero
parents:
22803
diff
changeset
|
85 if (s->server_state) |
a3f6dc43b585
Move rtsp_close away by simplification - avoids symbol clash with libnemesi
lu_zero
parents:
22803
diff
changeset
|
86 { |
a3f6dc43b585
Move rtsp_close away by simplification - avoids symbol clash with libnemesi
lu_zero
parents:
22803
diff
changeset
|
87 if (s->server_state == RTSP_PLAYING) |
a3f6dc43b585
Move rtsp_close away by simplification - avoids symbol clash with libnemesi
lu_zero
parents:
22803
diff
changeset
|
88 rtsp_request_teardown (s, NULL); |
a3f6dc43b585
Move rtsp_close away by simplification - avoids symbol clash with libnemesi
lu_zero
parents:
22803
diff
changeset
|
89 closesocket (s->s); |
a3f6dc43b585
Move rtsp_close away by simplification - avoids symbol clash with libnemesi
lu_zero
parents:
22803
diff
changeset
|
90 } |
a3f6dc43b585
Move rtsp_close away by simplification - avoids symbol clash with libnemesi
lu_zero
parents:
22803
diff
changeset
|
91 |
a3f6dc43b585
Move rtsp_close away by simplification - avoids symbol clash with libnemesi
lu_zero
parents:
22803
diff
changeset
|
92 if (s->path) free(s->path); |
a3f6dc43b585
Move rtsp_close away by simplification - avoids symbol clash with libnemesi
lu_zero
parents:
22803
diff
changeset
|
93 if (s->host) free(s->host); |
a3f6dc43b585
Move rtsp_close away by simplification - avoids symbol clash with libnemesi
lu_zero
parents:
22803
diff
changeset
|
94 if (s->mrl) free(s->mrl); |
a3f6dc43b585
Move rtsp_close away by simplification - avoids symbol clash with libnemesi
lu_zero
parents:
22803
diff
changeset
|
95 if (s->session) free(s->session); |
a3f6dc43b585
Move rtsp_close away by simplification - avoids symbol clash with libnemesi
lu_zero
parents:
22803
diff
changeset
|
96 if (s->user_agent) free(s->user_agent); |
29583 | 97 free(s->server); |
27103
a3f6dc43b585
Move rtsp_close away by simplification - avoids symbol clash with libnemesi
lu_zero
parents:
22803
diff
changeset
|
98 rtsp_free_answers(s); |
a3f6dc43b585
Move rtsp_close away by simplification - avoids symbol clash with libnemesi
lu_zero
parents:
22803
diff
changeset
|
99 rtsp_unschedule_all(s); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
100 free(s); |
27103
a3f6dc43b585
Move rtsp_close away by simplification - avoids symbol clash with libnemesi
lu_zero
parents:
22803
diff
changeset
|
101 } |
a3f6dc43b585
Move rtsp_close away by simplification - avoids symbol clash with libnemesi
lu_zero
parents:
22803
diff
changeset
|
102 |
9922 | 103 //rtsp_session_t *rtsp_session_start(char *mrl) { |
20527 | 104 rtsp_session_t *rtsp_session_start(int fd, char **mrl, char *path, char *host, |
105 int port, int *redir, uint32_t bandwidth, char *user, char *pass) { | |
9922 | 106 |
18792
6a015ba5bf45
move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents:
17351
diff
changeset
|
107 rtsp_session_t *rtsp_session = NULL; |
9922 | 108 char *server; |
109 char *mrl_line = NULL; | |
110 | |
18792
6a015ba5bf45
move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents:
17351
diff
changeset
|
111 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
|
112 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
|
113 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
|
114 rtsp_session->rtp_session = NULL; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
115 |
10199 | 116 //connect: |
117 *redir = 0; | |
9922 | 118 |
119 /* connect to server */ | |
10199 | 120 rtsp_session->s=rtsp_connect(fd,*mrl,path,host,port,NULL); |
9922 | 121 if (!rtsp_session->s) |
122 { | |
18793 | 123 mp_msg (MSGT_OPEN, MSGL_ERR,"rtsp_session: failed to connect to server %s\n", path); |
9922 | 124 free(rtsp_session); |
125 return NULL; | |
126 } | |
127 | |
128 /* looking for server type */ | |
18822 | 129 if (rtsp_search_answers(rtsp_session->s,RTSP_OPTIONS_SERVER)) |
130 server=strdup(rtsp_search_answers(rtsp_session->s,RTSP_OPTIONS_SERVER)); | |
9922 | 131 else { |
18822 | 132 if (rtsp_search_answers(rtsp_session->s,RTSP_OPTIONS_REAL)) |
133 server=strdup(RTSP_SERVER_TYPE_REAL); | |
9922 | 134 else |
18822 | 135 server=strdup(RTSP_SERVER_TYPE_UNKNOWN); |
9922 | 136 } |
18822 | 137 if (strstr(server,RTSP_SERVER_TYPE_REAL) || strstr(server,RTSP_SERVER_TYPE_HELIX)) |
9922 | 138 { |
139 /* we are talking to a real server ... */ | |
140 | |
29580 | 141 rmff_header_t *h=real_setup_and_get_header(rtsp_session->s, bandwidth, user, pass); |
29584
dc57d7bd98e1
Fix possible crashes with invalid SDPs that result in stream descriptions
reimar
parents:
29583
diff
changeset
|
142 if (!h || !h->streams[0]) { |
dc57d7bd98e1
Fix possible crashes with invalid SDPs that result in stream descriptions
reimar
parents:
29583
diff
changeset
|
143 rmff_free_header(h); |
9922 | 144 /* got an redirect? */ |
18822 | 145 if (rtsp_search_answers(rtsp_session->s, RTSP_OPTIONS_LOCATION)) |
9922 | 146 { |
147 free(mrl_line); | |
18822 | 148 mrl_line=strdup(rtsp_search_answers(rtsp_session->s, RTSP_OPTIONS_LOCATION)); |
18793 | 149 mp_msg (MSGT_OPEN, MSGL_INFO,"rtsp_session: redirected to %s\n", mrl_line); |
9922 | 150 rtsp_close(rtsp_session->s); |
151 free(server); | |
10199 | 152 free(*mrl); |
153 free(rtsp_session); | |
154 /* tell the caller to redirect, return url to redirect to in mrl */ | |
155 *mrl = mrl_line; | |
156 *redir = 1; | |
157 return NULL; | |
158 // goto connect; /* *shudder* i made a design mistake somewhere */ | |
9922 | 159 } else |
160 { | |
18793 | 161 mp_msg (MSGT_OPEN, MSGL_ERR,"rtsp_session: session can not be established.\n"); |
9922 | 162 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
|
163 free (server); |
9922 | 164 free(rtsp_session); |
165 return NULL; | |
166 } | |
167 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
168 |
18792
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 = init_real_rtsp_session (); |
22703
7526ff6035c1
Support application/smil as mimetype for smil-over-realrtsp
rtogni
parents:
22242
diff
changeset
|
170 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
|
171 !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
|
172 rtsp_session->real_session->header_len = 0; |
4cabf7499fef
Add support for smil playlist served over realrtsp
rtogni
parents:
21842
diff
changeset
|
173 rtsp_session->real_session->recv_size = 0; |
4cabf7499fef
Add support for smil playlist served over realrtsp
rtogni
parents:
21842
diff
changeset
|
174 rtsp_session->real_session->rdt_rawdata = 1; |
4cabf7499fef
Add support for smil playlist served over realrtsp
rtogni
parents:
21842
diff
changeset
|
175 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
|
176 } 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
|
177 rtsp_session->real_session->header_len = |
30152
629b30951662
Disambiguate HEADER_SIZE definition in stream/librtsp and stream/realrtsp.
diego
parents:
29584
diff
changeset
|
178 rmff_dump_header (h, (char *) rtsp_session->real_session->header, RTSP_HEADER_SIZE); |
22803 | 179 |
180 if (rtsp_session->real_session->header_len < 0) { | |
181 mp_msg (MSGT_OPEN, MSGL_ERR,"rtsp_session: error while dumping RMFF headers, session can not be established.\n"); | |
182 free_real_rtsp_session(rtsp_session->real_session); | |
183 rtsp_close(rtsp_session->s); | |
184 free (server); | |
185 free (mrl_line); | |
186 free(rtsp_session); | |
187 return NULL; | |
188 } | |
9922 | 189 |
18792
6a015ba5bf45
move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents:
17351
diff
changeset
|
190 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
|
191 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
|
192 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
|
193 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
|
194 |
6a015ba5bf45
move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents:
17351
diff
changeset
|
195 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
|
196 rtsp_session->real_session->header_len; |
22242
4cabf7499fef
Add support for smil playlist served over realrtsp
rtogni
parents:
21842
diff
changeset
|
197 } |
18792
6a015ba5bf45
move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents:
17351
diff
changeset
|
198 rtsp_session->real_session->recv_read = 0; |
29583 | 199 rmff_free_header(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
|
200 } else /* not a Real server : try RTP instead */ |
9922 | 201 { |
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
|
202 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
|
203 |
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 /* look for the Public: field in response to RTSP OPTIONS */ |
19595 | 205 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
|
206 { |
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 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
|
208 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
|
209 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
|
210 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
|
211 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
|
212 } |
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 |
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
|
214 /* 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
|
215 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
|
216 || !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
|
217 || !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
|
218 || !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
|
219 { |
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
|
220 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
|
221 "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
|
222 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
|
223 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
|
224 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
|
225 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
|
226 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
|
227 } |
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
|
228 |
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
|
229 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
|
230 |
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
|
231 /* 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
|
232 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
|
233 { |
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
|
234 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
|
235 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
|
236 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
|
237 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
|
238 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
|
239 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
|
240 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
|
241 } |
9922 | 242 } |
243 free(server); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
244 |
9922 | 245 return rtsp_session; |
246 } | |
247 | |
248 int rtsp_session_read (rtsp_session_t *this, char *data, int len) { | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
249 |
18792
6a015ba5bf45
move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents:
17351
diff
changeset
|
250 if (this->real_session) { |
9922 | 251 int to_copy=len; |
252 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
|
253 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
|
254 (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
|
255 int fill = this->real_session->recv_size - this->real_session->recv_read; |
9922 | 256 |
21842 | 257 if(this->real_session->rdteof) |
258 return -1; | |
9922 | 259 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
|
260 if (this->real_session->recv_size < 0) return -1; |
9922 | 261 while (to_copy > fill) { |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
262 |
9922 | 263 memcpy(dest, source, fill); |
264 to_copy -= fill; | |
265 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
|
266 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
|
267 this->real_session->recv_size = |
22242
4cabf7499fef
Add support for smil playlist served over realrtsp
rtogni
parents:
21842
diff
changeset
|
268 real_get_rdt_chunk (this->s, (char **)&(this->real_session->recv), this->real_session->rdt_rawdata); |
21842 | 269 if (this->real_session->recv_size < 0) { |
270 this->real_session->rdteof = 1; | |
271 this->real_session->recv_size = 0; | |
272 } | |
18792
6a015ba5bf45
move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents:
17351
diff
changeset
|
273 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
|
274 fill = this->real_session->recv_size; |
9922 | 275 |
18792
6a015ba5bf45
move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents:
17351
diff
changeset
|
276 if (this->real_session->recv_size == 0) { |
9922 | 277 #ifdef LOG |
18793 | 278 mp_msg (MSGT_OPEN, MSGL_INFO, "librtsp: %d of %d bytes provided\n", len-to_copy, len); |
9922 | 279 #endif |
280 return len-to_copy; | |
281 } | |
282 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
283 |
9922 | 284 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
|
285 this->real_session->recv_read += to_copy; |
9922 | 286 |
287 #ifdef LOG | |
18793 | 288 mp_msg (MSGT_OPEN, MSGL_INFO, "librtsp: %d bytes provided\n", len); |
9922 | 289 #endif |
290 | |
291 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
|
292 } |
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
|
293 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
|
294 { |
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
|
295 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
|
296 |
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
|
297 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
|
298 /* 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
|
299 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
|
300 |
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
|
301 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
|
302 rtsp_session_end (this); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28402
diff
changeset
|
303 |
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
|
304 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
|
305 } |
18792
6a015ba5bf45
move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents:
17351
diff
changeset
|
306 |
6a015ba5bf45
move real_rtsp init/uninit code to its dedicated place to simplify a bit rtsp session demuxer
ben
parents:
17351
diff
changeset
|
307 return 0; |
9922 | 308 } |
309 | |
310 void rtsp_session_end(rtsp_session_t *session) { | |
311 | |
312 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
|
313 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
|
314 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
|
315 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
|
316 rtp_session_free (session->rtp_session); |
9922 | 317 free(session); |
318 } |