Mercurial > libavformat.hg
annotate rtsp.c @ 5966:9a86b49201bb libavformat
Revert svn rev 21857, readd first_rtcp_ntp_time in RTPDemuxContext
In order to sync RTP streams that get their initial RTCP timestamp at
different times, propagate the NTP timestamp of the first RTCP packet
to all other streams.
This makes the timestamps of returned packets start at (near) zero instead
of at any random offset.
author | mstorsjo |
---|---|
date | Tue, 20 Apr 2010 07:34:28 +0000 |
parents | 780410aa35b7 |
children | c5a3e1951fc6 |
rev | line source |
---|---|
0 | 1 /* |
2 * RTSP/SDP client | |
4251
77e0c7511d41
cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents:
4206
diff
changeset
|
3 * Copyright (c) 2002 Fabrice Bellard |
0 | 4 * |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1169
diff
changeset
|
5 * This file is part of FFmpeg. |
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1169
diff
changeset
|
6 * |
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1169
diff
changeset
|
7 * FFmpeg is free software; you can redistribute it and/or |
0 | 8 * modify it under the terms of the GNU Lesser General Public |
9 * License as published by the Free Software Foundation; either | |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1169
diff
changeset
|
10 * version 2.1 of the License, or (at your option) any later version. |
0 | 11 * |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1169
diff
changeset
|
12 * FFmpeg is distributed in the hope that it will be useful, |
0 | 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Lesser General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU Lesser General Public | |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1169
diff
changeset
|
18 * License along with FFmpeg; if not, write to the Free Software |
896
edbe5c3717f9
Update licensing information: The FSF changed postal address.
diego
parents:
887
diff
changeset
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
0 | 20 */ |
3286 | 21 |
5220
cad276e8f96e
RTSP basic authentication, patch originally by Philip Coombes
rbultje
parents:
5112
diff
changeset
|
22 #include "libavutil/base64.h" |
3286 | 23 #include "libavutil/avstring.h" |
4201
7d2f3f1b68d8
Fix build: Add intreadwrite.h and bswap.h #includes where necessary.
diego
parents:
4187
diff
changeset
|
24 #include "libavutil/intreadwrite.h" |
0 | 25 #include "avformat.h" |
26 | |
1808
572ce77d7333
Fix compilation on Mac OS X, patch by Marc Hoffman, mmh pleasantst com.
diego
parents:
1754
diff
changeset
|
27 #include <sys/time.h> |
4206 | 28 #if HAVE_SYS_SELECT_H |
3936
6154f62ef652
include sys/select.h instead of unistd.h to get select,
bcoudurier
parents:
3924
diff
changeset
|
29 #include <sys/select.h> |
3941
53c5b89b8dff
only include sys/select.h if present, fix mingw compilation
bcoudurier
parents:
3936
diff
changeset
|
30 #endif |
3714 | 31 #include <strings.h> |
5837
d605f589f0be
move ff_url_split() and ff_url_join() declarations to internal.h
aurel
parents:
5820
diff
changeset
|
32 #include "internal.h" |
1754 | 33 #include "network.h" |
5802
2d82e25df58c
Include os_support.h which has a fallback declaration of socklen_t
mstorsjo
parents:
5800
diff
changeset
|
34 #include "os_support.h" |
2681
6037eb4919fb
Remove the inclusion of rtsp.h and rtp.h from avformat.h, and
lucabe
parents:
2408
diff
changeset
|
35 #include "rtsp.h" |
0 | 36 |
4388 | 37 #include "rtpdec.h" |
3876
1026953d4ffe
Implement Realmedia/RTSP-compatible SETUP command. This includes calculation
rbultje
parents:
3861
diff
changeset
|
38 #include "rdt.h" |
5726
04b39763b51b
Rename RTP depacketizer files from rtp_* to rtpdec_*
mstorsjo
parents:
5700
diff
changeset
|
39 #include "rtpdec_asf.h" |
1419 | 40 |
0 | 41 //#define DEBUG |
172 | 42 //#define DEBUG_RTP_TCP |
0 | 43 |
2884 | 44 #if LIBAVFORMAT_VERSION_INT < (53 << 16) |
3957
9f943bb755f9
Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us
rbultje
parents:
3941
diff
changeset
|
45 int rtsp_default_protocols = (1 << RTSP_LOWER_TRANSPORT_UDP); |
2884 | 46 #endif |
0 | 47 |
5906 | 48 /* Timeout values for socket select, in ms, |
5905
09a6916ecbf6
Add a timeout to the select() call. Patch by Sam Gerstein <sgerstein bluefinlab
rbultje
parents:
5894
diff
changeset
|
49 * and read_packet(), in seconds */ |
09a6916ecbf6
Add a timeout to the select() call. Patch by Sam Gerstein <sgerstein bluefinlab
rbultje
parents:
5894
diff
changeset
|
50 #define SELECT_TIMEOUT_MS 100 |
09a6916ecbf6
Add a timeout to the select() call. Patch by Sam Gerstein <sgerstein bluefinlab
rbultje
parents:
5894
diff
changeset
|
51 #define READ_PACKET_TIMEOUT_S 10 |
09a6916ecbf6
Add a timeout to the select() call. Patch by Sam Gerstein <sgerstein bluefinlab
rbultje
parents:
5894
diff
changeset
|
52 #define MAX_TIMEOUTS READ_PACKET_TIMEOUT_S * 1000 / SELECT_TIMEOUT_MS |
09a6916ecbf6
Add a timeout to the select() call. Patch by Sam Gerstein <sgerstein bluefinlab
rbultje
parents:
5894
diff
changeset
|
53 |
4773
1c9751d3065c
Merge functional code from get_word() and get_word_sep() into a single
rbultje
parents:
4772
diff
changeset
|
54 #define SPACE_CHARS " \t\r\n" |
4789
c18ea19a9771
strchr(string, '\0') returns non-NULL, and is thus not suited for use in
rbultje
parents:
4779
diff
changeset
|
55 /* we use memchr() instead of strchr() here because strchr() will return |
c18ea19a9771
strchr(string, '\0') returns non-NULL, and is thus not suited for use in
rbultje
parents:
4779
diff
changeset
|
56 * the terminating '\0' of SPACE_CHARS instead of NULL if c is '\0'. */ |
c18ea19a9771
strchr(string, '\0') returns non-NULL, and is thus not suited for use in
rbultje
parents:
4779
diff
changeset
|
57 #define redir_isspace(c) memchr(SPACE_CHARS, c, 4) |
0 | 58 static void skip_spaces(const char **pp) |
59 { | |
60 const char *p; | |
61 p = *pp; | |
62 while (redir_isspace(*p)) | |
63 p++; | |
64 *pp = p; | |
65 } | |
66 | |
4773
1c9751d3065c
Merge functional code from get_word() and get_word_sep() into a single
rbultje
parents:
4772
diff
changeset
|
67 static void get_word_until_chars(char *buf, int buf_size, |
1c9751d3065c
Merge functional code from get_word() and get_word_sep() into a single
rbultje
parents:
4772
diff
changeset
|
68 const char *sep, const char **pp) |
0 | 69 { |
70 const char *p; | |
71 char *q; | |
72 | |
73 p = *pp; | |
74 skip_spaces(&p); | |
75 q = buf; | |
76 while (!strchr(sep, *p) && *p != '\0') { | |
77 if ((q - buf) < buf_size - 1) | |
78 *q++ = *p; | |
79 p++; | |
80 } | |
81 if (buf_size > 0) | |
82 *q = '\0'; | |
83 *pp = p; | |
84 } | |
85 | |
4773
1c9751d3065c
Merge functional code from get_word() and get_word_sep() into a single
rbultje
parents:
4772
diff
changeset
|
86 static void get_word_sep(char *buf, int buf_size, const char *sep, |
1c9751d3065c
Merge functional code from get_word() and get_word_sep() into a single
rbultje
parents:
4772
diff
changeset
|
87 const char **pp) |
1c9751d3065c
Merge functional code from get_word() and get_word_sep() into a single
rbultje
parents:
4772
diff
changeset
|
88 { |
1c9751d3065c
Merge functional code from get_word() and get_word_sep() into a single
rbultje
parents:
4772
diff
changeset
|
89 if (**pp == '/') (*pp)++; |
1c9751d3065c
Merge functional code from get_word() and get_word_sep() into a single
rbultje
parents:
4772
diff
changeset
|
90 get_word_until_chars(buf, buf_size, sep, pp); |
1c9751d3065c
Merge functional code from get_word() and get_word_sep() into a single
rbultje
parents:
4772
diff
changeset
|
91 } |
1c9751d3065c
Merge functional code from get_word() and get_word_sep() into a single
rbultje
parents:
4772
diff
changeset
|
92 |
0 | 93 static void get_word(char *buf, int buf_size, const char **pp) |
94 { | |
4773
1c9751d3065c
Merge functional code from get_word() and get_word_sep() into a single
rbultje
parents:
4772
diff
changeset
|
95 get_word_until_chars(buf, buf_size, SPACE_CHARS, pp); |
0 | 96 } |
97 | |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
98 /* parse the rtpmap description: <codec_name>/<clock_rate>[/<other params>] */ |
5503
4ec7bcff8719
Add correct log context to av_log() calls in parse_rtpmap().
rbultje
parents:
5502
diff
changeset
|
99 static int sdp_parse_rtpmap(AVFormatContext *s, |
4ec7bcff8719
Add correct log context to av_log() calls in parse_rtpmap().
rbultje
parents:
5502
diff
changeset
|
100 AVCodecContext *codec, RTSPStream *rtsp_st, |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
101 int payload_type, const char *p) |
0 | 102 { |
103 char buf[256]; | |
774 | 104 int i; |
105 AVCodec *c; | |
1124
d3aff2c607f9
Add const to (mostly) char* and make some functions static, which aren't used
diego
parents:
1003
diff
changeset
|
106 const char *c_name; |
0 | 107 |
774 | 108 /* Loop into AVRtpDynamicPayloadTypes[] and AVRtpPayloadTypes[] and |
5529
0a67dbb939a0
Fix issue1658 (trailing space in rtpmap descriptor).
rbultje
parents:
5503
diff
changeset
|
109 * see if we can handle this kind of payload. |
0a67dbb939a0
Fix issue1658 (trailing space in rtpmap descriptor).
rbultje
parents:
5503
diff
changeset
|
110 * The space should normally not be there but some Real streams or |
0a67dbb939a0
Fix issue1658 (trailing space in rtpmap descriptor).
rbultje
parents:
5503
diff
changeset
|
111 * particular servers ("RealServer Version 6.1.3.970", see issue 1658) |
0a67dbb939a0
Fix issue1658 (trailing space in rtpmap descriptor).
rbultje
parents:
5503
diff
changeset
|
112 * have a trailing space. */ |
0a67dbb939a0
Fix issue1658 (trailing space in rtpmap descriptor).
rbultje
parents:
5503
diff
changeset
|
113 get_word_sep(buf, sizeof(buf), "/ ", &p); |
774 | 114 if (payload_type >= RTP_PT_PRIVATE) { |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
115 RTPDynamicProtocolHandler *handler; |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
116 for (handler = RTPFirstDynamicPayloadHandler; |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
117 handler; handler = handler->next) { |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
118 if (!strcasecmp(buf, handler->enc_name) && |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
119 codec->codec_type == handler->codec_type) { |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
120 codec->codec_id = handler->codec_id; |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
121 rtsp_st->dynamic_handler = handler; |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
122 if (handler->open) |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
123 rtsp_st->dynamic_protocol_context = handler->open(); |
774 | 124 break; |
125 } | |
1419 | 126 } |
774 | 127 } else { |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
128 /* We are in a standard case |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
129 * (from http://www.iana.org/assignments/rtp-parameters). */ |
774 | 130 /* search into AVRtpPayloadTypes[] */ |
2759
b252e318023a
Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents:
2711
diff
changeset
|
131 codec->codec_id = ff_rtp_codec_id(buf, codec->codec_type); |
774 | 132 } |
133 | |
134 c = avcodec_find_decoder(codec->codec_id); | |
135 if (c && c->name) | |
1124
d3aff2c607f9
Add const to (mostly) char* and make some functions static, which aren't used
diego
parents:
1003
diff
changeset
|
136 c_name = c->name; |
774 | 137 else |
5644
95e016b6158c
Don't forget to set known audio parameters (samplerate, etc.) if the codec is
rbultje
parents:
5589
diff
changeset
|
138 c_name = "(null)"; |
774 | 139 |
5645 | 140 get_word_sep(buf, sizeof(buf), "/", &p); |
141 i = atoi(buf); | |
142 switch (codec->codec_type) { | |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5909
diff
changeset
|
143 case AVMEDIA_TYPE_AUDIO: |
5645 | 144 av_log(s, AV_LOG_DEBUG, "audio codec set to: %s\n", c_name); |
145 codec->sample_rate = RTSP_DEFAULT_AUDIO_SAMPLERATE; | |
146 codec->channels = RTSP_DEFAULT_NB_AUDIO_CHANNELS; | |
147 if (i > 0) { | |
148 codec->sample_rate = i; | |
149 get_word_sep(buf, sizeof(buf), "/", &p); | |
150 i = atoi(buf); | |
151 if (i > 0) | |
152 codec->channels = i; | |
153 // TODO: there is a bug here; if it is a mono stream, and | |
154 // less than 22000Hz, faad upconverts to stereo and twice | |
155 // the frequency. No problem, but the sample rate is being | |
156 // set here by the sdp line. Patch on its way. (rdm) | |
774 | 157 } |
5645 | 158 av_log(s, AV_LOG_DEBUG, "audio samplerate set to: %i\n", |
159 codec->sample_rate); | |
160 av_log(s, AV_LOG_DEBUG, "audio channels set to: %i\n", | |
161 codec->channels); | |
162 break; | |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5909
diff
changeset
|
163 case AVMEDIA_TYPE_VIDEO: |
5645 | 164 av_log(s, AV_LOG_DEBUG, "video codec set to: %s\n", c_name); |
165 break; | |
166 default: | |
167 break; | |
168 } | |
169 return 0; | |
0 | 170 } |
171 | |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
172 /* return the length and optionally the data */ |
0 | 173 static int hex_to_data(uint8_t *data, const char *p) |
174 { | |
175 int c, len, v; | |
176 | |
177 len = 0; | |
178 v = 1; | |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
179 for (;;) { |
0 | 180 skip_spaces(&p); |
4776
894e353aaeca
Fix silly bug in hex_to_data() where it compares a string pointer for whether
rbultje
parents:
4775
diff
changeset
|
181 if (*p == '\0') |
0 | 182 break; |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
183 c = toupper((unsigned char) *p++); |
0 | 184 if (c >= '0' && c <= '9') |
185 c = c - '0'; | |
186 else if (c >= 'A' && c <= 'F') | |
187 c = c - 'A' + 10; | |
188 else | |
189 break; | |
190 v = (v << 4) | c; | |
191 if (v & 0x100) { | |
192 if (data) | |
193 data[len] = v; | |
194 len++; | |
195 v = 1; | |
196 } | |
197 } | |
198 return len; | |
199 } | |
200 | |
4875
13a2a1a475d5
Add a Vorbis payload parser. Implemented by Colin McQuillan as a GSoC
rbultje
parents:
4874
diff
changeset
|
201 static void sdp_parse_fmtp_config(AVCodecContext * codec, void *ctx, |
13a2a1a475d5
Add a Vorbis payload parser. Implemented by Colin McQuillan as a GSoC
rbultje
parents:
4874
diff
changeset
|
202 char *attr, char *value) |
774 | 203 { |
204 switch (codec->codec_id) { | |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
205 case CODEC_ID_MPEG4: |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
206 case CODEC_ID_AAC: |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
207 if (!strcmp(attr, "config")) { |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
208 /* decode the hexa encoded parameter */ |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
209 int len = hex_to_data(NULL, value); |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
210 if (codec->extradata) |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
211 av_free(codec->extradata); |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
212 codec->extradata = av_mallocz(len + FF_INPUT_BUFFER_PADDING_SIZE); |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
213 if (!codec->extradata) |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
214 return; |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
215 codec->extradata_size = len; |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
216 hex_to_data(codec->extradata, value); |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
217 } |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
218 break; |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
219 default: |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
220 break; |
774 | 221 } |
222 return; | |
223 } | |
224 | |
4088 | 225 typedef struct { |
1124
d3aff2c607f9
Add const to (mostly) char* and make some functions static, which aren't used
diego
parents:
1003
diff
changeset
|
226 const char *str; |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
227 uint16_t type; |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
228 uint32_t offset; |
4088 | 229 } AttrNameMap; |
774 | 230 |
5906 | 231 /* All known fmtp parameters and the corresponding RTPAttrTypeEnum */ |
774 | 232 #define ATTR_NAME_TYPE_INT 0 |
233 #define ATTR_NAME_TYPE_STR 1 | |
4088 | 234 static const AttrNameMap attr_names[]= |
774 | 235 { |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
236 { "SizeLength", ATTR_NAME_TYPE_INT, |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
237 offsetof(RTPPayloadData, sizelength) }, |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
238 { "IndexLength", ATTR_NAME_TYPE_INT, |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
239 offsetof(RTPPayloadData, indexlength) }, |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
240 { "IndexDeltaLength", ATTR_NAME_TYPE_INT, |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
241 offsetof(RTPPayloadData, indexdeltalength) }, |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
242 { "profile-level-id", ATTR_NAME_TYPE_INT, |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
243 offsetof(RTPPayloadData, profile_level_id) }, |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
244 { "StreamType", ATTR_NAME_TYPE_INT, |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
245 offsetof(RTPPayloadData, streamtype) }, |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
246 { "mode", ATTR_NAME_TYPE_STR, |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
247 offsetof(RTPPayloadData, mode) }, |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
248 { NULL, -1, -1 }, |
774 | 249 }; |
250 | |
5906 | 251 /* parse the attribute line from the fmtp a line of an sdp response. This |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
252 * is broken out as a function because it is used in rtp_h264.c, which is |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
253 * forthcoming. */ |
5697 | 254 int ff_rtsp_next_attr_and_value(const char **p, char *attr, int attr_size, |
5700 | 255 char *value, int value_size) |
1431
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1425
diff
changeset
|
256 { |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1425
diff
changeset
|
257 skip_spaces(p); |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
258 if (**p) { |
1431
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1425
diff
changeset
|
259 get_word_sep(attr, attr_size, "=", p); |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1425
diff
changeset
|
260 if (**p == '=') |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1425
diff
changeset
|
261 (*p)++; |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1425
diff
changeset
|
262 get_word_sep(value, value_size, ";", p); |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1425
diff
changeset
|
263 if (**p == ';') |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1425
diff
changeset
|
264 (*p)++; |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1425
diff
changeset
|
265 return 1; |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1425
diff
changeset
|
266 } |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1425
diff
changeset
|
267 return 0; |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1425
diff
changeset
|
268 } |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1425
diff
changeset
|
269 |
774 | 270 /* parse a SDP line and save stream attributes */ |
271 static void sdp_parse_fmtp(AVStream *st, const char *p) | |
0 | 272 { |
273 char attr[256]; | |
4874
5370b0c1653c
Increase the SDP buffer size (again!) and also increase the temporary
rbultje
parents:
4789
diff
changeset
|
274 /* Vorbis setup headers can be up to 12KB and are sent base64 |
5370b0c1653c
Increase the SDP buffer size (again!) and also increase the temporary
rbultje
parents:
4789
diff
changeset
|
275 * encoded, giving a 12KB * (4/3) = 16KB FMTP line. */ |
5370b0c1653c
Increase the SDP buffer size (again!) and also increase the temporary
rbultje
parents:
4789
diff
changeset
|
276 char value[16384]; |
774 | 277 int i; |
278 RTSPStream *rtsp_st = st->priv_data; | |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
774
diff
changeset
|
279 AVCodecContext *codec = st->codec; |
4101
af2c0aef892b
Rename rtp_payload_data_t to avoid clashes with the POSIX namespace
lucabe
parents:
4088
diff
changeset
|
280 RTPPayloadData *rtp_payload_data = &rtsp_st->rtp_payload_data; |
0 | 281 |
282 /* loop on each attribute */ | |
5697 | 283 while (ff_rtsp_next_attr_and_value(&p, attr, sizeof(attr), |
5700 | 284 value, sizeof(value))) { |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
285 /* grab the codec extra_data from the config parameter of the fmtp |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
286 * line */ |
4875
13a2a1a475d5
Add a Vorbis payload parser. Implemented by Colin McQuillan as a GSoC
rbultje
parents:
4874
diff
changeset
|
287 sdp_parse_fmtp_config(codec, rtsp_st->dynamic_protocol_context, |
13a2a1a475d5
Add a Vorbis payload parser. Implemented by Colin McQuillan as a GSoC
rbultje
parents:
4874
diff
changeset
|
288 attr, value); |
774 | 289 /* Looking for a known attribute */ |
290 for (i = 0; attr_names[i].str; ++i) { | |
291 if (!strcasecmp(attr, attr_names[i].str)) { | |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
292 if (attr_names[i].type == ATTR_NAME_TYPE_INT) { |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
293 *(int *)((char *)rtp_payload_data + |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
294 attr_names[i].offset) = atoi(value); |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
295 } else if (attr_names[i].type == ATTR_NAME_TYPE_STR) |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
296 *(char **)((char *)rtp_payload_data + |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
297 attr_names[i].offset) = av_strdup(value); |
887 | 298 } |
0 | 299 } |
300 } | |
301 } | |
302 | |
5485 | 303 /** Parse a string p in the form of Range:npt=xx-xx, and determine the start |
1453
c0235bab9e92
Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents:
1431
diff
changeset
|
304 * and end time. |
c0235bab9e92
Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents:
1431
diff
changeset
|
305 * Used for seeking in the rtp stream. |
c0235bab9e92
Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents:
1431
diff
changeset
|
306 */ |
c0235bab9e92
Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents:
1431
diff
changeset
|
307 static void rtsp_parse_range_npt(const char *p, int64_t *start, int64_t *end) |
c0235bab9e92
Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents:
1431
diff
changeset
|
308 { |
c0235bab9e92
Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents:
1431
diff
changeset
|
309 char buf[256]; |
c0235bab9e92
Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents:
1431
diff
changeset
|
310 |
c0235bab9e92
Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents:
1431
diff
changeset
|
311 skip_spaces(&p); |
2193
5ce5fad0dfac
replace the uses of old string functions that Reimar missed
mru
parents:
2189
diff
changeset
|
312 if (!av_stristart(p, "npt=", &p)) |
1453
c0235bab9e92
Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents:
1431
diff
changeset
|
313 return; |
c0235bab9e92
Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents:
1431
diff
changeset
|
314 |
c0235bab9e92
Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents:
1431
diff
changeset
|
315 *start = AV_NOPTS_VALUE; |
c0235bab9e92
Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents:
1431
diff
changeset
|
316 *end = AV_NOPTS_VALUE; |
c0235bab9e92
Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents:
1431
diff
changeset
|
317 |
c0235bab9e92
Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents:
1431
diff
changeset
|
318 get_word_sep(buf, sizeof(buf), "-", &p); |
c0235bab9e92
Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents:
1431
diff
changeset
|
319 *start = parse_date(buf, 1); |
c0235bab9e92
Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents:
1431
diff
changeset
|
320 if (*p == '-') { |
c0235bab9e92
Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents:
1431
diff
changeset
|
321 p++; |
c0235bab9e92
Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents:
1431
diff
changeset
|
322 get_word_sep(buf, sizeof(buf), "-", &p); |
c0235bab9e92
Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents:
1431
diff
changeset
|
323 *end = parse_date(buf, 1); |
c0235bab9e92
Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents:
1431
diff
changeset
|
324 } |
c0235bab9e92
Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents:
1431
diff
changeset
|
325 // av_log(NULL, AV_LOG_DEBUG, "Range Start: %lld\n", *start); |
c0235bab9e92
Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents:
1431
diff
changeset
|
326 // av_log(NULL, AV_LOG_DEBUG, "Range End: %lld\n", *end); |
c0235bab9e92
Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents:
1431
diff
changeset
|
327 } |
c0235bab9e92
Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents:
1431
diff
changeset
|
328 |
0 | 329 typedef struct SDPParseState { |
330 /* SDP only */ | |
331 struct in_addr default_ip; | |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
332 int default_ttl; |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
333 int skip_media; ///< set if an unknown m= line occurs |
0 | 334 } SDPParseState; |
335 | |
336 static void sdp_parse_line(AVFormatContext *s, SDPParseState *s1, | |
337 int letter, const char *buf) | |
338 { | |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
229
diff
changeset
|
339 RTSPState *rt = s->priv_data; |
0 | 340 char buf1[64], st_type[64]; |
341 const char *p; | |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5909
diff
changeset
|
342 enum AVMediaType codec_type; |
3967 | 343 int payload_type, i; |
0 | 344 AVStream *st; |
345 RTSPStream *rtsp_st; | |
346 struct in_addr sdp_ip; | |
347 int ttl; | |
348 | |
4990 | 349 dprintf(s, "sdp: %c='%s'\n", letter, buf); |
0 | 350 |
351 p = buf; | |
4281
f1d8951d6813
Skip m= blocks in the SDP if the media type is unknown. This prevents
rbultje
parents:
4251
diff
changeset
|
352 if (s1->skip_media && letter != 'm') |
f1d8951d6813
Skip m= blocks in the SDP if the media type is unknown. This prevents
rbultje
parents:
4251
diff
changeset
|
353 return; |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
354 switch (letter) { |
0 | 355 case 'c': |
356 get_word(buf1, sizeof(buf1), &p); | |
357 if (strcmp(buf1, "IN") != 0) | |
358 return; | |
359 get_word(buf1, sizeof(buf1), &p); | |
360 if (strcmp(buf1, "IP4") != 0) | |
361 return; | |
362 get_word_sep(buf1, sizeof(buf1), "/", &p); | |
5766
a292ef47e2f9
Localize the #define _SVID_SOURCE needed for inet_aton() to os_support.c
conrad
parents:
5756
diff
changeset
|
363 if (ff_inet_aton(buf1, &sdp_ip) == 0) |
0 | 364 return; |
365 ttl = 16; | |
366 if (*p == '/') { | |
367 p++; | |
368 get_word_sep(buf1, sizeof(buf1), "/", &p); | |
369 ttl = atoi(buf1); | |
370 } | |
371 if (s->nb_streams == 0) { | |
372 s1->default_ip = sdp_ip; | |
373 s1->default_ttl = ttl; | |
374 } else { | |
375 st = s->streams[s->nb_streams - 1]; | |
376 rtsp_st = st->priv_data; | |
377 rtsp_st->sdp_ip = sdp_ip; | |
378 rtsp_st->sdp_ttl = ttl; | |
379 } | |
380 break; | |
381 case 's': | |
4361 | 382 av_metadata_set(&s->metadata, "title", p); |
0 | 383 break; |
384 case 'i': | |
385 if (s->nb_streams == 0) { | |
4361 | 386 av_metadata_set(&s->metadata, "comment", p); |
0 | 387 break; |
388 } | |
389 break; | |
390 case 'm': | |
391 /* new stream */ | |
4281
f1d8951d6813
Skip m= blocks in the SDP if the media type is unknown. This prevents
rbultje
parents:
4251
diff
changeset
|
392 s1->skip_media = 0; |
0 | 393 get_word(st_type, sizeof(st_type), &p); |
394 if (!strcmp(st_type, "audio")) { | |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5909
diff
changeset
|
395 codec_type = AVMEDIA_TYPE_AUDIO; |
0 | 396 } else if (!strcmp(st_type, "video")) { |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5909
diff
changeset
|
397 codec_type = AVMEDIA_TYPE_VIDEO; |
4637
eaf90db8cc42
Recognize the "application" data type, which is required for WMS/UDP
rbultje
parents:
4557
diff
changeset
|
398 } else if (!strcmp(st_type, "application")) { |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5909
diff
changeset
|
399 codec_type = AVMEDIA_TYPE_DATA; |
0 | 400 } else { |
4281
f1d8951d6813
Skip m= blocks in the SDP if the media type is unknown. This prevents
rbultje
parents:
4251
diff
changeset
|
401 s1->skip_media = 1; |
0 | 402 return; |
403 } | |
404 rtsp_st = av_mallocz(sizeof(RTSPStream)); | |
405 if (!rtsp_st) | |
406 return; | |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
229
diff
changeset
|
407 rtsp_st->stream_index = -1; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
229
diff
changeset
|
408 dynarray_add(&rt->rtsp_streams, &rt->nb_rtsp_streams, rtsp_st); |
0 | 409 |
410 rtsp_st->sdp_ip = s1->default_ip; | |
411 rtsp_st->sdp_ttl = s1->default_ttl; | |
412 | |
413 get_word(buf1, sizeof(buf1), &p); /* port */ | |
414 rtsp_st->sdp_port = atoi(buf1); | |
415 | |
416 get_word(buf1, sizeof(buf1), &p); /* protocol (ignored) */ | |
885 | 417 |
0 | 418 /* XXX: handle list of formats */ |
419 get_word(buf1, sizeof(buf1), &p); /* format list */ | |
420 rtsp_st->sdp_payload_type = atoi(buf1); | |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
229
diff
changeset
|
421 |
2759
b252e318023a
Remove the "AVRtpPayloadTypes[i].pt == i" assumption from RTP and RTSP
lucabe
parents:
2711
diff
changeset
|
422 if (!strcmp(ff_rtp_enc_name(rtsp_st->sdp_payload_type), "MP2T")) { |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
229
diff
changeset
|
423 /* no corresponding stream */ |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
229
diff
changeset
|
424 } else { |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
229
diff
changeset
|
425 st = av_new_stream(s, 0); |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
229
diff
changeset
|
426 if (!st) |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
229
diff
changeset
|
427 return; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
229
diff
changeset
|
428 st->priv_data = rtsp_st; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
229
diff
changeset
|
429 rtsp_st->stream_index = st->index; |
820
feca73904e67
changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents:
774
diff
changeset
|
430 st->codec->codec_type = codec_type; |
774 | 431 if (rtsp_st->sdp_payload_type < RTP_PT_PRIVATE) { |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
229
diff
changeset
|
432 /* if standard payload type, we can find the codec right now */ |
4519
f4b9967e0131
Remame rtp_get_codec_info() to ff_rtp_get_codec_info(), as it is not
lucabe
parents:
4514
diff
changeset
|
433 ff_rtp_get_codec_info(st->codec, rtsp_st->sdp_payload_type); |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
229
diff
changeset
|
434 } |
0 | 435 } |
436 /* put a default control url */ | |
5574
016f3d4fe56d
Use the control URI from the SDP (if present) rather than the input filename,
rbultje
parents:
5572
diff
changeset
|
437 av_strlcpy(rtsp_st->control_url, rt->control_uri, |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
438 sizeof(rtsp_st->control_url)); |
0 | 439 break; |
440 case 'a': | |
5574
016f3d4fe56d
Use the control URI from the SDP (if present) rather than the input filename,
rbultje
parents:
5572
diff
changeset
|
441 if (av_strstart(p, "control:", &p)) { |
016f3d4fe56d
Use the control URI from the SDP (if present) rather than the input filename,
rbultje
parents:
5572
diff
changeset
|
442 if (s->nb_streams == 0) { |
016f3d4fe56d
Use the control URI from the SDP (if present) rather than the input filename,
rbultje
parents:
5572
diff
changeset
|
443 if (!strncmp(p, "rtsp://", 7)) |
016f3d4fe56d
Use the control URI from the SDP (if present) rather than the input filename,
rbultje
parents:
5572
diff
changeset
|
444 av_strlcpy(rt->control_uri, p, |
016f3d4fe56d
Use the control URI from the SDP (if present) rather than the input filename,
rbultje
parents:
5572
diff
changeset
|
445 sizeof(rt->control_uri)); |
016f3d4fe56d
Use the control URI from the SDP (if present) rather than the input filename,
rbultje
parents:
5572
diff
changeset
|
446 } else { |
0 | 447 char proto[32]; |
448 /* get the control url */ | |
449 st = s->streams[s->nb_streams - 1]; | |
450 rtsp_st = st->priv_data; | |
885 | 451 |
0 | 452 /* XXX: may need to add full url resolution */ |
5775 | 453 ff_url_split(proto, sizeof(proto), NULL, 0, NULL, 0, |
5776 | 454 NULL, NULL, 0, p); |
0 | 455 if (proto[0] == '\0') { |
456 /* relative control URL */ | |
5574
016f3d4fe56d
Use the control URI from the SDP (if present) rather than the input filename,
rbultje
parents:
5572
diff
changeset
|
457 if (rtsp_st->control_url[strlen(rtsp_st->control_url)-1]!='/') |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
458 av_strlcat(rtsp_st->control_url, "/", |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
459 sizeof(rtsp_st->control_url)); |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
460 av_strlcat(rtsp_st->control_url, p, |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
461 sizeof(rtsp_st->control_url)); |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
462 } else |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
463 av_strlcpy(rtsp_st->control_url, p, |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
464 sizeof(rtsp_st->control_url)); |
5574
016f3d4fe56d
Use the control URI from the SDP (if present) rather than the input filename,
rbultje
parents:
5572
diff
changeset
|
465 } |
4185
023976c45ae1
Apply rtpmap: SDP lines to the last m= line only, since they generally just
rbultje
parents:
4182
diff
changeset
|
466 } else if (av_strstart(p, "rtpmap:", &p) && s->nb_streams > 0) { |
0 | 467 /* NOTE: rtpmap is only supported AFTER the 'm=' tag */ |
885 | 468 get_word(buf1, sizeof(buf1), &p); |
0 | 469 payload_type = atoi(buf1); |
4185
023976c45ae1
Apply rtpmap: SDP lines to the last m= line only, since they generally just
rbultje
parents:
4182
diff
changeset
|
470 st = s->streams[s->nb_streams - 1]; |
4186 | 471 rtsp_st = st->priv_data; |
5503
4ec7bcff8719
Add correct log context to av_log() calls in parse_rtpmap().
rbultje
parents:
5502
diff
changeset
|
472 sdp_parse_rtpmap(s, st->codec, rtsp_st, payload_type, p); |
2193
5ce5fad0dfac
replace the uses of old string functions that Reimar missed
mru
parents:
2189
diff
changeset
|
473 } else if (av_strstart(p, "fmtp:", &p)) { |
0 | 474 /* NOTE: fmtp is only supported AFTER the 'a=rtpmap:xxx' tag */ |
885 | 475 get_word(buf1, sizeof(buf1), &p); |
0 | 476 payload_type = atoi(buf1); |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
477 for (i = 0; i < s->nb_streams; i++) { |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
478 st = s->streams[i]; |
0 | 479 rtsp_st = st->priv_data; |
480 if (rtsp_st->sdp_payload_type == payload_type) { | |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
481 if (!(rtsp_st->dynamic_handler && |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
482 rtsp_st->dynamic_handler->parse_sdp_a_line && |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
483 rtsp_st->dynamic_handler->parse_sdp_a_line(s, |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
484 i, rtsp_st->dynamic_protocol_context, buf))) |
1424
1c39ce5c6a5d
indentation fix, patch by Ryan Martell % rdm4 A martellventures P com %
gpoirier
parents:
1419
diff
changeset
|
485 sdp_parse_fmtp(st, p); |
0 | 486 } |
487 } | |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
488 } else if (av_strstart(p, "framesize:", &p)) { |
1431
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1425
diff
changeset
|
489 // let dynamic protocol handlers have a stab at the line. |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1425
diff
changeset
|
490 get_word(buf1, sizeof(buf1), &p); |
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1425
diff
changeset
|
491 payload_type = atoi(buf1); |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
492 for (i = 0; i < s->nb_streams; i++) { |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
493 st = s->streams[i]; |
1431
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1425
diff
changeset
|
494 rtsp_st = st->priv_data; |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
495 if (rtsp_st->sdp_payload_type == payload_type && |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
496 rtsp_st->dynamic_handler && |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
497 rtsp_st->dynamic_handler->parse_sdp_a_line) |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
498 rtsp_st->dynamic_handler->parse_sdp_a_line(s, i, |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
499 rtsp_st->dynamic_protocol_context, buf); |
1431
2d8a17631520
fix more dynamic protocol stuff, needed by the forthcoming h264
gpoirier
parents:
1425
diff
changeset
|
500 } |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
501 } else if (av_strstart(p, "range:", &p)) { |
1453
c0235bab9e92
Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents:
1431
diff
changeset
|
502 int64_t start, end; |
c0235bab9e92
Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents:
1431
diff
changeset
|
503 |
c0235bab9e92
Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents:
1431
diff
changeset
|
504 // this is so that seeking on a streamed file can work. |
c0235bab9e92
Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents:
1431
diff
changeset
|
505 rtsp_parse_range_npt(p, &start, &end); |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
506 s->start_time = start; |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
507 /* AV_NOPTS_VALUE means live broadcast (and can't seek) */ |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
508 s->duration = (end == AV_NOPTS_VALUE) ? |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
509 AV_NOPTS_VALUE : end - start; |
3960
13e9b0d3a314
Implement a RTSPTransport field, which allows proper separation of server
rbultje
parents:
3959
diff
changeset
|
510 } else if (av_strstart(p, "IsRealDataType:integer;",&p)) { |
13e9b0d3a314
Implement a RTSPTransport field, which allows proper separation of server
rbultje
parents:
3959
diff
changeset
|
511 if (atoi(p) == 1) |
13e9b0d3a314
Implement a RTSPTransport field, which allows proper separation of server
rbultje
parents:
3959
diff
changeset
|
512 rt->transport = RTSP_TRANSPORT_RDT; |
4744
51899c07a4f1
Add RTP/ASF header parsing, which is part of the SDP of these streams. See
rbultje
parents:
4667
diff
changeset
|
513 } else { |
51899c07a4f1
Add RTP/ASF header parsing, which is part of the SDP of these streams. See
rbultje
parents:
4667
diff
changeset
|
514 if (rt->server_type == RTSP_SERVER_WMS) |
51899c07a4f1
Add RTP/ASF header parsing, which is part of the SDP of these streams. See
rbultje
parents:
4667
diff
changeset
|
515 ff_wms_parse_sdp_a_line(s, p); |
51899c07a4f1
Add RTP/ASF header parsing, which is part of the SDP of these streams. See
rbultje
parents:
4667
diff
changeset
|
516 if (s->nb_streams > 0) { |
4745 | 517 if (rt->server_type == RTSP_SERVER_REAL) |
518 ff_real_parse_sdp_a_line(s, s->nb_streams - 1, p); | |
4163
8d6512cbd657
Parse the ASMRuleBook SDP line to dynamically create one new AVStream for
rbultje
parents:
4109
diff
changeset
|
519 |
4745 | 520 rtsp_st = s->streams[s->nb_streams - 1]->priv_data; |
521 if (rtsp_st->dynamic_handler && | |
522 rtsp_st->dynamic_handler->parse_sdp_a_line) | |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
523 rtsp_st->dynamic_handler->parse_sdp_a_line(s, |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
524 s->nb_streams - 1, |
4745 | 525 rtsp_st->dynamic_protocol_context, buf); |
4744
51899c07a4f1
Add RTP/ASF header parsing, which is part of the SDP of these streams. See
rbultje
parents:
4667
diff
changeset
|
526 } |
0 | 527 } |
528 break; | |
529 } | |
530 } | |
531 | |
64 | 532 static int sdp_parse(AVFormatContext *s, const char *content) |
0 | 533 { |
534 const char *p; | |
535 int letter; | |
4187 | 536 /* Some SDP lines, particularly for Realmedia or ASF RTSP streams, |
537 * contain long SDP lines containing complete ASF Headers (several | |
538 * kB) or arrays of MDPR (RM stream descriptor) headers plus | |
539 * "rulebooks" describing their properties. Therefore, the SDP line | |
4874
5370b0c1653c
Increase the SDP buffer size (again!) and also increase the temporary
rbultje
parents:
4789
diff
changeset
|
540 * buffer is large. |
5370b0c1653c
Increase the SDP buffer size (again!) and also increase the temporary
rbultje
parents:
4789
diff
changeset
|
541 * |
5370b0c1653c
Increase the SDP buffer size (again!) and also increase the temporary
rbultje
parents:
4789
diff
changeset
|
542 * The Vorbis FMTP line can be up to 16KB - see sdp_parse_fmtp. */ |
5370b0c1653c
Increase the SDP buffer size (again!) and also increase the temporary
rbultje
parents:
4789
diff
changeset
|
543 char buf[16384], *q; |
0 | 544 SDPParseState sdp_parse_state, *s1 = &sdp_parse_state; |
885 | 545 |
0 | 546 memset(s1, 0, sizeof(SDPParseState)); |
547 p = content; | |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
548 for (;;) { |
0 | 549 skip_spaces(&p); |
550 letter = *p; | |
551 if (letter == '\0') | |
552 break; | |
553 p++; | |
554 if (*p != '=') | |
555 goto next_line; | |
556 p++; | |
557 /* get the content */ | |
558 q = buf; | |
172 | 559 while (*p != '\n' && *p != '\r' && *p != '\0') { |
0 | 560 if ((q - buf) < sizeof(buf) - 1) |
561 *q++ = *p; | |
562 p++; | |
563 } | |
564 *q = '\0'; | |
565 sdp_parse_line(s, s1, letter, buf); | |
566 next_line: | |
567 while (*p != '\n' && *p != '\0') | |
568 p++; | |
569 if (*p == '\n') | |
570 p++; | |
571 } | |
572 return 0; | |
573 } | |
574 | |
5365
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
575 /* close and free RTSP streams */ |
5697 | 576 void ff_rtsp_close_streams(AVFormatContext *s) |
5365
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
577 { |
5677
545f70d48943
Make rtsp_close_streams() take a AVFormatContext instead of a RTSPState
rbultje
parents:
5670
diff
changeset
|
578 RTSPState *rt = s->priv_data; |
5365
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
579 int i; |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
580 RTSPStream *rtsp_st; |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
581 |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
582 for (i = 0; i < rt->nb_rtsp_streams; i++) { |
5365
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
583 rtsp_st = rt->rtsp_streams[i]; |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
584 if (rtsp_st) { |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
585 if (rtsp_st->transport_priv) { |
5688
7024b420e1a8
Create AVFormatContext objects as private transport for output RTSP sessions
mstorsjo
parents:
5681
diff
changeset
|
586 if (s->oformat) { |
7024b420e1a8
Create AVFormatContext objects as private transport for output RTSP sessions
mstorsjo
parents:
5681
diff
changeset
|
587 AVFormatContext *rtpctx = rtsp_st->transport_priv; |
7024b420e1a8
Create AVFormatContext objects as private transport for output RTSP sessions
mstorsjo
parents:
5681
diff
changeset
|
588 av_write_trailer(rtpctx); |
5864
0ff0826b6c3d
Add support for TCP as lower transport in the RTSP muxer
mstorsjo
parents:
5862
diff
changeset
|
589 if (rt->lower_transport == RTSP_LOWER_TRANSPORT_TCP) { |
0ff0826b6c3d
Add support for TCP as lower transport in the RTSP muxer
mstorsjo
parents:
5862
diff
changeset
|
590 uint8_t *ptr; |
0ff0826b6c3d
Add support for TCP as lower transport in the RTSP muxer
mstorsjo
parents:
5862
diff
changeset
|
591 url_close_dyn_buf(rtpctx->pb, &ptr); |
0ff0826b6c3d
Add support for TCP as lower transport in the RTSP muxer
mstorsjo
parents:
5862
diff
changeset
|
592 av_free(ptr); |
0ff0826b6c3d
Add support for TCP as lower transport in the RTSP muxer
mstorsjo
parents:
5862
diff
changeset
|
593 } else { |
5865 | 594 url_fclose(rtpctx->pb); |
5864
0ff0826b6c3d
Add support for TCP as lower transport in the RTSP muxer
mstorsjo
parents:
5862
diff
changeset
|
595 } |
5694
70bd52594e2b
Free metadata in chained RTP muxers in the RTSP muxer
mstorsjo
parents:
5693
diff
changeset
|
596 av_metadata_free(&rtpctx->streams[0]->metadata); |
70bd52594e2b
Free metadata in chained RTP muxers in the RTSP muxer
mstorsjo
parents:
5693
diff
changeset
|
597 av_metadata_free(&rtpctx->metadata); |
5688
7024b420e1a8
Create AVFormatContext objects as private transport for output RTSP sessions
mstorsjo
parents:
5681
diff
changeset
|
598 av_free(rtpctx->streams[0]); |
7024b420e1a8
Create AVFormatContext objects as private transport for output RTSP sessions
mstorsjo
parents:
5681
diff
changeset
|
599 av_free(rtpctx); |
7024b420e1a8
Create AVFormatContext objects as private transport for output RTSP sessions
mstorsjo
parents:
5681
diff
changeset
|
600 } else if (rt->transport == RTSP_TRANSPORT_RDT) |
5365
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
601 ff_rdt_parse_close(rtsp_st->transport_priv); |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
602 else |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
603 rtp_parse_close(rtsp_st->transport_priv); |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
604 } |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
605 if (rtsp_st->rtp_handle) |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
606 url_close(rtsp_st->rtp_handle); |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
607 if (rtsp_st->dynamic_handler && rtsp_st->dynamic_protocol_context) |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
608 rtsp_st->dynamic_handler->close( |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
609 rtsp_st->dynamic_protocol_context); |
5365
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
610 } |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
611 } |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
612 av_free(rt->rtsp_streams); |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
613 if (rt->asf_ctx) { |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
614 av_close_input_stream (rt->asf_ctx); |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
615 rt->asf_ctx = NULL; |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
616 } |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
617 } |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
618 |
5820
b56e31849e0f
Cosmetics, break a long line, fix brace placement
mstorsjo
parents:
5819
diff
changeset
|
619 static void *rtsp_rtp_mux_open(AVFormatContext *s, AVStream *st, |
b56e31849e0f
Cosmetics, break a long line, fix brace placement
mstorsjo
parents:
5819
diff
changeset
|
620 URLContext *handle) |
b56e31849e0f
Cosmetics, break a long line, fix brace placement
mstorsjo
parents:
5819
diff
changeset
|
621 { |
5843
777a89fdb1c0
RTSP: Synchronize the start time of the chained RTP muxers
mstorsjo
parents:
5837
diff
changeset
|
622 RTSPState *rt = s->priv_data; |
5688
7024b420e1a8
Create AVFormatContext objects as private transport for output RTSP sessions
mstorsjo
parents:
5681
diff
changeset
|
623 AVFormatContext *rtpctx; |
7024b420e1a8
Create AVFormatContext objects as private transport for output RTSP sessions
mstorsjo
parents:
5681
diff
changeset
|
624 int ret; |
7024b420e1a8
Create AVFormatContext objects as private transport for output RTSP sessions
mstorsjo
parents:
5681
diff
changeset
|
625 AVOutputFormat *rtp_format = av_guess_format("rtp", NULL, NULL); |
7024b420e1a8
Create AVFormatContext objects as private transport for output RTSP sessions
mstorsjo
parents:
5681
diff
changeset
|
626 |
7024b420e1a8
Create AVFormatContext objects as private transport for output RTSP sessions
mstorsjo
parents:
5681
diff
changeset
|
627 if (!rtp_format) |
7024b420e1a8
Create AVFormatContext objects as private transport for output RTSP sessions
mstorsjo
parents:
5681
diff
changeset
|
628 return NULL; |
7024b420e1a8
Create AVFormatContext objects as private transport for output RTSP sessions
mstorsjo
parents:
5681
diff
changeset
|
629 |
7024b420e1a8
Create AVFormatContext objects as private transport for output RTSP sessions
mstorsjo
parents:
5681
diff
changeset
|
630 /* Allocate an AVFormatContext for each output stream */ |
7024b420e1a8
Create AVFormatContext objects as private transport for output RTSP sessions
mstorsjo
parents:
5681
diff
changeset
|
631 rtpctx = avformat_alloc_context(); |
7024b420e1a8
Create AVFormatContext objects as private transport for output RTSP sessions
mstorsjo
parents:
5681
diff
changeset
|
632 if (!rtpctx) |
7024b420e1a8
Create AVFormatContext objects as private transport for output RTSP sessions
mstorsjo
parents:
5681
diff
changeset
|
633 return NULL; |
7024b420e1a8
Create AVFormatContext objects as private transport for output RTSP sessions
mstorsjo
parents:
5681
diff
changeset
|
634 |
7024b420e1a8
Create AVFormatContext objects as private transport for output RTSP sessions
mstorsjo
parents:
5681
diff
changeset
|
635 rtpctx->oformat = rtp_format; |
7024b420e1a8
Create AVFormatContext objects as private transport for output RTSP sessions
mstorsjo
parents:
5681
diff
changeset
|
636 if (!av_new_stream(rtpctx, 0)) { |
7024b420e1a8
Create AVFormatContext objects as private transport for output RTSP sessions
mstorsjo
parents:
5681
diff
changeset
|
637 av_free(rtpctx); |
7024b420e1a8
Create AVFormatContext objects as private transport for output RTSP sessions
mstorsjo
parents:
5681
diff
changeset
|
638 return NULL; |
7024b420e1a8
Create AVFormatContext objects as private transport for output RTSP sessions
mstorsjo
parents:
5681
diff
changeset
|
639 } |
7024b420e1a8
Create AVFormatContext objects as private transport for output RTSP sessions
mstorsjo
parents:
5681
diff
changeset
|
640 /* Copy the max delay setting; the rtp muxer reads this. */ |
7024b420e1a8
Create AVFormatContext objects as private transport for output RTSP sessions
mstorsjo
parents:
5681
diff
changeset
|
641 rtpctx->max_delay = s->max_delay; |
7024b420e1a8
Create AVFormatContext objects as private transport for output RTSP sessions
mstorsjo
parents:
5681
diff
changeset
|
642 /* Copy other stream parameters. */ |
7024b420e1a8
Create AVFormatContext objects as private transport for output RTSP sessions
mstorsjo
parents:
5681
diff
changeset
|
643 rtpctx->streams[0]->sample_aspect_ratio = st->sample_aspect_ratio; |
7024b420e1a8
Create AVFormatContext objects as private transport for output RTSP sessions
mstorsjo
parents:
5681
diff
changeset
|
644 |
5843
777a89fdb1c0
RTSP: Synchronize the start time of the chained RTP muxers
mstorsjo
parents:
5837
diff
changeset
|
645 /* Set the synchronized start time. */ |
777a89fdb1c0
RTSP: Synchronize the start time of the chained RTP muxers
mstorsjo
parents:
5837
diff
changeset
|
646 rtpctx->start_time_realtime = rt->start_time; |
777a89fdb1c0
RTSP: Synchronize the start time of the chained RTP muxers
mstorsjo
parents:
5837
diff
changeset
|
647 |
5688
7024b420e1a8
Create AVFormatContext objects as private transport for output RTSP sessions
mstorsjo
parents:
5681
diff
changeset
|
648 /* Remove the local codec, link to the original codec |
7024b420e1a8
Create AVFormatContext objects as private transport for output RTSP sessions
mstorsjo
parents:
5681
diff
changeset
|
649 * context instead, to give the rtp muxer access to |
7024b420e1a8
Create AVFormatContext objects as private transport for output RTSP sessions
mstorsjo
parents:
5681
diff
changeset
|
650 * codec parameters. */ |
7024b420e1a8
Create AVFormatContext objects as private transport for output RTSP sessions
mstorsjo
parents:
5681
diff
changeset
|
651 av_free(rtpctx->streams[0]->codec); |
7024b420e1a8
Create AVFormatContext objects as private transport for output RTSP sessions
mstorsjo
parents:
5681
diff
changeset
|
652 rtpctx->streams[0]->codec = st->codec; |
7024b420e1a8
Create AVFormatContext objects as private transport for output RTSP sessions
mstorsjo
parents:
5681
diff
changeset
|
653 |
5864
0ff0826b6c3d
Add support for TCP as lower transport in the RTSP muxer
mstorsjo
parents:
5862
diff
changeset
|
654 if (handle) { |
5865 | 655 url_fdopen(&rtpctx->pb, handle); |
5864
0ff0826b6c3d
Add support for TCP as lower transport in the RTSP muxer
mstorsjo
parents:
5862
diff
changeset
|
656 } else |
0ff0826b6c3d
Add support for TCP as lower transport in the RTSP muxer
mstorsjo
parents:
5862
diff
changeset
|
657 url_open_dyn_packet_buf(&rtpctx->pb, RTSP_TCP_MAX_PACKET_SIZE); |
5688
7024b420e1a8
Create AVFormatContext objects as private transport for output RTSP sessions
mstorsjo
parents:
5681
diff
changeset
|
658 ret = av_write_header(rtpctx); |
7024b420e1a8
Create AVFormatContext objects as private transport for output RTSP sessions
mstorsjo
parents:
5681
diff
changeset
|
659 |
7024b420e1a8
Create AVFormatContext objects as private transport for output RTSP sessions
mstorsjo
parents:
5681
diff
changeset
|
660 if (ret) { |
5864
0ff0826b6c3d
Add support for TCP as lower transport in the RTSP muxer
mstorsjo
parents:
5862
diff
changeset
|
661 if (handle) { |
5865 | 662 url_fclose(rtpctx->pb); |
5864
0ff0826b6c3d
Add support for TCP as lower transport in the RTSP muxer
mstorsjo
parents:
5862
diff
changeset
|
663 } else { |
0ff0826b6c3d
Add support for TCP as lower transport in the RTSP muxer
mstorsjo
parents:
5862
diff
changeset
|
664 uint8_t *ptr; |
0ff0826b6c3d
Add support for TCP as lower transport in the RTSP muxer
mstorsjo
parents:
5862
diff
changeset
|
665 url_close_dyn_buf(rtpctx->pb, &ptr); |
0ff0826b6c3d
Add support for TCP as lower transport in the RTSP muxer
mstorsjo
parents:
5862
diff
changeset
|
666 av_free(ptr); |
0ff0826b6c3d
Add support for TCP as lower transport in the RTSP muxer
mstorsjo
parents:
5862
diff
changeset
|
667 } |
5688
7024b420e1a8
Create AVFormatContext objects as private transport for output RTSP sessions
mstorsjo
parents:
5681
diff
changeset
|
668 av_free(rtpctx->streams[0]); |
7024b420e1a8
Create AVFormatContext objects as private transport for output RTSP sessions
mstorsjo
parents:
5681
diff
changeset
|
669 av_free(rtpctx); |
7024b420e1a8
Create AVFormatContext objects as private transport for output RTSP sessions
mstorsjo
parents:
5681
diff
changeset
|
670 return NULL; |
7024b420e1a8
Create AVFormatContext objects as private transport for output RTSP sessions
mstorsjo
parents:
5681
diff
changeset
|
671 } |
7024b420e1a8
Create AVFormatContext objects as private transport for output RTSP sessions
mstorsjo
parents:
5681
diff
changeset
|
672 |
7024b420e1a8
Create AVFormatContext objects as private transport for output RTSP sessions
mstorsjo
parents:
5681
diff
changeset
|
673 /* Copy the RTP AVStream timebase back to the original AVStream */ |
7024b420e1a8
Create AVFormatContext objects as private transport for output RTSP sessions
mstorsjo
parents:
5681
diff
changeset
|
674 st->time_base = rtpctx->streams[0]->time_base; |
7024b420e1a8
Create AVFormatContext objects as private transport for output RTSP sessions
mstorsjo
parents:
5681
diff
changeset
|
675 return rtpctx; |
7024b420e1a8
Create AVFormatContext objects as private transport for output RTSP sessions
mstorsjo
parents:
5681
diff
changeset
|
676 } |
7024b420e1a8
Create AVFormatContext objects as private transport for output RTSP sessions
mstorsjo
parents:
5681
diff
changeset
|
677 |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
678 static int rtsp_open_transport_ctx(AVFormatContext *s, RTSPStream *rtsp_st) |
5365
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
679 { |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
680 RTSPState *rt = s->priv_data; |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
681 AVStream *st = NULL; |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
682 |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
683 /* open the RTP context */ |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
684 if (rtsp_st->stream_index >= 0) |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
685 st = s->streams[rtsp_st->stream_index]; |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
686 if (!st) |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
687 s->ctx_flags |= AVFMTCTX_NOHEADER; |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
688 |
5688
7024b420e1a8
Create AVFormatContext objects as private transport for output RTSP sessions
mstorsjo
parents:
5681
diff
changeset
|
689 if (s->oformat) { |
7024b420e1a8
Create AVFormatContext objects as private transport for output RTSP sessions
mstorsjo
parents:
5681
diff
changeset
|
690 rtsp_st->transport_priv = rtsp_rtp_mux_open(s, st, rtsp_st->rtp_handle); |
5906 | 691 /* Ownership of rtp_handle is passed to the rtp mux context */ |
5688
7024b420e1a8
Create AVFormatContext objects as private transport for output RTSP sessions
mstorsjo
parents:
5681
diff
changeset
|
692 rtsp_st->rtp_handle = NULL; |
7024b420e1a8
Create AVFormatContext objects as private transport for output RTSP sessions
mstorsjo
parents:
5681
diff
changeset
|
693 } else if (rt->transport == RTSP_TRANSPORT_RDT) |
5365
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
694 rtsp_st->transport_priv = ff_rdt_parse_open(s, st->index, |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
695 rtsp_st->dynamic_protocol_context, |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
696 rtsp_st->dynamic_handler); |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
697 else |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
698 rtsp_st->transport_priv = rtp_parse_open(s, st, rtsp_st->rtp_handle, |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
699 rtsp_st->sdp_payload_type, |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
700 &rtsp_st->rtp_payload_data); |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
701 |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
702 if (!rtsp_st->transport_priv) { |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
703 return AVERROR(ENOMEM); |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
704 } else if (rt->transport != RTSP_TRANSPORT_RDT) { |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
705 if (rtsp_st->dynamic_handler) { |
5365
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
706 rtp_parse_set_dynamic_protocol(rtsp_st->transport_priv, |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
707 rtsp_st->dynamic_protocol_context, |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
708 rtsp_st->dynamic_handler); |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
709 } |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
710 } |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
711 |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
712 return 0; |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
713 } |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
714 |
5695 | 715 #if CONFIG_RTSP_DEMUXER || CONFIG_RTSP_MUXER |
5365
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
716 static int rtsp_probe(AVProbeData *p) |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
717 { |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
718 if (av_strstart(p->filename, "rtsp:", NULL)) |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
719 return AVPROBE_SCORE_MAX; |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
720 return 0; |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
721 } |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
722 |
0 | 723 static void rtsp_parse_range(int *min_ptr, int *max_ptr, const char **pp) |
724 { | |
725 const char *p; | |
726 int v; | |
727 | |
728 p = *pp; | |
729 skip_spaces(&p); | |
730 v = strtol(p, (char **)&p, 10); | |
731 if (*p == '-') { | |
732 p++; | |
733 *min_ptr = v; | |
734 v = strtol(p, (char **)&p, 10); | |
735 *max_ptr = v; | |
736 } else { | |
737 *min_ptr = v; | |
738 *max_ptr = v; | |
739 } | |
740 *pp = p; | |
741 } | |
742 | |
743 /* XXX: only one transport specification is parsed */ | |
4557
bfe6fb676d46
Rename RTSPHeader to RTSPMessageHeader to reflect more clearly what the
rbultje
parents:
4549
diff
changeset
|
744 static void rtsp_parse_transport(RTSPMessageHeader *reply, const char *p) |
0 | 745 { |
746 char transport_protocol[16]; | |
747 char profile[16]; | |
748 char lower_transport[16]; | |
749 char parameter[16]; | |
750 RTSPTransportField *th; | |
751 char buf[256]; | |
885 | 752 |
0 | 753 reply->nb_transports = 0; |
885 | 754 |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
755 for (;;) { |
0 | 756 skip_spaces(&p); |
757 if (*p == '\0') | |
758 break; | |
759 | |
760 th = &reply->transports[reply->nb_transports]; | |
761 | |
885 | 762 get_word_sep(transport_protocol, sizeof(transport_protocol), |
0 | 763 "/", &p); |
2865
51aa1054528c
Real RTSP support, from Ronald S. Bultje rsbultje gmail - part 2 x-pn-tng support
lu_zero
parents:
2864
diff
changeset
|
764 if (!strcasecmp (transport_protocol, "rtp")) { |
2866
ccbca87ccd5e
Real RTSP support, from Ronald S. Bultje rsbultje gmail - part 3 Reindent
lu_zero
parents:
2865
diff
changeset
|
765 get_word_sep(profile, sizeof(profile), "/;,", &p); |
ccbca87ccd5e
Real RTSP support, from Ronald S. Bultje rsbultje gmail - part 3 Reindent
lu_zero
parents:
2865
diff
changeset
|
766 lower_transport[0] = '\0'; |
ccbca87ccd5e
Real RTSP support, from Ronald S. Bultje rsbultje gmail - part 3 Reindent
lu_zero
parents:
2865
diff
changeset
|
767 /* rtp/avp/<protocol> */ |
ccbca87ccd5e
Real RTSP support, from Ronald S. Bultje rsbultje gmail - part 3 Reindent
lu_zero
parents:
2865
diff
changeset
|
768 if (*p == '/') { |
ccbca87ccd5e
Real RTSP support, from Ronald S. Bultje rsbultje gmail - part 3 Reindent
lu_zero
parents:
2865
diff
changeset
|
769 get_word_sep(lower_transport, sizeof(lower_transport), |
ccbca87ccd5e
Real RTSP support, from Ronald S. Bultje rsbultje gmail - part 3 Reindent
lu_zero
parents:
2865
diff
changeset
|
770 ";,", &p); |
3960
13e9b0d3a314
Implement a RTSPTransport field, which allows proper separation of server
rbultje
parents:
3959
diff
changeset
|
771 } |
13e9b0d3a314
Implement a RTSPTransport field, which allows proper separation of server
rbultje
parents:
3959
diff
changeset
|
772 th->transport = RTSP_TRANSPORT_RTP; |
13e9b0d3a314
Implement a RTSPTransport field, which allows proper separation of server
rbultje
parents:
3959
diff
changeset
|
773 } else if (!strcasecmp (transport_protocol, "x-pn-tng") || |
13e9b0d3a314
Implement a RTSPTransport field, which allows proper separation of server
rbultje
parents:
3959
diff
changeset
|
774 !strcasecmp (transport_protocol, "x-real-rdt")) { |
2866
ccbca87ccd5e
Real RTSP support, from Ronald S. Bultje rsbultje gmail - part 3 Reindent
lu_zero
parents:
2865
diff
changeset
|
775 /* x-pn-tng/<protocol> */ |
2865
51aa1054528c
Real RTSP support, from Ronald S. Bultje rsbultje gmail - part 2 x-pn-tng support
lu_zero
parents:
2864
diff
changeset
|
776 get_word_sep(lower_transport, sizeof(lower_transport), "/;,", &p); |
51aa1054528c
Real RTSP support, from Ronald S. Bultje rsbultje gmail - part 2 x-pn-tng support
lu_zero
parents:
2864
diff
changeset
|
777 profile[0] = '\0'; |
3960
13e9b0d3a314
Implement a RTSPTransport field, which allows proper separation of server
rbultje
parents:
3959
diff
changeset
|
778 th->transport = RTSP_TRANSPORT_RDT; |
0 | 779 } |
172 | 780 if (!strcasecmp(lower_transport, "TCP")) |
3957
9f943bb755f9
Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us
rbultje
parents:
3941
diff
changeset
|
781 th->lower_transport = RTSP_LOWER_TRANSPORT_TCP; |
0 | 782 else |
3957
9f943bb755f9
Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us
rbultje
parents:
3941
diff
changeset
|
783 th->lower_transport = RTSP_LOWER_TRANSPORT_UDP; |
885 | 784 |
0 | 785 if (*p == ';') |
786 p++; | |
787 /* get each parameter */ | |
788 while (*p != '\0' && *p != ',') { | |
789 get_word_sep(parameter, sizeof(parameter), "=;,", &p); | |
790 if (!strcmp(parameter, "port")) { | |
791 if (*p == '=') { | |
792 p++; | |
793 rtsp_parse_range(&th->port_min, &th->port_max, &p); | |
794 } | |
795 } else if (!strcmp(parameter, "client_port")) { | |
796 if (*p == '=') { | |
797 p++; | |
885 | 798 rtsp_parse_range(&th->client_port_min, |
0 | 799 &th->client_port_max, &p); |
800 } | |
801 } else if (!strcmp(parameter, "server_port")) { | |
802 if (*p == '=') { | |
803 p++; | |
885 | 804 rtsp_parse_range(&th->server_port_min, |
0 | 805 &th->server_port_max, &p); |
806 } | |
807 } else if (!strcmp(parameter, "interleaved")) { | |
808 if (*p == '=') { | |
809 p++; | |
885 | 810 rtsp_parse_range(&th->interleaved_min, |
0 | 811 &th->interleaved_max, &p); |
812 } | |
813 } else if (!strcmp(parameter, "multicast")) { | |
3957
9f943bb755f9
Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us
rbultje
parents:
3941
diff
changeset
|
814 if (th->lower_transport == RTSP_LOWER_TRANSPORT_UDP) |
9f943bb755f9
Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us
rbultje
parents:
3941
diff
changeset
|
815 th->lower_transport = RTSP_LOWER_TRANSPORT_UDP_MULTICAST; |
0 | 816 } else if (!strcmp(parameter, "ttl")) { |
817 if (*p == '=') { | |
818 p++; | |
819 th->ttl = strtol(p, (char **)&p, 10); | |
820 } | |
821 } else if (!strcmp(parameter, "destination")) { | |
822 struct in_addr ipaddr; | |
823 | |
824 if (*p == '=') { | |
825 p++; | |
826 get_word_sep(buf, sizeof(buf), ";,", &p); | |
5766
a292ef47e2f9
Localize the #define _SVID_SOURCE needed for inet_aton() to os_support.c
conrad
parents:
5756
diff
changeset
|
827 if (ff_inet_aton(buf, &ipaddr)) |
0 | 828 th->destination = ntohl(ipaddr.s_addr); |
829 } | |
830 } | |
831 while (*p != ';' && *p != '\0' && *p != ',') | |
832 p++; | |
833 if (*p == ';') | |
834 p++; | |
835 } | |
836 if (*p == ',') | |
837 p++; | |
838 | |
839 reply->nb_transports++; | |
840 } | |
841 } | |
842 | |
5890 | 843 void ff_rtsp_parse_line(RTSPMessageHeader *reply, const char *buf, |
844 HTTPAuthState *auth_state) | |
0 | 845 { |
846 const char *p; | |
847 | |
848 /* NOTE: we do case independent match for broken servers */ | |
849 p = buf; | |
2193
5ce5fad0dfac
replace the uses of old string functions that Reimar missed
mru
parents:
2189
diff
changeset
|
850 if (av_stristart(p, "Session:", &p)) { |
4877
940946a4569b
Send dummy requests over the TCP connection (WMS wants GET_PARAMETER,
rbultje
parents:
4875
diff
changeset
|
851 int t; |
0 | 852 get_word_sep(reply->session_id, sizeof(reply->session_id), ";", &p); |
4877
940946a4569b
Send dummy requests over the TCP connection (WMS wants GET_PARAMETER,
rbultje
parents:
4875
diff
changeset
|
853 if (av_stristart(p, ";timeout=", &p) && |
940946a4569b
Send dummy requests over the TCP connection (WMS wants GET_PARAMETER,
rbultje
parents:
4875
diff
changeset
|
854 (t = strtol(p, NULL, 10)) > 0) { |
940946a4569b
Send dummy requests over the TCP connection (WMS wants GET_PARAMETER,
rbultje
parents:
4875
diff
changeset
|
855 reply->timeout = t; |
940946a4569b
Send dummy requests over the TCP connection (WMS wants GET_PARAMETER,
rbultje
parents:
4875
diff
changeset
|
856 } |
2193
5ce5fad0dfac
replace the uses of old string functions that Reimar missed
mru
parents:
2189
diff
changeset
|
857 } else if (av_stristart(p, "Content-Length:", &p)) { |
0 | 858 reply->content_length = strtol(p, NULL, 10); |
2193
5ce5fad0dfac
replace the uses of old string functions that Reimar missed
mru
parents:
2189
diff
changeset
|
859 } else if (av_stristart(p, "Transport:", &p)) { |
0 | 860 rtsp_parse_transport(reply, p); |
2193
5ce5fad0dfac
replace the uses of old string functions that Reimar missed
mru
parents:
2189
diff
changeset
|
861 } else if (av_stristart(p, "CSeq:", &p)) { |
0 | 862 reply->seq = strtol(p, NULL, 10); |
2193
5ce5fad0dfac
replace the uses of old string functions that Reimar missed
mru
parents:
2189
diff
changeset
|
863 } else if (av_stristart(p, "Range:", &p)) { |
1453
c0235bab9e92
Add support for getting duration of a RTP stream (for seeking in stream)
gpoirier
parents:
1431
diff
changeset
|
864 rtsp_parse_range_npt(p, &reply->range_start, &reply->range_end); |
3855 | 865 } else if (av_stristart(p, "RealChallenge1:", &p)) { |
866 skip_spaces(&p); | |
867 av_strlcpy(reply->real_challenge, p, sizeof(reply->real_challenge)); | |
4169
619845a9bab3
Use the "server" RTSP field to detect whether the server that we're talking
rbultje
parents:
4168
diff
changeset
|
868 } else if (av_stristart(p, "Server:", &p)) { |
619845a9bab3
Use the "server" RTSP field to detect whether the server that we're talking
rbultje
parents:
4168
diff
changeset
|
869 skip_spaces(&p); |
619845a9bab3
Use the "server" RTSP field to detect whether the server that we're talking
rbultje
parents:
4168
diff
changeset
|
870 av_strlcpy(reply->server, p, sizeof(reply->server)); |
5112
85e0a9761818
Implement support for EOS as used by WMS and other RTSP servers that do not
rbultje
parents:
5013
diff
changeset
|
871 } else if (av_stristart(p, "Notice:", &p) || |
85e0a9761818
Implement support for EOS as used by WMS and other RTSP servers that do not
rbultje
parents:
5013
diff
changeset
|
872 av_stristart(p, "X-Notice:", &p)) { |
85e0a9761818
Implement support for EOS as used by WMS and other RTSP servers that do not
rbultje
parents:
5013
diff
changeset
|
873 reply->notice = strtol(p, NULL, 10); |
5333 | 874 } else if (av_stristart(p, "Location:", &p)) { |
875 skip_spaces(&p); | |
876 av_strlcpy(reply->location, p , sizeof(reply->location)); | |
5890 | 877 } else if (av_stristart(p, "WWW-Authenticate:", &p) && auth_state) { |
878 skip_spaces(&p); | |
879 ff_http_auth_handle_header(auth_state, "WWW-Authenticate", p); | |
880 } else if (av_stristart(p, "Authentication-Info:", &p) && auth_state) { | |
881 skip_spaces(&p); | |
882 ff_http_auth_handle_header(auth_state, "Authentication-Info", p); | |
0 | 883 } |
884 } | |
885 | |
179 | 886 /* skip a RTP/TCP interleaved packet */ |
5845 | 887 void ff_rtsp_skip_packet(AVFormatContext *s) |
179 | 888 { |
889 RTSPState *rt = s->priv_data; | |
890 int ret, len, len1; | |
891 uint8_t buf[1024]; | |
892 | |
5004
84a7b7a2f252
Move function for reading whole specified amount of data from RTSP
kostya
parents:
4990
diff
changeset
|
893 ret = url_read_complete(rt->rtsp_hd, buf, 3); |
179 | 894 if (ret != 3) |
895 return; | |
2222 | 896 len = AV_RB16(buf + 1); |
4990 | 897 |
898 dprintf(s, "skipping RTP packet len=%d\n", len); | |
899 | |
179 | 900 /* skip payload */ |
901 while (len > 0) { | |
902 len1 = len; | |
903 if (len1 > sizeof(buf)) | |
904 len1 = sizeof(buf); | |
5004
84a7b7a2f252
Move function for reading whole specified amount of data from RTSP
kostya
parents:
4990
diff
changeset
|
905 ret = url_read_complete(rt->rtsp_hd, buf, len1); |
179 | 906 if (ret != len1) |
907 return; | |
908 len -= len1; | |
909 } | |
910 } | |
0 | 911 |
5697 | 912 int ff_rtsp_read_reply(AVFormatContext *s, RTSPMessageHeader *reply, |
5700 | 913 unsigned char **content_ptr, |
914 int return_on_interleaved_data) | |
0 | 915 { |
916 RTSPState *rt = s->priv_data; | |
917 char buf[4096], buf1[1024], *q; | |
918 unsigned char ch; | |
919 const char *p; | |
4772
fb0b1e68356c
Allow (and parse) incoming server messages (notices) interleaved with TCP
rbultje
parents:
4745
diff
changeset
|
920 int ret, content_length, line_count = 0; |
0 | 921 unsigned char *content = NULL; |
922 | |
4549 | 923 memset(reply, 0, sizeof(*reply)); |
0 | 924 |
925 /* parse reply (XXX: use buffers) */ | |
926 rt->last_reply[0] = '\0'; | |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
927 for (;;) { |
0 | 928 q = buf; |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
929 for (;;) { |
5004
84a7b7a2f252
Move function for reading whole specified amount of data from RTSP
kostya
parents:
4990
diff
changeset
|
930 ret = url_read_complete(rt->rtsp_hd, &ch, 1); |
4772
fb0b1e68356c
Allow (and parse) incoming server messages (notices) interleaved with TCP
rbultje
parents:
4745
diff
changeset
|
931 #ifdef DEBUG_RTP_TCP |
4990 | 932 dprintf(s, "ret=%d c=%02x [%c]\n", ret, ch, ch); |
4772
fb0b1e68356c
Allow (and parse) incoming server messages (notices) interleaved with TCP
rbultje
parents:
4745
diff
changeset
|
933 #endif |
fb0b1e68356c
Allow (and parse) incoming server messages (notices) interleaved with TCP
rbultje
parents:
4745
diff
changeset
|
934 if (ret != 1) |
fb0b1e68356c
Allow (and parse) incoming server messages (notices) interleaved with TCP
rbultje
parents:
4745
diff
changeset
|
935 return -1; |
0 | 936 if (ch == '\n') |
937 break; | |
179 | 938 if (ch == '$') { |
939 /* XXX: only parse it if first char on line ? */ | |
4772
fb0b1e68356c
Allow (and parse) incoming server messages (notices) interleaved with TCP
rbultje
parents:
4745
diff
changeset
|
940 if (return_on_interleaved_data) { |
fb0b1e68356c
Allow (and parse) incoming server messages (notices) interleaved with TCP
rbultje
parents:
4745
diff
changeset
|
941 return 1; |
fb0b1e68356c
Allow (and parse) incoming server messages (notices) interleaved with TCP
rbultje
parents:
4745
diff
changeset
|
942 } else |
5845 | 943 ff_rtsp_skip_packet(s); |
179 | 944 } else if (ch != '\r') { |
0 | 945 if ((q - buf) < sizeof(buf) - 1) |
946 *q++ = ch; | |
947 } | |
948 } | |
949 *q = '\0'; | |
4990 | 950 |
951 dprintf(s, "line='%s'\n", buf); | |
952 | |
0 | 953 /* test if last line */ |
954 if (buf[0] == '\0') | |
955 break; | |
956 p = buf; | |
957 if (line_count == 0) { | |
958 /* get reply code */ | |
959 get_word(buf1, sizeof(buf1), &p); | |
960 get_word(buf1, sizeof(buf1), &p); | |
961 reply->status_code = atoi(buf1); | |
962 } else { | |
5890 | 963 ff_rtsp_parse_line(reply, p, &rt->auth_state); |
2189 | 964 av_strlcat(rt->last_reply, p, sizeof(rt->last_reply)); |
965 av_strlcat(rt->last_reply, "\n", sizeof(rt->last_reply)); | |
0 | 966 } |
967 line_count++; | |
968 } | |
885 | 969 |
0 | 970 if (rt->session_id[0] == '\0' && reply->session_id[0] != '\0') |
2189 | 971 av_strlcpy(rt->session_id, reply->session_id, sizeof(rt->session_id)); |
885 | 972 |
0 | 973 content_length = reply->content_length; |
974 if (content_length > 0) { | |
975 /* leave some room for a trailing '\0' (useful for simple parsing) */ | |
976 content = av_malloc(content_length + 1); | |
5004
84a7b7a2f252
Move function for reading whole specified amount of data from RTSP
kostya
parents:
4990
diff
changeset
|
977 (void)url_read_complete(rt->rtsp_hd, content, content_length); |
0 | 978 content[content_length] = '\0'; |
979 } | |
980 if (content_ptr) | |
981 *content_ptr = content; | |
2263 | 982 else |
983 av_free(content); | |
4772
fb0b1e68356c
Allow (and parse) incoming server messages (notices) interleaved with TCP
rbultje
parents:
4745
diff
changeset
|
984 |
5880
acbe14fa0c74
Issue a warning if the received CSeq isn't the expected one
lu_zero
parents:
5877
diff
changeset
|
985 if (rt->seq != reply->seq) { |
acbe14fa0c74
Issue a warning if the received CSeq isn't the expected one
lu_zero
parents:
5877
diff
changeset
|
986 av_log(s, AV_LOG_WARNING, "CSeq %d expected, %d received.\n", |
acbe14fa0c74
Issue a warning if the received CSeq isn't the expected one
lu_zero
parents:
5877
diff
changeset
|
987 rt->seq, reply->seq); |
acbe14fa0c74
Issue a warning if the received CSeq isn't the expected one
lu_zero
parents:
5877
diff
changeset
|
988 } |
acbe14fa0c74
Issue a warning if the received CSeq isn't the expected one
lu_zero
parents:
5877
diff
changeset
|
989 |
5112
85e0a9761818
Implement support for EOS as used by WMS and other RTSP servers that do not
rbultje
parents:
5013
diff
changeset
|
990 /* EOS */ |
85e0a9761818
Implement support for EOS as used by WMS and other RTSP servers that do not
rbultje
parents:
5013
diff
changeset
|
991 if (reply->notice == 2101 /* End-of-Stream Reached */ || |
85e0a9761818
Implement support for EOS as used by WMS and other RTSP servers that do not
rbultje
parents:
5013
diff
changeset
|
992 reply->notice == 2104 /* Start-of-Stream Reached */ || |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
993 reply->notice == 2306 /* Continuous Feed Terminated */) { |
5112
85e0a9761818
Implement support for EOS as used by WMS and other RTSP servers that do not
rbultje
parents:
5013
diff
changeset
|
994 rt->state = RTSP_STATE_IDLE; |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
995 } else if (reply->notice >= 4400 && reply->notice < 5500) { |
5112
85e0a9761818
Implement support for EOS as used by WMS and other RTSP servers that do not
rbultje
parents:
5013
diff
changeset
|
996 return AVERROR(EIO); /* data or server error */ |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
997 } else if (reply->notice == 2401 /* Ticket Expired */ || |
5112
85e0a9761818
Implement support for EOS as used by WMS and other RTSP servers that do not
rbultje
parents:
5013
diff
changeset
|
998 (reply->notice >= 5500 && reply->notice < 5600) /* end of term */ ) |
85e0a9761818
Implement support for EOS as used by WMS and other RTSP servers that do not
rbultje
parents:
5013
diff
changeset
|
999 return AVERROR(EPERM); |
85e0a9761818
Implement support for EOS as used by WMS and other RTSP servers that do not
rbultje
parents:
5013
diff
changeset
|
1000 |
4772
fb0b1e68356c
Allow (and parse) incoming server messages (notices) interleaved with TCP
rbultje
parents:
4745
diff
changeset
|
1001 return 0; |
0 | 1002 } |
1003 | |
5697 | 1004 void ff_rtsp_send_cmd_with_content_async(AVFormatContext *s, |
5888
4ddbc14bc768
Add separate method/url parameters to the rtsp_send_cmd functions
mstorsjo
parents:
5887
diff
changeset
|
1005 const char *method, const char *url, |
4ddbc14bc768
Add separate method/url parameters to the rtsp_send_cmd functions
mstorsjo
parents:
5887
diff
changeset
|
1006 const char *headers, |
5700 | 1007 const unsigned char *send_content, |
1008 int send_content_length) | |
4644
2962d395431b
Split rtsp_send_cmd() into two functions, one for the actual sending of the
rbultje
parents:
4641
diff
changeset
|
1009 { |
2962d395431b
Split rtsp_send_cmd() into two functions, one for the actual sending of the
rbultje
parents:
4641
diff
changeset
|
1010 RTSPState *rt = s->priv_data; |
5893
046e46b938d5
Simplify ff_rtsp_send_cmd_with_content_async, remove an unnecessary buffer
mstorsjo
parents:
5891
diff
changeset
|
1011 char buf[4096]; |
4644
2962d395431b
Split rtsp_send_cmd() into two functions, one for the actual sending of the
rbultje
parents:
4641
diff
changeset
|
1012 |
2962d395431b
Split rtsp_send_cmd() into two functions, one for the actual sending of the
rbultje
parents:
4641
diff
changeset
|
1013 rt->seq++; |
5888
4ddbc14bc768
Add separate method/url parameters to the rtsp_send_cmd functions
mstorsjo
parents:
5887
diff
changeset
|
1014 snprintf(buf, sizeof(buf), "%s %s RTSP/1.0\r\n", method, url); |
4ddbc14bc768
Add separate method/url parameters to the rtsp_send_cmd functions
mstorsjo
parents:
5887
diff
changeset
|
1015 if (headers) |
4ddbc14bc768
Add separate method/url parameters to the rtsp_send_cmd functions
mstorsjo
parents:
5887
diff
changeset
|
1016 av_strlcat(buf, headers, sizeof(buf)); |
5893
046e46b938d5
Simplify ff_rtsp_send_cmd_with_content_async, remove an unnecessary buffer
mstorsjo
parents:
5891
diff
changeset
|
1017 av_strlcatf(buf, sizeof(buf), "CSeq: %d\r\n", rt->seq); |
5888
4ddbc14bc768
Add separate method/url parameters to the rtsp_send_cmd functions
mstorsjo
parents:
5887
diff
changeset
|
1018 if (rt->session_id[0] != '\0' && (!headers || |
4ddbc14bc768
Add separate method/url parameters to the rtsp_send_cmd functions
mstorsjo
parents:
5887
diff
changeset
|
1019 !strstr(headers, "\nIf-Match:"))) { |
5893
046e46b938d5
Simplify ff_rtsp_send_cmd_with_content_async, remove an unnecessary buffer
mstorsjo
parents:
5891
diff
changeset
|
1020 av_strlcatf(buf, sizeof(buf), "Session: %s\r\n", rt->session_id); |
4644
2962d395431b
Split rtsp_send_cmd() into two functions, one for the actual sending of the
rbultje
parents:
4641
diff
changeset
|
1021 } |
5889
4b42835727aa
Make RTSP use the generic http authentication code
mstorsjo
parents:
5888
diff
changeset
|
1022 if (rt->auth[0]) { |
4b42835727aa
Make RTSP use the generic http authentication code
mstorsjo
parents:
5888
diff
changeset
|
1023 char *str = ff_http_auth_create_response(&rt->auth_state, |
4b42835727aa
Make RTSP use the generic http authentication code
mstorsjo
parents:
5888
diff
changeset
|
1024 rt->auth, url, method); |
4b42835727aa
Make RTSP use the generic http authentication code
mstorsjo
parents:
5888
diff
changeset
|
1025 if (str) |
4b42835727aa
Make RTSP use the generic http authentication code
mstorsjo
parents:
5888
diff
changeset
|
1026 av_strlcat(buf, str, sizeof(buf)); |
4b42835727aa
Make RTSP use the generic http authentication code
mstorsjo
parents:
5888
diff
changeset
|
1027 av_free(str); |
4b42835727aa
Make RTSP use the generic http authentication code
mstorsjo
parents:
5888
diff
changeset
|
1028 } |
5667
9b2e63adc0fa
Add functions to send RTSP commands with content attached to them. This will
rbultje
parents:
5665
diff
changeset
|
1029 if (send_content_length > 0 && send_content) |
9b2e63adc0fa
Add functions to send RTSP commands with content attached to them. This will
rbultje
parents:
5665
diff
changeset
|
1030 av_strlcatf(buf, sizeof(buf), "Content-Length: %d\r\n", send_content_length); |
4644
2962d395431b
Split rtsp_send_cmd() into two functions, one for the actual sending of the
rbultje
parents:
4641
diff
changeset
|
1031 av_strlcat(buf, "\r\n", sizeof(buf)); |
4990 | 1032 |
1033 dprintf(s, "Sending:\n%s--\n", buf); | |
1034 | |
4644
2962d395431b
Split rtsp_send_cmd() into two functions, one for the actual sending of the
rbultje
parents:
4641
diff
changeset
|
1035 url_write(rt->rtsp_hd, buf, strlen(buf)); |
5667
9b2e63adc0fa
Add functions to send RTSP commands with content attached to them. This will
rbultje
parents:
5665
diff
changeset
|
1036 if (send_content_length > 0 && send_content) |
9b2e63adc0fa
Add functions to send RTSP commands with content attached to them. This will
rbultje
parents:
5665
diff
changeset
|
1037 url_write(rt->rtsp_hd, send_content, send_content_length); |
4877
940946a4569b
Send dummy requests over the TCP connection (WMS wants GET_PARAMETER,
rbultje
parents:
4875
diff
changeset
|
1038 rt->last_cmd_time = av_gettime(); |
940946a4569b
Send dummy requests over the TCP connection (WMS wants GET_PARAMETER,
rbultje
parents:
4875
diff
changeset
|
1039 } |
940946a4569b
Send dummy requests over the TCP connection (WMS wants GET_PARAMETER,
rbultje
parents:
4875
diff
changeset
|
1040 |
5888
4ddbc14bc768
Add separate method/url parameters to the rtsp_send_cmd functions
mstorsjo
parents:
5887
diff
changeset
|
1041 void ff_rtsp_send_cmd_async(AVFormatContext *s, const char *method, |
4ddbc14bc768
Add separate method/url parameters to the rtsp_send_cmd functions
mstorsjo
parents:
5887
diff
changeset
|
1042 const char *url, const char *headers) |
5667
9b2e63adc0fa
Add functions to send RTSP commands with content attached to them. This will
rbultje
parents:
5665
diff
changeset
|
1043 { |
5888
4ddbc14bc768
Add separate method/url parameters to the rtsp_send_cmd functions
mstorsjo
parents:
5887
diff
changeset
|
1044 ff_rtsp_send_cmd_with_content_async(s, method, url, headers, NULL, 0); |
5667
9b2e63adc0fa
Add functions to send RTSP commands with content attached to them. This will
rbultje
parents:
5665
diff
changeset
|
1045 } |
9b2e63adc0fa
Add functions to send RTSP commands with content attached to them. This will
rbultje
parents:
5665
diff
changeset
|
1046 |
5888
4ddbc14bc768
Add separate method/url parameters to the rtsp_send_cmd functions
mstorsjo
parents:
5887
diff
changeset
|
1047 void ff_rtsp_send_cmd(AVFormatContext *s, const char *method, const char *url, |
4ddbc14bc768
Add separate method/url parameters to the rtsp_send_cmd functions
mstorsjo
parents:
5887
diff
changeset
|
1048 const char *headers, RTSPMessageHeader *reply, |
5700 | 1049 unsigned char **content_ptr) |
4877
940946a4569b
Send dummy requests over the TCP connection (WMS wants GET_PARAMETER,
rbultje
parents:
4875
diff
changeset
|
1050 { |
5888
4ddbc14bc768
Add separate method/url parameters to the rtsp_send_cmd functions
mstorsjo
parents:
5887
diff
changeset
|
1051 ff_rtsp_send_cmd_with_content(s, method, url, headers, reply, |
4ddbc14bc768
Add separate method/url parameters to the rtsp_send_cmd functions
mstorsjo
parents:
5887
diff
changeset
|
1052 content_ptr, NULL, 0); |
4644
2962d395431b
Split rtsp_send_cmd() into two functions, one for the actual sending of the
rbultje
parents:
4641
diff
changeset
|
1053 } |
2962d395431b
Split rtsp_send_cmd() into two functions, one for the actual sending of the
rbultje
parents:
4641
diff
changeset
|
1054 |
5697 | 1055 void ff_rtsp_send_cmd_with_content(AVFormatContext *s, |
5888
4ddbc14bc768
Add separate method/url parameters to the rtsp_send_cmd functions
mstorsjo
parents:
5887
diff
changeset
|
1056 const char *method, const char *url, |
4ddbc14bc768
Add separate method/url parameters to the rtsp_send_cmd functions
mstorsjo
parents:
5887
diff
changeset
|
1057 const char *header, |
5887 | 1058 RTSPMessageHeader *reply, |
1059 unsigned char **content_ptr, | |
1060 const unsigned char *send_content, | |
1061 int send_content_length) | |
5667
9b2e63adc0fa
Add functions to send RTSP commands with content attached to them. This will
rbultje
parents:
5665
diff
changeset
|
1062 { |
5891
59e4df62d614
Don't force basic auth in RTSP, but retry with the server-specified method on failure
mstorsjo
parents:
5890
diff
changeset
|
1063 RTSPState *rt = s->priv_data; |
59e4df62d614
Don't force basic auth in RTSP, but retry with the server-specified method on failure
mstorsjo
parents:
5890
diff
changeset
|
1064 HTTPAuthType cur_auth_type; |
59e4df62d614
Don't force basic auth in RTSP, but retry with the server-specified method on failure
mstorsjo
parents:
5890
diff
changeset
|
1065 |
59e4df62d614
Don't force basic auth in RTSP, but retry with the server-specified method on failure
mstorsjo
parents:
5890
diff
changeset
|
1066 retry: |
59e4df62d614
Don't force basic auth in RTSP, but retry with the server-specified method on failure
mstorsjo
parents:
5890
diff
changeset
|
1067 cur_auth_type = rt->auth_state.auth_type; |
5888
4ddbc14bc768
Add separate method/url parameters to the rtsp_send_cmd functions
mstorsjo
parents:
5887
diff
changeset
|
1068 ff_rtsp_send_cmd_with_content_async(s, method, url, header, |
4ddbc14bc768
Add separate method/url parameters to the rtsp_send_cmd functions
mstorsjo
parents:
5887
diff
changeset
|
1069 send_content, send_content_length); |
5667
9b2e63adc0fa
Add functions to send RTSP commands with content attached to them. This will
rbultje
parents:
5665
diff
changeset
|
1070 |
5697 | 1071 ff_rtsp_read_reply(s, reply, content_ptr, 0); |
5891
59e4df62d614
Don't force basic auth in RTSP, but retry with the server-specified method on failure
mstorsjo
parents:
5890
diff
changeset
|
1072 |
59e4df62d614
Don't force basic auth in RTSP, but retry with the server-specified method on failure
mstorsjo
parents:
5890
diff
changeset
|
1073 if (reply->status_code == 401 && cur_auth_type == HTTP_AUTH_NONE && |
59e4df62d614
Don't force basic auth in RTSP, but retry with the server-specified method on failure
mstorsjo
parents:
5890
diff
changeset
|
1074 rt->auth_state.auth_type != HTTP_AUTH_NONE) |
59e4df62d614
Don't force basic auth in RTSP, but retry with the server-specified method on failure
mstorsjo
parents:
5890
diff
changeset
|
1075 goto retry; |
5667
9b2e63adc0fa
Add functions to send RTSP commands with content attached to them. This will
rbultje
parents:
5665
diff
changeset
|
1076 } |
9b2e63adc0fa
Add functions to send RTSP commands with content attached to them. This will
rbultje
parents:
5665
diff
changeset
|
1077 |
3147
91d65fdf91e1
Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents:
2884
diff
changeset
|
1078 /** |
5909 | 1079 * @return 0 on success, <0 on error, 1 if protocol is unavailable. |
3147
91d65fdf91e1
Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents:
2884
diff
changeset
|
1080 */ |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1081 static int make_setup_request(AVFormatContext *s, const char *host, int port, |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1082 int lower_transport, const char *real_challenge) |
0 | 1083 { |
1084 RTSPState *rt = s->priv_data; | |
4638
801468f16243
Make RTSP-MS-over-UDP negotiation work. See "[PATCH] RTSP-MS 8/15: fix
rbultje
parents:
4637
diff
changeset
|
1085 int rtx, j, i, err, interleave = 0; |
0 | 1086 RTSPStream *rtsp_st; |
4557
bfe6fb676d46
Rename RTSPHeader to RTSPMessageHeader to reflect more clearly what the
rbultje
parents:
4549
diff
changeset
|
1087 RTSPMessageHeader reply1, *reply = &reply1; |
3147
91d65fdf91e1
Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents:
2884
diff
changeset
|
1088 char cmd[2048]; |
3876
1026953d4ffe
Implement Realmedia/RTSP-compatible SETUP command. This includes calculation
rbultje
parents:
3861
diff
changeset
|
1089 const char *trans_pref; |
1026953d4ffe
Implement Realmedia/RTSP-compatible SETUP command. This includes calculation
rbultje
parents:
3861
diff
changeset
|
1090 |
3960
13e9b0d3a314
Implement a RTSPTransport field, which allows proper separation of server
rbultje
parents:
3959
diff
changeset
|
1091 if (rt->transport == RTSP_TRANSPORT_RDT) |
3876
1026953d4ffe
Implement Realmedia/RTSP-compatible SETUP command. This includes calculation
rbultje
parents:
3861
diff
changeset
|
1092 trans_pref = "x-pn-tng"; |
1026953d4ffe
Implement Realmedia/RTSP-compatible SETUP command. This includes calculation
rbultje
parents:
3861
diff
changeset
|
1093 else |
1026953d4ffe
Implement Realmedia/RTSP-compatible SETUP command. This includes calculation
rbultje
parents:
3861
diff
changeset
|
1094 trans_pref = "RTP/AVP"; |
885 | 1095 |
4877
940946a4569b
Send dummy requests over the TCP connection (WMS wants GET_PARAMETER,
rbultje
parents:
4875
diff
changeset
|
1096 /* default timeout: 1 minute */ |
940946a4569b
Send dummy requests over the TCP connection (WMS wants GET_PARAMETER,
rbultje
parents:
4875
diff
changeset
|
1097 rt->timeout = 60; |
940946a4569b
Send dummy requests over the TCP connection (WMS wants GET_PARAMETER,
rbultje
parents:
4875
diff
changeset
|
1098 |
0 | 1099 /* for each stream, make the setup request */ |
1100 /* XXX: we assume the same server is used for the control of each | |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1101 * RTSP stream */ |
774 | 1102 |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1103 for (j = RTSP_RTP_PORT_MIN, i = 0; i < rt->nb_rtsp_streams; ++i) { |
0 | 1104 char transport[2048]; |
1105 | |
4638
801468f16243
Make RTSP-MS-over-UDP negotiation work. See "[PATCH] RTSP-MS 8/15: fix
rbultje
parents:
4637
diff
changeset
|
1106 /** |
801468f16243
Make RTSP-MS-over-UDP negotiation work. See "[PATCH] RTSP-MS 8/15: fix
rbultje
parents:
4637
diff
changeset
|
1107 * WMS serves all UDP data over a single connection, the RTX, which |
801468f16243
Make RTSP-MS-over-UDP negotiation work. See "[PATCH] RTSP-MS 8/15: fix
rbultje
parents:
4637
diff
changeset
|
1108 * isn't necessarily the first in the SDP but has to be the first |
801468f16243
Make RTSP-MS-over-UDP negotiation work. See "[PATCH] RTSP-MS 8/15: fix
rbultje
parents:
4637
diff
changeset
|
1109 * to be set up, else the second/third SETUP will fail with a 461. |
801468f16243
Make RTSP-MS-over-UDP negotiation work. See "[PATCH] RTSP-MS 8/15: fix
rbultje
parents:
4637
diff
changeset
|
1110 */ |
801468f16243
Make RTSP-MS-over-UDP negotiation work. See "[PATCH] RTSP-MS 8/15: fix
rbultje
parents:
4637
diff
changeset
|
1111 if (lower_transport == RTSP_LOWER_TRANSPORT_UDP && |
801468f16243
Make RTSP-MS-over-UDP negotiation work. See "[PATCH] RTSP-MS 8/15: fix
rbultje
parents:
4637
diff
changeset
|
1112 rt->server_type == RTSP_SERVER_WMS) { |
801468f16243
Make RTSP-MS-over-UDP negotiation work. See "[PATCH] RTSP-MS 8/15: fix
rbultje
parents:
4637
diff
changeset
|
1113 if (i == 0) { |
801468f16243
Make RTSP-MS-over-UDP negotiation work. See "[PATCH] RTSP-MS 8/15: fix
rbultje
parents:
4637
diff
changeset
|
1114 /* rtx first */ |
801468f16243
Make RTSP-MS-over-UDP negotiation work. See "[PATCH] RTSP-MS 8/15: fix
rbultje
parents:
4637
diff
changeset
|
1115 for (rtx = 0; rtx < rt->nb_rtsp_streams; rtx++) { |
801468f16243
Make RTSP-MS-over-UDP negotiation work. See "[PATCH] RTSP-MS 8/15: fix
rbultje
parents:
4637
diff
changeset
|
1116 int len = strlen(rt->rtsp_streams[rtx]->control_url); |
801468f16243
Make RTSP-MS-over-UDP negotiation work. See "[PATCH] RTSP-MS 8/15: fix
rbultje
parents:
4637
diff
changeset
|
1117 if (len >= 4 && |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1118 !strcmp(rt->rtsp_streams[rtx]->control_url + len - 4, |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1119 "/rtx")) |
4638
801468f16243
Make RTSP-MS-over-UDP negotiation work. See "[PATCH] RTSP-MS 8/15: fix
rbultje
parents:
4637
diff
changeset
|
1120 break; |
801468f16243
Make RTSP-MS-over-UDP negotiation work. See "[PATCH] RTSP-MS 8/15: fix
rbultje
parents:
4637
diff
changeset
|
1121 } |
801468f16243
Make RTSP-MS-over-UDP negotiation work. See "[PATCH] RTSP-MS 8/15: fix
rbultje
parents:
4637
diff
changeset
|
1122 if (rtx == rt->nb_rtsp_streams) |
801468f16243
Make RTSP-MS-over-UDP negotiation work. See "[PATCH] RTSP-MS 8/15: fix
rbultje
parents:
4637
diff
changeset
|
1123 return -1; /* no RTX found */ |
801468f16243
Make RTSP-MS-over-UDP negotiation work. See "[PATCH] RTSP-MS 8/15: fix
rbultje
parents:
4637
diff
changeset
|
1124 rtsp_st = rt->rtsp_streams[rtx]; |
801468f16243
Make RTSP-MS-over-UDP negotiation work. See "[PATCH] RTSP-MS 8/15: fix
rbultje
parents:
4637
diff
changeset
|
1125 } else |
801468f16243
Make RTSP-MS-over-UDP negotiation work. See "[PATCH] RTSP-MS 8/15: fix
rbultje
parents:
4637
diff
changeset
|
1126 rtsp_st = rt->rtsp_streams[i > rtx ? i : i - 1]; |
801468f16243
Make RTSP-MS-over-UDP negotiation work. See "[PATCH] RTSP-MS 8/15: fix
rbultje
parents:
4637
diff
changeset
|
1127 } else |
4639 | 1128 rtsp_st = rt->rtsp_streams[i]; |
0 | 1129 |
1130 /* RTP/UDP */ | |
3957
9f943bb755f9
Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us
rbultje
parents:
3941
diff
changeset
|
1131 if (lower_transport == RTSP_LOWER_TRANSPORT_UDP) { |
0 | 1132 char buf[256]; |
1133 | |
4638
801468f16243
Make RTSP-MS-over-UDP negotiation work. See "[PATCH] RTSP-MS 8/15: fix
rbultje
parents:
4637
diff
changeset
|
1134 if (rt->server_type == RTSP_SERVER_WMS && i > 1) { |
801468f16243
Make RTSP-MS-over-UDP negotiation work. See "[PATCH] RTSP-MS 8/15: fix
rbultje
parents:
4637
diff
changeset
|
1135 port = reply->transports[0].client_port_min; |
801468f16243
Make RTSP-MS-over-UDP negotiation work. See "[PATCH] RTSP-MS 8/15: fix
rbultje
parents:
4637
diff
changeset
|
1136 goto have_port; |
801468f16243
Make RTSP-MS-over-UDP negotiation work. See "[PATCH] RTSP-MS 8/15: fix
rbultje
parents:
4637
diff
changeset
|
1137 } |
801468f16243
Make RTSP-MS-over-UDP negotiation work. See "[PATCH] RTSP-MS 8/15: fix
rbultje
parents:
4637
diff
changeset
|
1138 |
0 | 1139 /* first try in specified port range */ |
774 | 1140 if (RTSP_RTP_PORT_MIN != 0) { |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1141 while (j <= RTSP_RTP_PORT_MAX) { |
5756
7c7fe75728dd
Use ff_url_join for assembling URLs, instead of snprintf
mstorsjo
parents:
5726
diff
changeset
|
1142 ff_url_join(buf, sizeof(buf), "rtp", NULL, host, -1, |
7c7fe75728dd
Use ff_url_join for assembling URLs, instead of snprintf
mstorsjo
parents:
5726
diff
changeset
|
1143 "?localport=%d", j); |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1144 /* we will use two ports per rtp stream (rtp and rtcp) */ |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1145 j += 2; |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1146 if (url_open(&rtsp_st->rtp_handle, buf, URL_RDWR) == 0) |
0 | 1147 goto rtp_opened; |
1148 } | |
1149 } | |
1150 | |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1151 #if 0 |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1152 /* then try on any port */ |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1153 if (url_open(&rtsp_st->rtp_handle, "rtp://", URL_RDONLY) < 0) { |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1154 err = AVERROR_INVALIDDATA; |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1155 goto fail; |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1156 } |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1157 #endif |
0 | 1158 |
1159 rtp_opened: | |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
229
diff
changeset
|
1160 port = rtp_get_local_port(rtsp_st->rtp_handle); |
4638
801468f16243
Make RTSP-MS-over-UDP negotiation work. See "[PATCH] RTSP-MS 8/15: fix
rbultje
parents:
4637
diff
changeset
|
1161 have_port: |
3877
3e0c7ad2a675
Remove unused code that used to handle protocol concatenation, i.e. trying
rbultje
parents:
3876
diff
changeset
|
1162 snprintf(transport, sizeof(transport) - 1, |
3958
ab2d2bc3a6e7
Send improper UDP SETUP request, which is what Realmedia servers expect.
rbultje
parents:
3957
diff
changeset
|
1163 "%s/UDP;", trans_pref); |
ab2d2bc3a6e7
Send improper UDP SETUP request, which is what Realmedia servers expect.
rbultje
parents:
3957
diff
changeset
|
1164 if (rt->server_type != RTSP_SERVER_REAL) |
ab2d2bc3a6e7
Send improper UDP SETUP request, which is what Realmedia servers expect.
rbultje
parents:
3957
diff
changeset
|
1165 av_strlcat(transport, "unicast;", sizeof(transport)); |
ab2d2bc3a6e7
Send improper UDP SETUP request, which is what Realmedia servers expect.
rbultje
parents:
3957
diff
changeset
|
1166 av_strlcatf(transport, sizeof(transport), |
ab2d2bc3a6e7
Send improper UDP SETUP request, which is what Realmedia servers expect.
rbultje
parents:
3957
diff
changeset
|
1167 "client_port=%d", port); |
4638
801468f16243
Make RTSP-MS-over-UDP negotiation work. See "[PATCH] RTSP-MS 8/15: fix
rbultje
parents:
4637
diff
changeset
|
1168 if (rt->transport == RTSP_TRANSPORT_RTP && |
801468f16243
Make RTSP-MS-over-UDP negotiation work. See "[PATCH] RTSP-MS 8/15: fix
rbultje
parents:
4637
diff
changeset
|
1169 !(rt->server_type == RTSP_SERVER_WMS && i > 0)) |
3876
1026953d4ffe
Implement Realmedia/RTSP-compatible SETUP command. This includes calculation
rbultje
parents:
3861
diff
changeset
|
1170 av_strlcatf(transport, sizeof(transport), "-%d", port + 1); |
0 | 1171 } |
1172 | |
1173 /* RTP/TCP */ | |
3957
9f943bb755f9
Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us
rbultje
parents:
3941
diff
changeset
|
1174 else if (lower_transport == RTSP_LOWER_TRANSPORT_TCP) { |
4637
eaf90db8cc42
Recognize the "application" data type, which is required for WMS/UDP
rbultje
parents:
4557
diff
changeset
|
1175 /** For WMS streams, the application streams are only used for |
eaf90db8cc42
Recognize the "application" data type, which is required for WMS/UDP
rbultje
parents:
4557
diff
changeset
|
1176 * UDP. When trying to set it up for TCP streams, the server |
eaf90db8cc42
Recognize the "application" data type, which is required for WMS/UDP
rbultje
parents:
4557
diff
changeset
|
1177 * will return an error. Therefore, we skip those streams. */ |
eaf90db8cc42
Recognize the "application" data type, which is required for WMS/UDP
rbultje
parents:
4557
diff
changeset
|
1178 if (rt->server_type == RTSP_SERVER_WMS && |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1179 s->streams[rtsp_st->stream_index]->codec->codec_type == |
5910
536e5527c1e0
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
5909
diff
changeset
|
1180 AVMEDIA_TYPE_DATA) |
4637
eaf90db8cc42
Recognize the "application" data type, which is required for WMS/UDP
rbultje
parents:
4557
diff
changeset
|
1181 continue; |
3877
3e0c7ad2a675
Remove unused code that used to handle protocol concatenation, i.e. trying
rbultje
parents:
3876
diff
changeset
|
1182 snprintf(transport, sizeof(transport) - 1, |
4332
0d776969b708
Fix the Transport: line in the SETUP request so that it works with WMS
rbultje
parents:
4291
diff
changeset
|
1183 "%s/TCP;", trans_pref); |
0d776969b708
Fix the Transport: line in the SETUP request so that it works with WMS
rbultje
parents:
4291
diff
changeset
|
1184 if (rt->server_type == RTSP_SERVER_WMS) |
0d776969b708
Fix the Transport: line in the SETUP request so that it works with WMS
rbultje
parents:
4291
diff
changeset
|
1185 av_strlcat(transport, "unicast;", sizeof(transport)); |
0d776969b708
Fix the Transport: line in the SETUP request so that it works with WMS
rbultje
parents:
4291
diff
changeset
|
1186 av_strlcatf(transport, sizeof(transport), |
0d776969b708
Fix the Transport: line in the SETUP request so that it works with WMS
rbultje
parents:
4291
diff
changeset
|
1187 "interleaved=%d-%d", |
0d776969b708
Fix the Transport: line in the SETUP request so that it works with WMS
rbultje
parents:
4291
diff
changeset
|
1188 interleave, interleave + 1); |
0d776969b708
Fix the Transport: line in the SETUP request so that it works with WMS
rbultje
parents:
4291
diff
changeset
|
1189 interleave += 2; |
0 | 1190 } |
1191 | |
3957
9f943bb755f9
Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us
rbultje
parents:
3941
diff
changeset
|
1192 else if (lower_transport == RTSP_LOWER_TRANSPORT_UDP_MULTICAST) { |
3877
3e0c7ad2a675
Remove unused code that used to handle protocol concatenation, i.e. trying
rbultje
parents:
3876
diff
changeset
|
1193 snprintf(transport, sizeof(transport) - 1, |
3876
1026953d4ffe
Implement Realmedia/RTSP-compatible SETUP command. This includes calculation
rbultje
parents:
3861
diff
changeset
|
1194 "%s/UDP;multicast", trans_pref); |
0 | 1195 } |
5678
76cb8ea11c47
Use mode=receive instead of mode=play if in RTSP muxer (instead of demuxer)
rbultje
parents:
5677
diff
changeset
|
1196 if (s->oformat) { |
76cb8ea11c47
Use mode=receive instead of mode=play if in RTSP muxer (instead of demuxer)
rbultje
parents:
5677
diff
changeset
|
1197 av_strlcat(transport, ";mode=receive", sizeof(transport)); |
76cb8ea11c47
Use mode=receive instead of mode=play if in RTSP muxer (instead of demuxer)
rbultje
parents:
5677
diff
changeset
|
1198 } else if (rt->server_type == RTSP_SERVER_REAL || |
5691 | 1199 rt->server_type == RTSP_SERVER_WMS) |
3876
1026953d4ffe
Implement Realmedia/RTSP-compatible SETUP command. This includes calculation
rbultje
parents:
3861
diff
changeset
|
1200 av_strlcat(transport, ";mode=play", sizeof(transport)); |
885 | 1201 snprintf(cmd, sizeof(cmd), |
172 | 1202 "Transport: %s\r\n", |
5888
4ddbc14bc768
Add separate method/url parameters to the rtsp_send_cmd functions
mstorsjo
parents:
5887
diff
changeset
|
1203 transport); |
3923
83e51bcb03c2
Rename RTSP_SERVER_RDT to RTSP_SERVER_REAL, because RDT (the transport
rbultje
parents:
3920
diff
changeset
|
1204 if (i == 0 && rt->server_type == RTSP_SERVER_REAL) { |
3876
1026953d4ffe
Implement Realmedia/RTSP-compatible SETUP command. This includes calculation
rbultje
parents:
3861
diff
changeset
|
1205 char real_res[41], real_csum[9]; |
1026953d4ffe
Implement Realmedia/RTSP-compatible SETUP command. This includes calculation
rbultje
parents:
3861
diff
changeset
|
1206 ff_rdt_calc_response_and_checksum(real_res, real_csum, |
1026953d4ffe
Implement Realmedia/RTSP-compatible SETUP command. This includes calculation
rbultje
parents:
3861
diff
changeset
|
1207 real_challenge); |
1026953d4ffe
Implement Realmedia/RTSP-compatible SETUP command. This includes calculation
rbultje
parents:
3861
diff
changeset
|
1208 av_strlcatf(cmd, sizeof(cmd), |
1026953d4ffe
Implement Realmedia/RTSP-compatible SETUP command. This includes calculation
rbultje
parents:
3861
diff
changeset
|
1209 "If-Match: %s\r\n" |
1026953d4ffe
Implement Realmedia/RTSP-compatible SETUP command. This includes calculation
rbultje
parents:
3861
diff
changeset
|
1210 "RealChallenge2: %s, sd=%s\r\n", |
1026953d4ffe
Implement Realmedia/RTSP-compatible SETUP command. This includes calculation
rbultje
parents:
3861
diff
changeset
|
1211 rt->session_id, real_res, real_csum); |
1026953d4ffe
Implement Realmedia/RTSP-compatible SETUP command. This includes calculation
rbultje
parents:
3861
diff
changeset
|
1212 } |
5888
4ddbc14bc768
Add separate method/url parameters to the rtsp_send_cmd functions
mstorsjo
parents:
5887
diff
changeset
|
1213 ff_rtsp_send_cmd(s, "SETUP", rtsp_st->control_url, cmd, reply, NULL); |
3149
5a7a7406ab1f
Allow cycling between different protocols (TCP, UDP or multicast) so that if
rbultje
parents:
3147
diff
changeset
|
1214 if (reply->status_code == 461 /* Unsupported protocol */ && i == 0) { |
5a7a7406ab1f
Allow cycling between different protocols (TCP, UDP or multicast) so that if
rbultje
parents:
3147
diff
changeset
|
1215 err = 1; |
5a7a7406ab1f
Allow cycling between different protocols (TCP, UDP or multicast) so that if
rbultje
parents:
3147
diff
changeset
|
1216 goto fail; |
3151 | 1217 } else if (reply->status_code != RTSP_STATUS_OK || |
1218 reply->nb_transports != 1) { | |
0 | 1219 err = AVERROR_INVALIDDATA; |
1220 goto fail; | |
1221 } | |
1222 | |
1223 /* XXX: same protocol for all streams is required */ | |
1224 if (i > 0) { | |
3960
13e9b0d3a314
Implement a RTSPTransport field, which allows proper separation of server
rbultje
parents:
3959
diff
changeset
|
1225 if (reply->transports[0].lower_transport != rt->lower_transport || |
13e9b0d3a314
Implement a RTSPTransport field, which allows proper separation of server
rbultje
parents:
3959
diff
changeset
|
1226 reply->transports[0].transport != rt->transport) { |
0 | 1227 err = AVERROR_INVALIDDATA; |
1228 goto fail; | |
1229 } | |
1230 } else { | |
3957
9f943bb755f9
Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us
rbultje
parents:
3941
diff
changeset
|
1231 rt->lower_transport = reply->transports[0].lower_transport; |
3960
13e9b0d3a314
Implement a RTSPTransport field, which allows proper separation of server
rbultje
parents:
3959
diff
changeset
|
1232 rt->transport = reply->transports[0].transport; |
0 | 1233 } |
1234 | |
1235 /* close RTP connection if not choosen */ | |
3957
9f943bb755f9
Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us
rbultje
parents:
3941
diff
changeset
|
1236 if (reply->transports[0].lower_transport != RTSP_LOWER_TRANSPORT_UDP && |
9f943bb755f9
Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us
rbultje
parents:
3941
diff
changeset
|
1237 (lower_transport == RTSP_LOWER_TRANSPORT_UDP)) { |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
229
diff
changeset
|
1238 url_close(rtsp_st->rtp_handle); |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
229
diff
changeset
|
1239 rtsp_st->rtp_handle = NULL; |
0 | 1240 } |
1241 | |
3957
9f943bb755f9
Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us
rbultje
parents:
3941
diff
changeset
|
1242 switch(reply->transports[0].lower_transport) { |
9f943bb755f9
Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us
rbultje
parents:
3941
diff
changeset
|
1243 case RTSP_LOWER_TRANSPORT_TCP: |
0 | 1244 rtsp_st->interleaved_min = reply->transports[0].interleaved_min; |
1245 rtsp_st->interleaved_max = reply->transports[0].interleaved_max; | |
1246 break; | |
885 | 1247 |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1248 case RTSP_LOWER_TRANSPORT_UDP: { |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1249 char url[1024]; |
885 | 1250 |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1251 /* XXX: also use address if specified */ |
5756
7c7fe75728dd
Use ff_url_join for assembling URLs, instead of snprintf
mstorsjo
parents:
5726
diff
changeset
|
1252 ff_url_join(url, sizeof(url), "rtp", NULL, host, |
7c7fe75728dd
Use ff_url_join for assembling URLs, instead of snprintf
mstorsjo
parents:
5726
diff
changeset
|
1253 reply->transports[0].server_port_min, NULL); |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1254 if (!(rt->server_type == RTSP_SERVER_WMS && i > 1) && |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1255 rtp_set_remote_url(rtsp_st->rtp_handle, url) < 0) { |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1256 err = AVERROR_INVALIDDATA; |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1257 goto fail; |
0 | 1258 } |
5665
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5645
diff
changeset
|
1259 /* Try to initialize the connection state in a |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5645
diff
changeset
|
1260 * potential NAT router by sending dummy packets. |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5645
diff
changeset
|
1261 * RTP/RTCP dummy packets are used for RDT, too. |
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5645
diff
changeset
|
1262 */ |
5679
4e5c3a9c1f6c
Only send out NAT-punching RTP/RTCP packets when we're in demuxer mode, i.e.
rbultje
parents:
5678
diff
changeset
|
1263 if (!(rt->server_type == RTSP_SERVER_WMS && i > 1) && s->iformat) |
5665
93b0d64bf0c9
When using RTP-over-UDP, send dummy packets during stream setup, similar to
rbultje
parents:
5645
diff
changeset
|
1264 rtp_send_punch_packets(rtsp_st->rtp_handle); |
0 | 1265 break; |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1266 } |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1267 case RTSP_LOWER_TRANSPORT_UDP_MULTICAST: { |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1268 char url[1024]; |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1269 struct in_addr in; |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1270 int port, ttl; |
0 | 1271 |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1272 if (reply->transports[0].destination) { |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1273 in.s_addr = htonl(reply->transports[0].destination); |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1274 port = reply->transports[0].port_min; |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1275 ttl = reply->transports[0].ttl; |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1276 } else { |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1277 in = rtsp_st->sdp_ip; |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1278 port = rtsp_st->sdp_port; |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1279 ttl = rtsp_st->sdp_ttl; |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1280 } |
5756
7c7fe75728dd
Use ff_url_join for assembling URLs, instead of snprintf
mstorsjo
parents:
5726
diff
changeset
|
1281 ff_url_join(url, sizeof(url), "rtp", NULL, inet_ntoa(in), |
7c7fe75728dd
Use ff_url_join for assembling URLs, instead of snprintf
mstorsjo
parents:
5726
diff
changeset
|
1282 port, "?ttl=%d", ttl); |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1283 if (url_open(&rtsp_st->rtp_handle, url, URL_RDWR) < 0) { |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1284 err = AVERROR_INVALIDDATA; |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1285 goto fail; |
0 | 1286 } |
1287 break; | |
1288 } | |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1289 } |
774 | 1290 |
3919
1879eab34f88
Factorize out common code for opening of the RTP parsing context between
rbultje
parents:
3905
diff
changeset
|
1291 if ((err = rtsp_open_transport_ctx(s, rtsp_st))) |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
229
diff
changeset
|
1292 goto fail; |
0 | 1293 } |
1294 | |
4877
940946a4569b
Send dummy requests over the TCP connection (WMS wants GET_PARAMETER,
rbultje
parents:
4875
diff
changeset
|
1295 if (reply->timeout > 0) |
940946a4569b
Send dummy requests over the TCP connection (WMS wants GET_PARAMETER,
rbultje
parents:
4875
diff
changeset
|
1296 rt->timeout = reply->timeout; |
940946a4569b
Send dummy requests over the TCP connection (WMS wants GET_PARAMETER,
rbultje
parents:
4875
diff
changeset
|
1297 |
3923
83e51bcb03c2
Rename RTSP_SERVER_RDT to RTSP_SERVER_REAL, because RDT (the transport
rbultje
parents:
3920
diff
changeset
|
1298 if (rt->server_type == RTSP_SERVER_REAL) |
3903
aeb79f68ba7e
Implement a RDT-specific SET_PARAMETER command that subscribes to the
rbultje
parents:
3877
diff
changeset
|
1299 rt->need_subscription = 1; |
aeb79f68ba7e
Implement a RDT-specific SET_PARAMETER command that subscribes to the
rbultje
parents:
3877
diff
changeset
|
1300 |
3147
91d65fdf91e1
Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents:
2884
diff
changeset
|
1301 return 0; |
91d65fdf91e1
Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents:
2884
diff
changeset
|
1302 |
91d65fdf91e1
Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents:
2884
diff
changeset
|
1303 fail: |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1304 for (i = 0; i < rt->nb_rtsp_streams; i++) { |
3149
5a7a7406ab1f
Allow cycling between different protocols (TCP, UDP or multicast) so that if
rbultje
parents:
3147
diff
changeset
|
1305 if (rt->rtsp_streams[i]->rtp_handle) { |
5a7a7406ab1f
Allow cycling between different protocols (TCP, UDP or multicast) so that if
rbultje
parents:
3147
diff
changeset
|
1306 url_close(rt->rtsp_streams[i]->rtp_handle); |
5a7a7406ab1f
Allow cycling between different protocols (TCP, UDP or multicast) so that if
rbultje
parents:
3147
diff
changeset
|
1307 rt->rtsp_streams[i]->rtp_handle = NULL; |
5a7a7406ab1f
Allow cycling between different protocols (TCP, UDP or multicast) so that if
rbultje
parents:
3147
diff
changeset
|
1308 } |
5a7a7406ab1f
Allow cycling between different protocols (TCP, UDP or multicast) so that if
rbultje
parents:
3147
diff
changeset
|
1309 } |
3147
91d65fdf91e1
Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents:
2884
diff
changeset
|
1310 return err; |
91d65fdf91e1
Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents:
2884
diff
changeset
|
1311 } |
91d65fdf91e1
Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents:
2884
diff
changeset
|
1312 |
5365
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
1313 static int rtsp_read_play(AVFormatContext *s) |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
1314 { |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
1315 RTSPState *rt = s->priv_data; |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
1316 RTSPMessageHeader reply1, *reply = &reply1; |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
1317 char cmd[1024]; |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
1318 |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
1319 av_log(s, AV_LOG_DEBUG, "hello state=%d\n", rt->state); |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
1320 |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
1321 if (!(rt->server_type == RTSP_SERVER_REAL && rt->need_subscription)) { |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
1322 if (rt->state == RTSP_STATE_PAUSED) { |
5888
4ddbc14bc768
Add separate method/url parameters to the rtsp_send_cmd functions
mstorsjo
parents:
5887
diff
changeset
|
1323 cmd[0] = 0; |
5365
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
1324 } else { |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
1325 snprintf(cmd, sizeof(cmd), |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
1326 "Range: npt=%0.3f-\r\n", |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
1327 (double)rt->seek_timestamp / AV_TIME_BASE); |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
1328 } |
5888
4ddbc14bc768
Add separate method/url parameters to the rtsp_send_cmd functions
mstorsjo
parents:
5887
diff
changeset
|
1329 ff_rtsp_send_cmd(s, "PLAY", rt->control_uri, cmd, reply, NULL); |
5365
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
1330 if (reply->status_code != RTSP_STATUS_OK) { |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
1331 return -1; |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
1332 } |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
1333 } |
5670
7fa188f69c22
Rename RTSP_STATE_PLAYING to _STREAMING, since that better covers the
rbultje
parents:
5667
diff
changeset
|
1334 rt->state = RTSP_STATE_STREAMING; |
5365
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
1335 return 0; |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
1336 } |
4097dc22e612
Move some some functions around, so that splitting the SDP code out of
lucabe
parents:
5334
diff
changeset
|
1337 |
5862
57fc219dc951
Use the caller's RTSPMessageHeader in rtsp_setup_input_streams
mstorsjo
parents:
5845
diff
changeset
|
1338 static int rtsp_setup_input_streams(AVFormatContext *s, RTSPMessageHeader *reply) |
5680
129679c03536
Split out input-specific parts of rtsp_read_header() into its own, new,
rbultje
parents:
5679
diff
changeset
|
1339 { |
129679c03536
Split out input-specific parts of rtsp_read_header() into its own, new,
rbultje
parents:
5679
diff
changeset
|
1340 RTSPState *rt = s->priv_data; |
129679c03536
Split out input-specific parts of rtsp_read_header() into its own, new,
rbultje
parents:
5679
diff
changeset
|
1341 char cmd[1024]; |
129679c03536
Split out input-specific parts of rtsp_read_header() into its own, new,
rbultje
parents:
5679
diff
changeset
|
1342 unsigned char *content = NULL; |
129679c03536
Split out input-specific parts of rtsp_read_header() into its own, new,
rbultje
parents:
5679
diff
changeset
|
1343 int ret; |
129679c03536
Split out input-specific parts of rtsp_read_header() into its own, new,
rbultje
parents:
5679
diff
changeset
|
1344 |
129679c03536
Split out input-specific parts of rtsp_read_header() into its own, new,
rbultje
parents:
5679
diff
changeset
|
1345 /* describe the stream */ |
129679c03536
Split out input-specific parts of rtsp_read_header() into its own, new,
rbultje
parents:
5679
diff
changeset
|
1346 snprintf(cmd, sizeof(cmd), |
5888
4ddbc14bc768
Add separate method/url parameters to the rtsp_send_cmd functions
mstorsjo
parents:
5887
diff
changeset
|
1347 "Accept: application/sdp\r\n"); |
5680
129679c03536
Split out input-specific parts of rtsp_read_header() into its own, new,
rbultje
parents:
5679
diff
changeset
|
1348 if (rt->server_type == RTSP_SERVER_REAL) { |
129679c03536
Split out input-specific parts of rtsp_read_header() into its own, new,
rbultje
parents:
5679
diff
changeset
|
1349 /** |
129679c03536
Split out input-specific parts of rtsp_read_header() into its own, new,
rbultje
parents:
5679
diff
changeset
|
1350 * The Require: attribute is needed for proper streaming from |
129679c03536
Split out input-specific parts of rtsp_read_header() into its own, new,
rbultje
parents:
5679
diff
changeset
|
1351 * Realmedia servers. |
129679c03536
Split out input-specific parts of rtsp_read_header() into its own, new,
rbultje
parents:
5679
diff
changeset
|
1352 */ |
129679c03536
Split out input-specific parts of rtsp_read_header() into its own, new,
rbultje
parents:
5679
diff
changeset
|
1353 av_strlcat(cmd, |
129679c03536
Split out input-specific parts of rtsp_read_header() into its own, new,
rbultje
parents:
5679
diff
changeset
|
1354 "Require: com.real.retain-entity-for-setup\r\n", |
129679c03536
Split out input-specific parts of rtsp_read_header() into its own, new,
rbultje
parents:
5679
diff
changeset
|
1355 sizeof(cmd)); |
129679c03536
Split out input-specific parts of rtsp_read_header() into its own, new,
rbultje
parents:
5679
diff
changeset
|
1356 } |
5888
4ddbc14bc768
Add separate method/url parameters to the rtsp_send_cmd functions
mstorsjo
parents:
5887
diff
changeset
|
1357 ff_rtsp_send_cmd(s, "DESCRIBE", rt->control_uri, cmd, reply, &content); |
5680
129679c03536
Split out input-specific parts of rtsp_read_header() into its own, new,
rbultje
parents:
5679
diff
changeset
|
1358 if (!content) |
129679c03536
Split out input-specific parts of rtsp_read_header() into its own, new,
rbultje
parents:
5679
diff
changeset
|
1359 return AVERROR_INVALIDDATA; |
129679c03536
Split out input-specific parts of rtsp_read_header() into its own, new,
rbultje
parents:
5679
diff
changeset
|
1360 if (reply->status_code != RTSP_STATUS_OK) { |
129679c03536
Split out input-specific parts of rtsp_read_header() into its own, new,
rbultje
parents:
5679
diff
changeset
|
1361 av_freep(&content); |
129679c03536
Split out input-specific parts of rtsp_read_header() into its own, new,
rbultje
parents:
5679
diff
changeset
|
1362 return AVERROR_INVALIDDATA; |
129679c03536
Split out input-specific parts of rtsp_read_header() into its own, new,
rbultje
parents:
5679
diff
changeset
|
1363 } |
129679c03536
Split out input-specific parts of rtsp_read_header() into its own, new,
rbultje
parents:
5679
diff
changeset
|
1364 |
129679c03536
Split out input-specific parts of rtsp_read_header() into its own, new,
rbultje
parents:
5679
diff
changeset
|
1365 /* now we got the SDP description, we parse it */ |
129679c03536
Split out input-specific parts of rtsp_read_header() into its own, new,
rbultje
parents:
5679
diff
changeset
|
1366 ret = sdp_parse(s, (const char *)content); |
129679c03536
Split out input-specific parts of rtsp_read_header() into its own, new,
rbultje
parents:
5679
diff
changeset
|
1367 av_freep(&content); |
129679c03536
Split out input-specific parts of rtsp_read_header() into its own, new,
rbultje
parents:
5679
diff
changeset
|
1368 if (ret < 0) |
129679c03536
Split out input-specific parts of rtsp_read_header() into its own, new,
rbultje
parents:
5679
diff
changeset
|
1369 return AVERROR_INVALIDDATA; |
129679c03536
Split out input-specific parts of rtsp_read_header() into its own, new,
rbultje
parents:
5679
diff
changeset
|
1370 |
129679c03536
Split out input-specific parts of rtsp_read_header() into its own, new,
rbultje
parents:
5679
diff
changeset
|
1371 return 0; |
129679c03536
Split out input-specific parts of rtsp_read_header() into its own, new,
rbultje
parents:
5679
diff
changeset
|
1372 } |
129679c03536
Split out input-specific parts of rtsp_read_header() into its own, new,
rbultje
parents:
5679
diff
changeset
|
1373 |
5819
53c5a5d40ee7
RTSP muxer: Create the SDP with the numerical IP of the peer
mstorsjo
parents:
5802
diff
changeset
|
1374 static int rtsp_setup_output_streams(AVFormatContext *s, const char *addr) |
5689
04c5f50dab62
Add a function rtsp_setup_output_streams for announcing the SDP
mstorsjo
parents:
5688
diff
changeset
|
1375 { |
04c5f50dab62
Add a function rtsp_setup_output_streams for announcing the SDP
mstorsjo
parents:
5688
diff
changeset
|
1376 RTSPState *rt = s->priv_data; |
04c5f50dab62
Add a function rtsp_setup_output_streams for announcing the SDP
mstorsjo
parents:
5688
diff
changeset
|
1377 RTSPMessageHeader reply1, *reply = &reply1; |
04c5f50dab62
Add a function rtsp_setup_output_streams for announcing the SDP
mstorsjo
parents:
5688
diff
changeset
|
1378 int i; |
04c5f50dab62
Add a function rtsp_setup_output_streams for announcing the SDP
mstorsjo
parents:
5688
diff
changeset
|
1379 char *sdp; |
5819
53c5a5d40ee7
RTSP muxer: Create the SDP with the numerical IP of the peer
mstorsjo
parents:
5802
diff
changeset
|
1380 AVFormatContext sdp_ctx, *ctx_array[1]; |
5689
04c5f50dab62
Add a function rtsp_setup_output_streams for announcing the SDP
mstorsjo
parents:
5688
diff
changeset
|
1381 |
5843
777a89fdb1c0
RTSP: Synchronize the start time of the chained RTP muxers
mstorsjo
parents:
5837
diff
changeset
|
1382 rt->start_time = av_gettime(); |
777a89fdb1c0
RTSP: Synchronize the start time of the chained RTP muxers
mstorsjo
parents:
5837
diff
changeset
|
1383 |
5689
04c5f50dab62
Add a function rtsp_setup_output_streams for announcing the SDP
mstorsjo
parents:
5688
diff
changeset
|
1384 /* Announce the stream */ |
04c5f50dab62
Add a function rtsp_setup_output_streams for announcing the SDP
mstorsjo
parents:
5688
diff
changeset
|
1385 sdp = av_mallocz(8192); |
04c5f50dab62
Add a function rtsp_setup_output_streams for announcing the SDP
mstorsjo
parents:
5688
diff
changeset
|
1386 if (sdp == NULL) |
04c5f50dab62
Add a function rtsp_setup_output_streams for announcing the SDP
mstorsjo
parents:
5688
diff
changeset
|
1387 return AVERROR(ENOMEM); |
5819
53c5a5d40ee7
RTSP muxer: Create the SDP with the numerical IP of the peer
mstorsjo
parents:
5802
diff
changeset
|
1388 /* We create the SDP based on the RTSP AVFormatContext where we |
53c5a5d40ee7
RTSP muxer: Create the SDP with the numerical IP of the peer
mstorsjo
parents:
5802
diff
changeset
|
1389 * aren't allowed to change the filename field. (We create the SDP |
53c5a5d40ee7
RTSP muxer: Create the SDP with the numerical IP of the peer
mstorsjo
parents:
5802
diff
changeset
|
1390 * based on the RTSP context since the contexts for the RTP streams |
53c5a5d40ee7
RTSP muxer: Create the SDP with the numerical IP of the peer
mstorsjo
parents:
5802
diff
changeset
|
1391 * don't exist yet.) In order to specify a custom URL with the actual |
53c5a5d40ee7
RTSP muxer: Create the SDP with the numerical IP of the peer
mstorsjo
parents:
5802
diff
changeset
|
1392 * peer IP instead of the originally specified hostname, we create |
53c5a5d40ee7
RTSP muxer: Create the SDP with the numerical IP of the peer
mstorsjo
parents:
5802
diff
changeset
|
1393 * a temporary copy of the AVFormatContext, where the custom URL is set. |
53c5a5d40ee7
RTSP muxer: Create the SDP with the numerical IP of the peer
mstorsjo
parents:
5802
diff
changeset
|
1394 * |
53c5a5d40ee7
RTSP muxer: Create the SDP with the numerical IP of the peer
mstorsjo
parents:
5802
diff
changeset
|
1395 * FIXME: Create the SDP without copying the AVFormatContext. |
53c5a5d40ee7
RTSP muxer: Create the SDP with the numerical IP of the peer
mstorsjo
parents:
5802
diff
changeset
|
1396 * This either requires setting up the RTP stream AVFormatContexts |
53c5a5d40ee7
RTSP muxer: Create the SDP with the numerical IP of the peer
mstorsjo
parents:
5802
diff
changeset
|
1397 * already here (complicating things immensely) or getting a more |
53c5a5d40ee7
RTSP muxer: Create the SDP with the numerical IP of the peer
mstorsjo
parents:
5802
diff
changeset
|
1398 * flexible SDP creation interface. |
53c5a5d40ee7
RTSP muxer: Create the SDP with the numerical IP of the peer
mstorsjo
parents:
5802
diff
changeset
|
1399 */ |
53c5a5d40ee7
RTSP muxer: Create the SDP with the numerical IP of the peer
mstorsjo
parents:
5802
diff
changeset
|
1400 sdp_ctx = *s; |
53c5a5d40ee7
RTSP muxer: Create the SDP with the numerical IP of the peer
mstorsjo
parents:
5802
diff
changeset
|
1401 ff_url_join(sdp_ctx.filename, sizeof(sdp_ctx.filename), |
53c5a5d40ee7
RTSP muxer: Create the SDP with the numerical IP of the peer
mstorsjo
parents:
5802
diff
changeset
|
1402 "rtsp", NULL, addr, -1, NULL); |
53c5a5d40ee7
RTSP muxer: Create the SDP with the numerical IP of the peer
mstorsjo
parents:
5802
diff
changeset
|
1403 ctx_array[0] = &sdp_ctx; |
53c5a5d40ee7
RTSP muxer: Create the SDP with the numerical IP of the peer
mstorsjo
parents:
5802
diff
changeset
|
1404 if (avf_sdp_create(ctx_array, 1, sdp, 8192)) { |
5689
04c5f50dab62
Add a function rtsp_setup_output_streams for announcing the SDP
mstorsjo
parents:
5688
diff
changeset
|
1405 av_free(sdp); |
04c5f50dab62
Add a function rtsp_setup_output_streams for announcing the SDP
mstorsjo
parents:
5688
diff
changeset
|
1406 return AVERROR_INVALIDDATA; |
04c5f50dab62
Add a function rtsp_setup_output_streams for announcing the SDP
mstorsjo
parents:
5688
diff
changeset
|
1407 } |
04c5f50dab62
Add a function rtsp_setup_output_streams for announcing the SDP
mstorsjo
parents:
5688
diff
changeset
|
1408 av_log(s, AV_LOG_INFO, "SDP:\n%s\n", sdp); |
5888
4ddbc14bc768
Add separate method/url parameters to the rtsp_send_cmd functions
mstorsjo
parents:
5887
diff
changeset
|
1409 ff_rtsp_send_cmd_with_content(s, "ANNOUNCE", rt->control_uri, |
4ddbc14bc768
Add separate method/url parameters to the rtsp_send_cmd functions
mstorsjo
parents:
5887
diff
changeset
|
1410 "Content-Type: application/sdp\r\n", |
4ddbc14bc768
Add separate method/url parameters to the rtsp_send_cmd functions
mstorsjo
parents:
5887
diff
changeset
|
1411 reply, NULL, sdp, strlen(sdp)); |
5689
04c5f50dab62
Add a function rtsp_setup_output_streams for announcing the SDP
mstorsjo
parents:
5688
diff
changeset
|
1412 av_free(sdp); |
04c5f50dab62
Add a function rtsp_setup_output_streams for announcing the SDP
mstorsjo
parents:
5688
diff
changeset
|
1413 if (reply->status_code != RTSP_STATUS_OK) |
04c5f50dab62
Add a function rtsp_setup_output_streams for announcing the SDP
mstorsjo
parents:
5688
diff
changeset
|
1414 return AVERROR_INVALIDDATA; |
04c5f50dab62
Add a function rtsp_setup_output_streams for announcing the SDP
mstorsjo
parents:
5688
diff
changeset
|
1415 |
04c5f50dab62
Add a function rtsp_setup_output_streams for announcing the SDP
mstorsjo
parents:
5688
diff
changeset
|
1416 /* Set up the RTSPStreams for each AVStream */ |
04c5f50dab62
Add a function rtsp_setup_output_streams for announcing the SDP
mstorsjo
parents:
5688
diff
changeset
|
1417 for (i = 0; i < s->nb_streams; i++) { |
04c5f50dab62
Add a function rtsp_setup_output_streams for announcing the SDP
mstorsjo
parents:
5688
diff
changeset
|
1418 RTSPStream *rtsp_st; |
04c5f50dab62
Add a function rtsp_setup_output_streams for announcing the SDP
mstorsjo
parents:
5688
diff
changeset
|
1419 AVStream *st = s->streams[i]; |
04c5f50dab62
Add a function rtsp_setup_output_streams for announcing the SDP
mstorsjo
parents:
5688
diff
changeset
|
1420 |
04c5f50dab62
Add a function rtsp_setup_output_streams for announcing the SDP
mstorsjo
parents:
5688
diff
changeset
|
1421 rtsp_st = av_mallocz(sizeof(RTSPStream)); |
04c5f50dab62
Add a function rtsp_setup_output_streams for announcing the SDP
mstorsjo
parents:
5688
diff
changeset
|
1422 if (!rtsp_st) |
04c5f50dab62
Add a function rtsp_setup_output_streams for announcing the SDP
mstorsjo
parents:
5688
diff
changeset
|
1423 return AVERROR(ENOMEM); |
04c5f50dab62
Add a function rtsp_setup_output_streams for announcing the SDP
mstorsjo
parents:
5688
diff
changeset
|
1424 dynarray_add(&rt->rtsp_streams, &rt->nb_rtsp_streams, rtsp_st); |
04c5f50dab62
Add a function rtsp_setup_output_streams for announcing the SDP
mstorsjo
parents:
5688
diff
changeset
|
1425 |
04c5f50dab62
Add a function rtsp_setup_output_streams for announcing the SDP
mstorsjo
parents:
5688
diff
changeset
|
1426 st->priv_data = rtsp_st; |
04c5f50dab62
Add a function rtsp_setup_output_streams for announcing the SDP
mstorsjo
parents:
5688
diff
changeset
|
1427 rtsp_st->stream_index = i; |
04c5f50dab62
Add a function rtsp_setup_output_streams for announcing the SDP
mstorsjo
parents:
5688
diff
changeset
|
1428 |
5800
4410bccf6a8a
Use rt->control_uri consequently instead of s->filename in all RTSP commands
mstorsjo
parents:
5798
diff
changeset
|
1429 av_strlcpy(rtsp_st->control_url, rt->control_uri, sizeof(rtsp_st->control_url)); |
5689
04c5f50dab62
Add a function rtsp_setup_output_streams for announcing the SDP
mstorsjo
parents:
5688
diff
changeset
|
1430 /* Note, this must match the relative uri set in the sdp content */ |
04c5f50dab62
Add a function rtsp_setup_output_streams for announcing the SDP
mstorsjo
parents:
5688
diff
changeset
|
1431 av_strlcatf(rtsp_st->control_url, sizeof(rtsp_st->control_url), |
04c5f50dab62
Add a function rtsp_setup_output_streams for announcing the SDP
mstorsjo
parents:
5688
diff
changeset
|
1432 "/streamid=%d", i); |
04c5f50dab62
Add a function rtsp_setup_output_streams for announcing the SDP
mstorsjo
parents:
5688
diff
changeset
|
1433 } |
04c5f50dab62
Add a function rtsp_setup_output_streams for announcing the SDP
mstorsjo
parents:
5688
diff
changeset
|
1434 |
04c5f50dab62
Add a function rtsp_setup_output_streams for announcing the SDP
mstorsjo
parents:
5688
diff
changeset
|
1435 return 0; |
04c5f50dab62
Add a function rtsp_setup_output_streams for announcing the SDP
mstorsjo
parents:
5688
diff
changeset
|
1436 } |
04c5f50dab62
Add a function rtsp_setup_output_streams for announcing the SDP
mstorsjo
parents:
5688
diff
changeset
|
1437 |
5697 | 1438 int ff_rtsp_connect(AVFormatContext *s) |
3147
91d65fdf91e1
Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents:
2884
diff
changeset
|
1439 { |
91d65fdf91e1
Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents:
2884
diff
changeset
|
1440 RTSPState *rt = s->priv_data; |
5331 | 1441 char host[1024], path[1024], tcpname[1024], cmd[2048], auth[128]; |
1442 char *option_list, *option, *filename; | |
3147
91d65fdf91e1
Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents:
2884
diff
changeset
|
1443 URLContext *rtsp_hd; |
5798
2af44abfbfe8
RTSP: Resolve and use the actual IP address of the peer we're connected to,
mstorsjo
parents:
5776
diff
changeset
|
1444 int port, err, tcp_fd; |
5933 | 1445 RTSPMessageHeader reply1 = {}, *reply = &reply1; |
3957
9f943bb755f9
Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us
rbultje
parents:
3941
diff
changeset
|
1446 int lower_transport_mask = 0; |
3856 | 1447 char real_challenge[64]; |
5798
2af44abfbfe8
RTSP: Resolve and use the actual IP address of the peer we're connected to,
mstorsjo
parents:
5776
diff
changeset
|
1448 struct sockaddr_storage peer; |
2af44abfbfe8
RTSP: Resolve and use the actual IP address of the peer we're connected to,
mstorsjo
parents:
5776
diff
changeset
|
1449 socklen_t peer_len = sizeof(peer); |
5756
7c7fe75728dd
Use ff_url_join for assembling URLs, instead of snprintf
mstorsjo
parents:
5726
diff
changeset
|
1450 |
7c7fe75728dd
Use ff_url_join for assembling URLs, instead of snprintf
mstorsjo
parents:
5726
diff
changeset
|
1451 if (!ff_network_init()) |
7c7fe75728dd
Use ff_url_join for assembling URLs, instead of snprintf
mstorsjo
parents:
5726
diff
changeset
|
1452 return AVERROR(EIO); |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1453 redirect: |
3147
91d65fdf91e1
Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents:
2884
diff
changeset
|
1454 /* extract hostname and port */ |
5775 | 1455 ff_url_split(NULL, 0, auth, sizeof(auth), |
5776 | 1456 host, sizeof(host), &port, path, sizeof(path), s->filename); |
5220
cad276e8f96e
RTSP basic authentication, patch originally by Philip Coombes
rbultje
parents:
5112
diff
changeset
|
1457 if (*auth) { |
5889
4b42835727aa
Make RTSP use the generic http authentication code
mstorsjo
parents:
5888
diff
changeset
|
1458 av_strlcpy(rt->auth, auth, sizeof(rt->auth)); |
5220
cad276e8f96e
RTSP basic authentication, patch originally by Philip Coombes
rbultje
parents:
5112
diff
changeset
|
1459 } |
3147
91d65fdf91e1
Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents:
2884
diff
changeset
|
1460 if (port < 0) |
91d65fdf91e1
Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents:
2884
diff
changeset
|
1461 port = RTSP_DEFAULT_PORT; |
91d65fdf91e1
Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents:
2884
diff
changeset
|
1462 |
91d65fdf91e1
Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents:
2884
diff
changeset
|
1463 /* search for options */ |
5870
b17b16b532ca
Parse options in the RTSP URL only from the last question mark onwards
mstorsjo
parents:
5869
diff
changeset
|
1464 option_list = strrchr(path, '?'); |
3147
91d65fdf91e1
Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents:
2884
diff
changeset
|
1465 if (option_list) { |
5869
754103ee76de
Reconstruct the RTSP URL, in order to remove the auth part from the URL sent to the server
mstorsjo
parents:
5865
diff
changeset
|
1466 /* Strip out the RTSP specific options, write out the rest of |
754103ee76de
Reconstruct the RTSP URL, in order to remove the auth part from the URL sent to the server
mstorsjo
parents:
5865
diff
changeset
|
1467 * the options back into the same string. */ |
754103ee76de
Reconstruct the RTSP URL, in order to remove the auth part from the URL sent to the server
mstorsjo
parents:
5865
diff
changeset
|
1468 filename = option_list; |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1469 while (option_list) { |
3147
91d65fdf91e1
Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents:
2884
diff
changeset
|
1470 /* move the option pointer */ |
5331 | 1471 option = ++option_list; |
3147
91d65fdf91e1
Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents:
2884
diff
changeset
|
1472 option_list = strchr(option_list, '&'); |
91d65fdf91e1
Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents:
2884
diff
changeset
|
1473 if (option_list) |
5331 | 1474 *option_list = 0; |
1475 | |
3147
91d65fdf91e1
Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents:
2884
diff
changeset
|
1476 /* handle the options */ |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1477 if (!strcmp(option, "udp")) { |
5871
9451f2f58b14
Handle multiple RTSP transport options properly by adding all of them into the mask
mstorsjo
parents:
5870
diff
changeset
|
1478 lower_transport_mask |= (1<< RTSP_LOWER_TRANSPORT_UDP); |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1479 } else if (!strcmp(option, "multicast")) { |
5871
9451f2f58b14
Handle multiple RTSP transport options properly by adding all of them into the mask
mstorsjo
parents:
5870
diff
changeset
|
1480 lower_transport_mask |= (1<< RTSP_LOWER_TRANSPORT_UDP_MULTICAST); |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1481 } else if (!strcmp(option, "tcp")) { |
5871
9451f2f58b14
Handle multiple RTSP transport options properly by adding all of them into the mask
mstorsjo
parents:
5870
diff
changeset
|
1482 lower_transport_mask |= (1<< RTSP_LOWER_TRANSPORT_TCP); |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1483 } else { |
5869
754103ee76de
Reconstruct the RTSP URL, in order to remove the auth part from the URL sent to the server
mstorsjo
parents:
5865
diff
changeset
|
1484 /* Write options back into the buffer, using memmove instead |
754103ee76de
Reconstruct the RTSP URL, in order to remove the auth part from the URL sent to the server
mstorsjo
parents:
5865
diff
changeset
|
1485 * of strcpy since the strings may overlap. */ |
754103ee76de
Reconstruct the RTSP URL, in order to remove the auth part from the URL sent to the server
mstorsjo
parents:
5865
diff
changeset
|
1486 int len = strlen(option); |
754103ee76de
Reconstruct the RTSP URL, in order to remove the auth part from the URL sent to the server
mstorsjo
parents:
5865
diff
changeset
|
1487 memmove(++filename, option, len); |
754103ee76de
Reconstruct the RTSP URL, in order to remove the auth part from the URL sent to the server
mstorsjo
parents:
5865
diff
changeset
|
1488 filename += len; |
5331 | 1489 if (option_list) *filename = '&'; |
1490 } | |
3147
91d65fdf91e1
Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents:
2884
diff
changeset
|
1491 } |
5331 | 1492 *filename = 0; |
3147
91d65fdf91e1
Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents:
2884
diff
changeset
|
1493 } |
91d65fdf91e1
Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents:
2884
diff
changeset
|
1494 |
3957
9f943bb755f9
Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us
rbultje
parents:
3941
diff
changeset
|
1495 if (!lower_transport_mask) |
4514
2a84d46427d1
Rename RTSP_*_LAST to RTSP_*_NB in line with PIX_FMT_* in lavc. See "[PATCH]
rbultje
parents:
4388
diff
changeset
|
1496 lower_transport_mask = (1 << RTSP_LOWER_TRANSPORT_NB) - 1; |
3147
91d65fdf91e1
Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents:
2884
diff
changeset
|
1497 |
5689
04c5f50dab62
Add a function rtsp_setup_output_streams for announcing the SDP
mstorsjo
parents:
5688
diff
changeset
|
1498 if (s->oformat) { |
5864
0ff0826b6c3d
Add support for TCP as lower transport in the RTSP muxer
mstorsjo
parents:
5862
diff
changeset
|
1499 /* Only UDP or TCP - UDP multicast isn't supported. */ |
0ff0826b6c3d
Add support for TCP as lower transport in the RTSP muxer
mstorsjo
parents:
5862
diff
changeset
|
1500 lower_transport_mask &= (1 << RTSP_LOWER_TRANSPORT_UDP) | |
0ff0826b6c3d
Add support for TCP as lower transport in the RTSP muxer
mstorsjo
parents:
5862
diff
changeset
|
1501 (1 << RTSP_LOWER_TRANSPORT_TCP); |
5689
04c5f50dab62
Add a function rtsp_setup_output_streams for announcing the SDP
mstorsjo
parents:
5688
diff
changeset
|
1502 if (!lower_transport_mask) { |
04c5f50dab62
Add a function rtsp_setup_output_streams for announcing the SDP
mstorsjo
parents:
5688
diff
changeset
|
1503 av_log(s, AV_LOG_ERROR, "Unsupported lower transport method, " |
5864
0ff0826b6c3d
Add support for TCP as lower transport in the RTSP muxer
mstorsjo
parents:
5862
diff
changeset
|
1504 "only UDP and TCP are supported for output.\n"); |
5689
04c5f50dab62
Add a function rtsp_setup_output_streams for announcing the SDP
mstorsjo
parents:
5688
diff
changeset
|
1505 err = AVERROR(EINVAL); |
04c5f50dab62
Add a function rtsp_setup_output_streams for announcing the SDP
mstorsjo
parents:
5688
diff
changeset
|
1506 goto fail; |
04c5f50dab62
Add a function rtsp_setup_output_streams for announcing the SDP
mstorsjo
parents:
5688
diff
changeset
|
1507 } |
04c5f50dab62
Add a function rtsp_setup_output_streams for announcing the SDP
mstorsjo
parents:
5688
diff
changeset
|
1508 } |
04c5f50dab62
Add a function rtsp_setup_output_streams for announcing the SDP
mstorsjo
parents:
5688
diff
changeset
|
1509 |
5894
51c410f2251b
Reassemble the RTSP URL before replacing hostname with the numerical IP
mstorsjo
parents:
5893
diff
changeset
|
1510 /* Construct the URI used in request; this is similar to s->filename, |
51c410f2251b
Reassemble the RTSP URL before replacing hostname with the numerical IP
mstorsjo
parents:
5893
diff
changeset
|
1511 * but with authentication credentials removed and RTSP specific options |
51c410f2251b
Reassemble the RTSP URL before replacing hostname with the numerical IP
mstorsjo
parents:
5893
diff
changeset
|
1512 * stripped out. */ |
51c410f2251b
Reassemble the RTSP URL before replacing hostname with the numerical IP
mstorsjo
parents:
5893
diff
changeset
|
1513 ff_url_join(rt->control_uri, sizeof(rt->control_uri), "rtsp", NULL, |
51c410f2251b
Reassemble the RTSP URL before replacing hostname with the numerical IP
mstorsjo
parents:
5893
diff
changeset
|
1514 host, port, "%s", path); |
51c410f2251b
Reassemble the RTSP URL before replacing hostname with the numerical IP
mstorsjo
parents:
5893
diff
changeset
|
1515 |
3147
91d65fdf91e1
Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents:
2884
diff
changeset
|
1516 /* open the tcp connexion */ |
5756
7c7fe75728dd
Use ff_url_join for assembling URLs, instead of snprintf
mstorsjo
parents:
5726
diff
changeset
|
1517 ff_url_join(tcpname, sizeof(tcpname), "tcp", NULL, host, port, NULL); |
5220
cad276e8f96e
RTSP basic authentication, patch originally by Philip Coombes
rbultje
parents:
5112
diff
changeset
|
1518 if (url_open(&rtsp_hd, tcpname, URL_RDWR) < 0) { |
cad276e8f96e
RTSP basic authentication, patch originally by Philip Coombes
rbultje
parents:
5112
diff
changeset
|
1519 err = AVERROR(EIO); |
cad276e8f96e
RTSP basic authentication, patch originally by Philip Coombes
rbultje
parents:
5112
diff
changeset
|
1520 goto fail; |
cad276e8f96e
RTSP basic authentication, patch originally by Philip Coombes
rbultje
parents:
5112
diff
changeset
|
1521 } |
3147
91d65fdf91e1
Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents:
2884
diff
changeset
|
1522 rt->rtsp_hd = rtsp_hd; |
91d65fdf91e1
Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents:
2884
diff
changeset
|
1523 rt->seq = 0; |
91d65fdf91e1
Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents:
2884
diff
changeset
|
1524 |
5798
2af44abfbfe8
RTSP: Resolve and use the actual IP address of the peer we're connected to,
mstorsjo
parents:
5776
diff
changeset
|
1525 tcp_fd = url_get_file_handle(rtsp_hd); |
2af44abfbfe8
RTSP: Resolve and use the actual IP address of the peer we're connected to,
mstorsjo
parents:
5776
diff
changeset
|
1526 if (!getpeername(tcp_fd, (struct sockaddr*) &peer, &peer_len)) { |
2af44abfbfe8
RTSP: Resolve and use the actual IP address of the peer we're connected to,
mstorsjo
parents:
5776
diff
changeset
|
1527 getnameinfo((struct sockaddr*) &peer, peer_len, host, sizeof(host), |
2af44abfbfe8
RTSP: Resolve and use the actual IP address of the peer we're connected to,
mstorsjo
parents:
5776
diff
changeset
|
1528 NULL, 0, NI_NUMERICHOST); |
2af44abfbfe8
RTSP: Resolve and use the actual IP address of the peer we're connected to,
mstorsjo
parents:
5776
diff
changeset
|
1529 } |
2af44abfbfe8
RTSP: Resolve and use the actual IP address of the peer we're connected to,
mstorsjo
parents:
5776
diff
changeset
|
1530 |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1531 /* request options supported by the server; this also detects server |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1532 * type */ |
3856 | 1533 for (rt->server_type = RTSP_SERVER_RTP;;) { |
5888
4ddbc14bc768
Add separate method/url parameters to the rtsp_send_cmd functions
mstorsjo
parents:
5887
diff
changeset
|
1534 cmd[0] = 0; |
3923
83e51bcb03c2
Rename RTSP_SERVER_RDT to RTSP_SERVER_REAL, because RDT (the transport
rbultje
parents:
3920
diff
changeset
|
1535 if (rt->server_type == RTSP_SERVER_REAL) |
3856 | 1536 av_strlcat(cmd, |
1537 /** | |
1538 * The following entries are required for proper | |
1539 * streaming from a Realmedia server. They are | |
1540 * interdependent in some way although we currently | |
1541 * don't quite understand how. Values were copied | |
1542 * from mplayer SVN r23589. | |
1543 * @param CompanyID is a 16-byte ID in base64 | |
1544 * @param ClientChallenge is a 16-byte ID in hex | |
1545 */ | |
1546 "ClientChallenge: 9e26d33f2984236010ef6253fb1887f7\r\n" | |
1547 "PlayerStarttime: [28/03/2003:22:50:23 00:00]\r\n" | |
1548 "CompanyID: KnKV4M4I/B2FjJ1TToLycw==\r\n" | |
1549 "GUID: 00000000-0000-0000-0000-000000000000\r\n", | |
1550 sizeof(cmd)); | |
5888
4ddbc14bc768
Add separate method/url parameters to the rtsp_send_cmd functions
mstorsjo
parents:
5887
diff
changeset
|
1551 ff_rtsp_send_cmd(s, "OPTIONS", rt->control_uri, cmd, reply, NULL); |
3856 | 1552 if (reply->status_code != RTSP_STATUS_OK) { |
1553 err = AVERROR_INVALIDDATA; | |
1554 goto fail; | |
1555 } | |
1556 | |
1557 /* detect server type if not standard-compliant RTP */ | |
3923
83e51bcb03c2
Rename RTSP_SERVER_RDT to RTSP_SERVER_REAL, because RDT (the transport
rbultje
parents:
3920
diff
changeset
|
1558 if (rt->server_type != RTSP_SERVER_REAL && reply->real_challenge[0]) { |
83e51bcb03c2
Rename RTSP_SERVER_RDT to RTSP_SERVER_REAL, because RDT (the transport
rbultje
parents:
3920
diff
changeset
|
1559 rt->server_type = RTSP_SERVER_REAL; |
3856 | 1560 continue; |
4169
619845a9bab3
Use the "server" RTSP field to detect whether the server that we're talking
rbultje
parents:
4168
diff
changeset
|
1561 } else if (!strncasecmp(reply->server, "WMServer/", 9)) { |
619845a9bab3
Use the "server" RTSP field to detect whether the server that we're talking
rbultje
parents:
4168
diff
changeset
|
1562 rt->server_type = RTSP_SERVER_WMS; |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1563 } else if (rt->server_type == RTSP_SERVER_REAL) |
3856 | 1564 strcpy(real_challenge, reply->real_challenge); |
1565 break; | |
1566 } | |
1567 | |
5689
04c5f50dab62
Add a function rtsp_setup_output_streams for announcing the SDP
mstorsjo
parents:
5688
diff
changeset
|
1568 if (s->iformat) |
5862
57fc219dc951
Use the caller's RTSPMessageHeader in rtsp_setup_input_streams
mstorsjo
parents:
5845
diff
changeset
|
1569 err = rtsp_setup_input_streams(s, reply); |
5689
04c5f50dab62
Add a function rtsp_setup_output_streams for announcing the SDP
mstorsjo
parents:
5688
diff
changeset
|
1570 else |
5819
53c5a5d40ee7
RTSP muxer: Create the SDP with the numerical IP of the peer
mstorsjo
parents:
5802
diff
changeset
|
1571 err = rtsp_setup_output_streams(s, host); |
5680
129679c03536
Split out input-specific parts of rtsp_read_header() into its own, new,
rbultje
parents:
5679
diff
changeset
|
1572 if (err) |
3147
91d65fdf91e1
Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents:
2884
diff
changeset
|
1573 goto fail; |
91d65fdf91e1
Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents:
2884
diff
changeset
|
1574 |
3149
5a7a7406ab1f
Allow cycling between different protocols (TCP, UDP or multicast) so that if
rbultje
parents:
3147
diff
changeset
|
1575 do { |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1576 int lower_transport = ff_log2_tab[lower_transport_mask & |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1577 ~(lower_transport_mask - 1)]; |
3149
5a7a7406ab1f
Allow cycling between different protocols (TCP, UDP or multicast) so that if
rbultje
parents:
3147
diff
changeset
|
1578 |
3957
9f943bb755f9
Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us
rbultje
parents:
3941
diff
changeset
|
1579 err = make_setup_request(s, host, port, lower_transport, |
3923
83e51bcb03c2
Rename RTSP_SERVER_RDT to RTSP_SERVER_REAL, because RDT (the transport
rbultje
parents:
3920
diff
changeset
|
1580 rt->server_type == RTSP_SERVER_REAL ? |
3876
1026953d4ffe
Implement Realmedia/RTSP-compatible SETUP command. This includes calculation
rbultje
parents:
3861
diff
changeset
|
1581 real_challenge : NULL); |
3149
5a7a7406ab1f
Allow cycling between different protocols (TCP, UDP or multicast) so that if
rbultje
parents:
3147
diff
changeset
|
1582 if (err < 0) |
3151 | 1583 goto fail; |
3957
9f943bb755f9
Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us
rbultje
parents:
3941
diff
changeset
|
1584 lower_transport_mask &= ~(1 << lower_transport); |
9f943bb755f9
Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us
rbultje
parents:
3941
diff
changeset
|
1585 if (lower_transport_mask == 0 && err == 1) { |
5955 | 1586 err = FF_NETERROR(EPROTONOSUPPORT); |
3149
5a7a7406ab1f
Allow cycling between different protocols (TCP, UDP or multicast) so that if
rbultje
parents:
3147
diff
changeset
|
1587 goto fail; |
5a7a7406ab1f
Allow cycling between different protocols (TCP, UDP or multicast) so that if
rbultje
parents:
3147
diff
changeset
|
1588 } |
5a7a7406ab1f
Allow cycling between different protocols (TCP, UDP or multicast) so that if
rbultje
parents:
3147
diff
changeset
|
1589 } while (err); |
3147
91d65fdf91e1
Split the SETUP request into a separate function, as a prelude into allowing
rbultje
parents:
2884
diff
changeset
|
1590 |
304
d58c8859ff8c
initial seek support - more generic play/pause support
bellard
parents:
294
diff
changeset
|
1591 rt->state = RTSP_STATE_IDLE; |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1592 rt->seek_timestamp = 0; /* default is to start stream at position zero */ |
0 | 1593 return 0; |
1594 fail: | |
5697 | 1595 ff_rtsp_close_streams(s); |
0 | 1596 url_close(rt->rtsp_hd); |
5690 | 1597 if (reply->status_code >=300 && reply->status_code < 400 && s->iformat) { |
5333 | 1598 av_strlcpy(s->filename, reply->location, sizeof(s->filename)); |
1599 av_log(s, AV_LOG_INFO, "Status %d: Redirecting to %s\n", | |
1600 reply->status_code, | |
1601 s->filename); | |
1602 goto redirect; | |
1603 } | |
5756
7c7fe75728dd
Use ff_url_join for assembling URLs, instead of snprintf
mstorsjo
parents:
5726
diff
changeset
|
1604 ff_network_close(); |
0 | 1605 return err; |
1606 } | |
5695 | 1607 #endif |
0 | 1608 |
5695 | 1609 #if CONFIG_RTSP_DEMUXER |
5681
7539c21106ef
Split rtsp_read_header() into two functions, so that the main part (now also
rbultje
parents:
5680
diff
changeset
|
1610 static int rtsp_read_header(AVFormatContext *s, |
7539c21106ef
Split rtsp_read_header() into two functions, so that the main part (now also
rbultje
parents:
5680
diff
changeset
|
1611 AVFormatParameters *ap) |
7539c21106ef
Split rtsp_read_header() into two functions, so that the main part (now also
rbultje
parents:
5680
diff
changeset
|
1612 { |
7539c21106ef
Split rtsp_read_header() into two functions, so that the main part (now also
rbultje
parents:
5680
diff
changeset
|
1613 RTSPState *rt = s->priv_data; |
7539c21106ef
Split rtsp_read_header() into two functions, so that the main part (now also
rbultje
parents:
5680
diff
changeset
|
1614 int ret; |
7539c21106ef
Split rtsp_read_header() into two functions, so that the main part (now also
rbultje
parents:
5680
diff
changeset
|
1615 |
5697 | 1616 ret = ff_rtsp_connect(s); |
5681
7539c21106ef
Split rtsp_read_header() into two functions, so that the main part (now also
rbultje
parents:
5680
diff
changeset
|
1617 if (ret) |
7539c21106ef
Split rtsp_read_header() into two functions, so that the main part (now also
rbultje
parents:
5680
diff
changeset
|
1618 return ret; |
7539c21106ef
Split rtsp_read_header() into two functions, so that the main part (now also
rbultje
parents:
5680
diff
changeset
|
1619 |
7539c21106ef
Split rtsp_read_header() into two functions, so that the main part (now also
rbultje
parents:
5680
diff
changeset
|
1620 if (ap->initial_pause) { |
7539c21106ef
Split rtsp_read_header() into two functions, so that the main part (now also
rbultje
parents:
5680
diff
changeset
|
1621 /* do not start immediately */ |
7539c21106ef
Split rtsp_read_header() into two functions, so that the main part (now also
rbultje
parents:
5680
diff
changeset
|
1622 } else { |
7539c21106ef
Split rtsp_read_header() into two functions, so that the main part (now also
rbultje
parents:
5680
diff
changeset
|
1623 if (rtsp_read_play(s) < 0) { |
5697 | 1624 ff_rtsp_close_streams(s); |
5681
7539c21106ef
Split rtsp_read_header() into two functions, so that the main part (now also
rbultje
parents:
5680
diff
changeset
|
1625 url_close(rt->rtsp_hd); |
7539c21106ef
Split rtsp_read_header() into two functions, so that the main part (now also
rbultje
parents:
5680
diff
changeset
|
1626 return AVERROR_INVALIDDATA; |
7539c21106ef
Split rtsp_read_header() into two functions, so that the main part (now also
rbultje
parents:
5680
diff
changeset
|
1627 } |
7539c21106ef
Split rtsp_read_header() into two functions, so that the main part (now also
rbultje
parents:
5680
diff
changeset
|
1628 } |
7539c21106ef
Split rtsp_read_header() into two functions, so that the main part (now also
rbultje
parents:
5680
diff
changeset
|
1629 |
7539c21106ef
Split rtsp_read_header() into two functions, so that the main part (now also
rbultje
parents:
5680
diff
changeset
|
1630 return 0; |
7539c21106ef
Split rtsp_read_header() into two functions, so that the main part (now also
rbultje
parents:
5680
diff
changeset
|
1631 } |
7539c21106ef
Split rtsp_read_header() into two functions, so that the main part (now also
rbultje
parents:
5680
diff
changeset
|
1632 |
5493 | 1633 static int udp_read_packet(AVFormatContext *s, RTSPStream **prtsp_st, |
1634 uint8_t *buf, int buf_size) | |
1635 { | |
1636 RTSPState *rt = s->priv_data; | |
1637 RTSPStream *rtsp_st; | |
1638 fd_set rfds; | |
5905
09a6916ecbf6
Add a timeout to the select() call. Patch by Sam Gerstein <sgerstein bluefinlab
rbultje
parents:
5894
diff
changeset
|
1639 int fd, fd_max, n, i, ret, tcp_fd, timeout_cnt = 0; |
5493 | 1640 struct timeval tv; |
1641 | |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1642 for (;;) { |
5493 | 1643 if (url_interrupt_cb()) |
1644 return AVERROR(EINTR); | |
1645 FD_ZERO(&rfds); | |
1646 if (rt->rtsp_hd) { | |
1647 tcp_fd = fd_max = url_get_file_handle(rt->rtsp_hd); | |
1648 FD_SET(tcp_fd, &rfds); | |
1649 } else { | |
1650 fd_max = 0; | |
1651 tcp_fd = -1; | |
1652 } | |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1653 for (i = 0; i < rt->nb_rtsp_streams; i++) { |
5493 | 1654 rtsp_st = rt->rtsp_streams[i]; |
1655 if (rtsp_st->rtp_handle) { | |
1656 /* currently, we cannot probe RTCP handle because of | |
1657 * blocking restrictions */ | |
1658 fd = url_get_file_handle(rtsp_st->rtp_handle); | |
1659 if (fd > fd_max) | |
1660 fd_max = fd; | |
1661 FD_SET(fd, &rfds); | |
1662 } | |
1663 } | |
1664 tv.tv_sec = 0; | |
5905
09a6916ecbf6
Add a timeout to the select() call. Patch by Sam Gerstein <sgerstein bluefinlab
rbultje
parents:
5894
diff
changeset
|
1665 tv.tv_usec = SELECT_TIMEOUT_MS * 1000; |
5493 | 1666 n = select(fd_max + 1, &rfds, NULL, NULL, &tv); |
1667 if (n > 0) { | |
5905
09a6916ecbf6
Add a timeout to the select() call. Patch by Sam Gerstein <sgerstein bluefinlab
rbultje
parents:
5894
diff
changeset
|
1668 timeout_cnt = 0; |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1669 for (i = 0; i < rt->nb_rtsp_streams; i++) { |
5493 | 1670 rtsp_st = rt->rtsp_streams[i]; |
1671 if (rtsp_st->rtp_handle) { | |
1672 fd = url_get_file_handle(rtsp_st->rtp_handle); | |
1673 if (FD_ISSET(fd, &rfds)) { | |
1674 ret = url_read(rtsp_st->rtp_handle, buf, buf_size); | |
1675 if (ret > 0) { | |
1676 *prtsp_st = rtsp_st; | |
1677 return ret; | |
1678 } | |
1679 } | |
1680 } | |
1681 } | |
1682 #if CONFIG_RTSP_DEMUXER | |
5589
dca2836e09b8
Don't use tcp_fd if we're not using TCP-based connections (e.g. when
rbultje
parents:
5574
diff
changeset
|
1683 if (tcp_fd != -1 && FD_ISSET(tcp_fd, &rfds)) { |
5493 | 1684 RTSPMessageHeader reply; |
1685 | |
5877
ba648dfcbe04
Handle errors returned from ff_rtsp_read_reply in udp_read_packet properly
mstorsjo
parents:
5871
diff
changeset
|
1686 ret = ff_rtsp_read_reply(s, &reply, NULL, 0); |
ba648dfcbe04
Handle errors returned from ff_rtsp_read_reply in udp_read_packet properly
mstorsjo
parents:
5871
diff
changeset
|
1687 if (ret < 0) |
ba648dfcbe04
Handle errors returned from ff_rtsp_read_reply in udp_read_packet properly
mstorsjo
parents:
5871
diff
changeset
|
1688 return ret; |
5493 | 1689 /* XXX: parse message */ |
5670
7fa188f69c22
Rename RTSP_STATE_PLAYING to _STREAMING, since that better covers the
rbultje
parents:
5667
diff
changeset
|
1690 if (rt->state != RTSP_STATE_STREAMING) |
5493 | 1691 return 0; |
1692 } | |
1693 #endif | |
5905
09a6916ecbf6
Add a timeout to the select() call. Patch by Sam Gerstein <sgerstein bluefinlab
rbultje
parents:
5894
diff
changeset
|
1694 } else if (n == 0 && ++timeout_cnt >= MAX_TIMEOUTS) { |
5954
1c93ef22cea6
Fix compile error on mingw where ETIMEDOUT is missing (because it's a WSA error).
rbultje
parents:
5933
diff
changeset
|
1695 return FF_NETERROR(ETIMEDOUT); |
5905
09a6916ecbf6
Add a timeout to the select() call. Patch by Sam Gerstein <sgerstein bluefinlab
rbultje
parents:
5894
diff
changeset
|
1696 } else if (n < 0 && errno != EINTR) |
09a6916ecbf6
Add a timeout to the select() call. Patch by Sam Gerstein <sgerstein bluefinlab
rbultje
parents:
5894
diff
changeset
|
1697 return AVERROR(errno); |
5493 | 1698 } |
1699 } | |
1700 | |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
229
diff
changeset
|
1701 static int tcp_read_packet(AVFormatContext *s, RTSPStream **prtsp_st, |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
229
diff
changeset
|
1702 uint8_t *buf, int buf_size) |
0 | 1703 { |
1704 RTSPState *rt = s->priv_data; | |
172 | 1705 int id, len, i, ret; |
0 | 1706 RTSPStream *rtsp_st; |
1707 | |
172 | 1708 #ifdef DEBUG_RTP_TCP |
4990 | 1709 dprintf(s, "tcp_read_packet:\n"); |
172 | 1710 #endif |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1711 redo: |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1712 for (;;) { |
4772
fb0b1e68356c
Allow (and parse) incoming server messages (notices) interleaved with TCP
rbultje
parents:
4745
diff
changeset
|
1713 RTSPMessageHeader reply; |
fb0b1e68356c
Allow (and parse) incoming server messages (notices) interleaved with TCP
rbultje
parents:
4745
diff
changeset
|
1714 |
5697 | 1715 ret = ff_rtsp_read_reply(s, &reply, NULL, 1); |
4772
fb0b1e68356c
Allow (and parse) incoming server messages (notices) interleaved with TCP
rbultje
parents:
4745
diff
changeset
|
1716 if (ret == -1) |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
229
diff
changeset
|
1717 return -1; |
4772
fb0b1e68356c
Allow (and parse) incoming server messages (notices) interleaved with TCP
rbultje
parents:
4745
diff
changeset
|
1718 if (ret == 1) /* received '$' */ |
0 | 1719 break; |
4772
fb0b1e68356c
Allow (and parse) incoming server messages (notices) interleaved with TCP
rbultje
parents:
4745
diff
changeset
|
1720 /* XXX: parse message */ |
5670
7fa188f69c22
Rename RTSP_STATE_PLAYING to _STREAMING, since that better covers the
rbultje
parents:
5667
diff
changeset
|
1721 if (rt->state != RTSP_STATE_STREAMING) |
5112
85e0a9761818
Implement support for EOS as used by WMS and other RTSP servers that do not
rbultje
parents:
5013
diff
changeset
|
1722 return 0; |
0 | 1723 } |
5004
84a7b7a2f252
Move function for reading whole specified amount of data from RTSP
kostya
parents:
4990
diff
changeset
|
1724 ret = url_read_complete(rt->rtsp_hd, buf, 3); |
172 | 1725 if (ret != 3) |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
229
diff
changeset
|
1726 return -1; |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1727 id = buf[0]; |
2222 | 1728 len = AV_RB16(buf + 1); |
172 | 1729 #ifdef DEBUG_RTP_TCP |
4990 | 1730 dprintf(s, "id=%d len=%d\n", id, len); |
172 | 1731 #endif |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
229
diff
changeset
|
1732 if (len > buf_size || len < 12) |
0 | 1733 goto redo; |
1734 /* get the data */ | |
5004
84a7b7a2f252
Move function for reading whole specified amount of data from RTSP
kostya
parents:
4990
diff
changeset
|
1735 ret = url_read_complete(rt->rtsp_hd, buf, len); |
172 | 1736 if (ret != len) |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
229
diff
changeset
|
1737 return -1; |
3962
72efef66f566
This patch refactors RDT packet header parsing so that it can be used in
rbultje
parents:
3961
diff
changeset
|
1738 if (rt->transport == RTSP_TRANSPORT_RDT && |
4029
9a0a46d465ae
Add is_keyframe param to ff_rdt_parse_header(). See ML discussion in
rbultje
parents:
4026
diff
changeset
|
1739 ff_rdt_parse_header(buf, len, &id, NULL, NULL, NULL, NULL) < 0) |
3962
72efef66f566
This patch refactors RDT packet header parsing so that it can be used in
rbultje
parents:
3961
diff
changeset
|
1740 return -1; |
885 | 1741 |
0 | 1742 /* find the matching stream */ |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1743 for (i = 0; i < rt->nb_rtsp_streams; i++) { |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
229
diff
changeset
|
1744 rtsp_st = rt->rtsp_streams[i]; |
885 | 1745 if (id >= rtsp_st->interleaved_min && |
1746 id <= rtsp_st->interleaved_max) | |
0 | 1747 goto found; |
1748 } | |
1749 goto redo; | |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1750 found: |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
229
diff
changeset
|
1751 *prtsp_st = rtsp_st; |
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
229
diff
changeset
|
1752 return len; |
0 | 1753 } |
1754 | |
5493 | 1755 static int rtsp_fetch_packet(AVFormatContext *s, AVPacket *pkt) |
1756 { | |
1757 RTSPState *rt = s->priv_data; | |
1758 int ret, len; | |
1759 uint8_t buf[10 * RTP_MAX_PACKET_LENGTH]; | |
1760 RTSPStream *rtsp_st; | |
1761 | |
1762 /* get next frames from the same RTP packet */ | |
1763 if (rt->cur_transport_priv) { | |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1764 if (rt->transport == RTSP_TRANSPORT_RDT) { |
5493 | 1765 ret = ff_rdt_parse_packet(rt->cur_transport_priv, pkt, NULL, 0); |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1766 } else |
5493 | 1767 ret = rtp_parse_packet(rt->cur_transport_priv, pkt, NULL, 0); |
1768 if (ret == 0) { | |
1769 rt->cur_transport_priv = NULL; | |
1770 return 0; | |
1771 } else if (ret == 1) { | |
1772 return 0; | |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1773 } else |
5493 | 1774 rt->cur_transport_priv = NULL; |
1775 } | |
1776 | |
1777 /* read next RTP packet */ | |
1778 redo: | |
1779 switch(rt->lower_transport) { | |
1780 default: | |
1781 #if CONFIG_RTSP_DEMUXER | |
1782 case RTSP_LOWER_TRANSPORT_TCP: | |
1783 len = tcp_read_packet(s, &rtsp_st, buf, sizeof(buf)); | |
1784 break; | |
1785 #endif | |
1786 case RTSP_LOWER_TRANSPORT_UDP: | |
1787 case RTSP_LOWER_TRANSPORT_UDP_MULTICAST: | |
1788 len = udp_read_packet(s, &rtsp_st, buf, sizeof(buf)); | |
1789 if (len >=0 && rtsp_st->transport_priv && rt->transport == RTSP_TRANSPORT_RTP) | |
1790 rtp_check_and_send_back_rr(rtsp_st->transport_priv, len); | |
1791 break; | |
1792 } | |
1793 if (len < 0) | |
1794 return len; | |
1795 if (len == 0) | |
1796 return AVERROR_EOF; | |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1797 if (rt->transport == RTSP_TRANSPORT_RDT) { |
5493 | 1798 ret = ff_rdt_parse_packet(rtsp_st->transport_priv, pkt, buf, len); |
5966
9a86b49201bb
Revert svn rev 21857, readd first_rtcp_ntp_time in RTPDemuxContext
mstorsjo
parents:
5955
diff
changeset
|
1799 } else { |
5493 | 1800 ret = rtp_parse_packet(rtsp_st->transport_priv, pkt, buf, len); |
5966
9a86b49201bb
Revert svn rev 21857, readd first_rtcp_ntp_time in RTPDemuxContext
mstorsjo
parents:
5955
diff
changeset
|
1801 if (ret < 0) { |
9a86b49201bb
Revert svn rev 21857, readd first_rtcp_ntp_time in RTPDemuxContext
mstorsjo
parents:
5955
diff
changeset
|
1802 /* Either bad packet, or a RTCP packet. Check if the |
9a86b49201bb
Revert svn rev 21857, readd first_rtcp_ntp_time in RTPDemuxContext
mstorsjo
parents:
5955
diff
changeset
|
1803 * first_rtcp_ntp_time field was initialized. */ |
9a86b49201bb
Revert svn rev 21857, readd first_rtcp_ntp_time in RTPDemuxContext
mstorsjo
parents:
5955
diff
changeset
|
1804 RTPDemuxContext *rtpctx = rtsp_st->transport_priv; |
9a86b49201bb
Revert svn rev 21857, readd first_rtcp_ntp_time in RTPDemuxContext
mstorsjo
parents:
5955
diff
changeset
|
1805 if (rtpctx->first_rtcp_ntp_time != AV_NOPTS_VALUE) { |
9a86b49201bb
Revert svn rev 21857, readd first_rtcp_ntp_time in RTPDemuxContext
mstorsjo
parents:
5955
diff
changeset
|
1806 /* first_rtcp_ntp_time has been initialized for this stream, |
9a86b49201bb
Revert svn rev 21857, readd first_rtcp_ntp_time in RTPDemuxContext
mstorsjo
parents:
5955
diff
changeset
|
1807 * copy the same value to all other uninitialized streams, |
9a86b49201bb
Revert svn rev 21857, readd first_rtcp_ntp_time in RTPDemuxContext
mstorsjo
parents:
5955
diff
changeset
|
1808 * in order to map their timestamp origin to the same ntp time |
9a86b49201bb
Revert svn rev 21857, readd first_rtcp_ntp_time in RTPDemuxContext
mstorsjo
parents:
5955
diff
changeset
|
1809 * as this one. */ |
9a86b49201bb
Revert svn rev 21857, readd first_rtcp_ntp_time in RTPDemuxContext
mstorsjo
parents:
5955
diff
changeset
|
1810 int i; |
9a86b49201bb
Revert svn rev 21857, readd first_rtcp_ntp_time in RTPDemuxContext
mstorsjo
parents:
5955
diff
changeset
|
1811 for (i = 0; i < rt->nb_rtsp_streams; i++) { |
9a86b49201bb
Revert svn rev 21857, readd first_rtcp_ntp_time in RTPDemuxContext
mstorsjo
parents:
5955
diff
changeset
|
1812 RTPDemuxContext *rtpctx2 = rtsp_st->transport_priv; |
9a86b49201bb
Revert svn rev 21857, readd first_rtcp_ntp_time in RTPDemuxContext
mstorsjo
parents:
5955
diff
changeset
|
1813 if (rtpctx2 && |
9a86b49201bb
Revert svn rev 21857, readd first_rtcp_ntp_time in RTPDemuxContext
mstorsjo
parents:
5955
diff
changeset
|
1814 rtpctx2->first_rtcp_ntp_time == AV_NOPTS_VALUE) |
9a86b49201bb
Revert svn rev 21857, readd first_rtcp_ntp_time in RTPDemuxContext
mstorsjo
parents:
5955
diff
changeset
|
1815 rtpctx2->first_rtcp_ntp_time = rtpctx->first_rtcp_ntp_time; |
9a86b49201bb
Revert svn rev 21857, readd first_rtcp_ntp_time in RTPDemuxContext
mstorsjo
parents:
5955
diff
changeset
|
1816 } |
9a86b49201bb
Revert svn rev 21857, readd first_rtcp_ntp_time in RTPDemuxContext
mstorsjo
parents:
5955
diff
changeset
|
1817 } |
9a86b49201bb
Revert svn rev 21857, readd first_rtcp_ntp_time in RTPDemuxContext
mstorsjo
parents:
5955
diff
changeset
|
1818 } |
9a86b49201bb
Revert svn rev 21857, readd first_rtcp_ntp_time in RTPDemuxContext
mstorsjo
parents:
5955
diff
changeset
|
1819 } |
5493 | 1820 if (ret < 0) |
1821 goto redo; | |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1822 if (ret == 1) |
5493 | 1823 /* more packets may follow, so we save the RTP context */ |
1824 rt->cur_transport_priv = rtsp_st->transport_priv; | |
1825 | |
1826 return ret; | |
1827 } | |
1828 | |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1829 static int rtsp_read_packet(AVFormatContext *s, AVPacket *pkt) |
0 | 1830 { |
1831 RTSPState *rt = s->priv_data; | |
5366
a04be95927ac
Split the sdp_read_packet() function out of rtsp_read_packet().
lucabe
parents:
5365
diff
changeset
|
1832 int ret; |
4877
940946a4569b
Send dummy requests over the TCP connection (WMS wants GET_PARAMETER,
rbultje
parents:
4875
diff
changeset
|
1833 RTSPMessageHeader reply1, *reply = &reply1; |
940946a4569b
Send dummy requests over the TCP connection (WMS wants GET_PARAMETER,
rbultje
parents:
4875
diff
changeset
|
1834 char cmd[1024]; |
0 | 1835 |
4166
1dbda91eaebd
Allow subscription to any of the streams, not just the first, available in
rbultje
parents:
4165
diff
changeset
|
1836 if (rt->server_type == RTSP_SERVER_REAL) { |
3903
aeb79f68ba7e
Implement a RDT-specific SET_PARAMETER command that subscribes to the
rbultje
parents:
3877
diff
changeset
|
1837 int i; |
4166
1dbda91eaebd
Allow subscription to any of the streams, not just the first, available in
rbultje
parents:
4165
diff
changeset
|
1838 enum AVDiscard cache[MAX_STREAMS]; |
3903
aeb79f68ba7e
Implement a RDT-specific SET_PARAMETER command that subscribes to the
rbultje
parents:
3877
diff
changeset
|
1839 |
4166
1dbda91eaebd
Allow subscription to any of the streams, not just the first, available in
rbultje
parents:
4165
diff
changeset
|
1840 for (i = 0; i < s->nb_streams; i++) |
1dbda91eaebd
Allow subscription to any of the streams, not just the first, available in
rbultje
parents:
4165
diff
changeset
|
1841 cache[i] = s->streams[i]->discard; |
1dbda91eaebd
Allow subscription to any of the streams, not just the first, available in
rbultje
parents:
4165
diff
changeset
|
1842 |
1dbda91eaebd
Allow subscription to any of the streams, not just the first, available in
rbultje
parents:
4165
diff
changeset
|
1843 if (!rt->need_subscription) { |
1dbda91eaebd
Allow subscription to any of the streams, not just the first, available in
rbultje
parents:
4165
diff
changeset
|
1844 if (memcmp (cache, rt->real_setup_cache, |
1dbda91eaebd
Allow subscription to any of the streams, not just the first, available in
rbultje
parents:
4165
diff
changeset
|
1845 sizeof(enum AVDiscard) * s->nb_streams)) { |
5569
346dce85a801
Pretty embarassing bug; we shouldn't use av_strlcatf() on an uninitialized
rbultje
parents:
5529
diff
changeset
|
1846 snprintf(cmd, sizeof(cmd), |
5570 | 1847 "Unsubscribe: %s\r\n", |
5888
4ddbc14bc768
Add separate method/url parameters to the rtsp_send_cmd functions
mstorsjo
parents:
5887
diff
changeset
|
1848 rt->last_subscription); |
4ddbc14bc768
Add separate method/url parameters to the rtsp_send_cmd functions
mstorsjo
parents:
5887
diff
changeset
|
1849 ff_rtsp_send_cmd(s, "SET_PARAMETER", rt->control_uri, |
4ddbc14bc768
Add separate method/url parameters to the rtsp_send_cmd functions
mstorsjo
parents:
5887
diff
changeset
|
1850 cmd, reply, NULL); |
4166
1dbda91eaebd
Allow subscription to any of the streams, not just the first, available in
rbultje
parents:
4165
diff
changeset
|
1851 if (reply->status_code != RTSP_STATUS_OK) |
1dbda91eaebd
Allow subscription to any of the streams, not just the first, available in
rbultje
parents:
4165
diff
changeset
|
1852 return AVERROR_INVALIDDATA; |
1dbda91eaebd
Allow subscription to any of the streams, not just the first, available in
rbultje
parents:
4165
diff
changeset
|
1853 rt->need_subscription = 1; |
1dbda91eaebd
Allow subscription to any of the streams, not just the first, available in
rbultje
parents:
4165
diff
changeset
|
1854 } |
3903
aeb79f68ba7e
Implement a RDT-specific SET_PARAMETER command that subscribes to the
rbultje
parents:
3877
diff
changeset
|
1855 } |
4166
1dbda91eaebd
Allow subscription to any of the streams, not just the first, available in
rbultje
parents:
4165
diff
changeset
|
1856 |
1dbda91eaebd
Allow subscription to any of the streams, not just the first, available in
rbultje
parents:
4165
diff
changeset
|
1857 if (rt->need_subscription) { |
1dbda91eaebd
Allow subscription to any of the streams, not just the first, available in
rbultje
parents:
4165
diff
changeset
|
1858 int r, rule_nr, first = 1; |
1dbda91eaebd
Allow subscription to any of the streams, not just the first, available in
rbultje
parents:
4165
diff
changeset
|
1859 |
1dbda91eaebd
Allow subscription to any of the streams, not just the first, available in
rbultje
parents:
4165
diff
changeset
|
1860 memcpy(rt->real_setup_cache, cache, |
1dbda91eaebd
Allow subscription to any of the streams, not just the first, available in
rbultje
parents:
4165
diff
changeset
|
1861 sizeof(enum AVDiscard) * s->nb_streams); |
1dbda91eaebd
Allow subscription to any of the streams, not just the first, available in
rbultje
parents:
4165
diff
changeset
|
1862 rt->last_subscription[0] = 0; |
3903
aeb79f68ba7e
Implement a RDT-specific SET_PARAMETER command that subscribes to the
rbultje
parents:
3877
diff
changeset
|
1863 |
4166
1dbda91eaebd
Allow subscription to any of the streams, not just the first, available in
rbultje
parents:
4165
diff
changeset
|
1864 snprintf(cmd, sizeof(cmd), |
5888
4ddbc14bc768
Add separate method/url parameters to the rtsp_send_cmd functions
mstorsjo
parents:
5887
diff
changeset
|
1865 "Subscribe: "); |
4166
1dbda91eaebd
Allow subscription to any of the streams, not just the first, available in
rbultje
parents:
4165
diff
changeset
|
1866 for (i = 0; i < rt->nb_rtsp_streams; i++) { |
1dbda91eaebd
Allow subscription to any of the streams, not just the first, available in
rbultje
parents:
4165
diff
changeset
|
1867 rule_nr = 0; |
1dbda91eaebd
Allow subscription to any of the streams, not just the first, available in
rbultje
parents:
4165
diff
changeset
|
1868 for (r = 0; r < s->nb_streams; r++) { |
1dbda91eaebd
Allow subscription to any of the streams, not just the first, available in
rbultje
parents:
4165
diff
changeset
|
1869 if (s->streams[r]->priv_data == rt->rtsp_streams[i]) { |
1dbda91eaebd
Allow subscription to any of the streams, not just the first, available in
rbultje
parents:
4165
diff
changeset
|
1870 if (s->streams[r]->discard != AVDISCARD_ALL) { |
1dbda91eaebd
Allow subscription to any of the streams, not just the first, available in
rbultje
parents:
4165
diff
changeset
|
1871 if (!first) |
1dbda91eaebd
Allow subscription to any of the streams, not just the first, available in
rbultje
parents:
4165
diff
changeset
|
1872 av_strlcat(rt->last_subscription, ",", |
1dbda91eaebd
Allow subscription to any of the streams, not just the first, available in
rbultje
parents:
4165
diff
changeset
|
1873 sizeof(rt->last_subscription)); |
1dbda91eaebd
Allow subscription to any of the streams, not just the first, available in
rbultje
parents:
4165
diff
changeset
|
1874 ff_rdt_subscribe_rule( |
1dbda91eaebd
Allow subscription to any of the streams, not just the first, available in
rbultje
parents:
4165
diff
changeset
|
1875 rt->last_subscription, |
1dbda91eaebd
Allow subscription to any of the streams, not just the first, available in
rbultje
parents:
4165
diff
changeset
|
1876 sizeof(rt->last_subscription), i, rule_nr); |
1dbda91eaebd
Allow subscription to any of the streams, not just the first, available in
rbultje
parents:
4165
diff
changeset
|
1877 first = 0; |
1dbda91eaebd
Allow subscription to any of the streams, not just the first, available in
rbultje
parents:
4165
diff
changeset
|
1878 } |
1dbda91eaebd
Allow subscription to any of the streams, not just the first, available in
rbultje
parents:
4165
diff
changeset
|
1879 rule_nr++; |
1dbda91eaebd
Allow subscription to any of the streams, not just the first, available in
rbultje
parents:
4165
diff
changeset
|
1880 } |
1dbda91eaebd
Allow subscription to any of the streams, not just the first, available in
rbultje
parents:
4165
diff
changeset
|
1881 } |
1dbda91eaebd
Allow subscription to any of the streams, not just the first, available in
rbultje
parents:
4165
diff
changeset
|
1882 } |
1dbda91eaebd
Allow subscription to any of the streams, not just the first, available in
rbultje
parents:
4165
diff
changeset
|
1883 av_strlcatf(cmd, sizeof(cmd), "%s\r\n", rt->last_subscription); |
5888
4ddbc14bc768
Add separate method/url parameters to the rtsp_send_cmd functions
mstorsjo
parents:
5887
diff
changeset
|
1884 ff_rtsp_send_cmd(s, "SET_PARAMETER", rt->control_uri, |
4ddbc14bc768
Add separate method/url parameters to the rtsp_send_cmd functions
mstorsjo
parents:
5887
diff
changeset
|
1885 cmd, reply, NULL); |
4166
1dbda91eaebd
Allow subscription to any of the streams, not just the first, available in
rbultje
parents:
4165
diff
changeset
|
1886 if (reply->status_code != RTSP_STATUS_OK) |
1dbda91eaebd
Allow subscription to any of the streams, not just the first, available in
rbultje
parents:
4165
diff
changeset
|
1887 return AVERROR_INVALIDDATA; |
1dbda91eaebd
Allow subscription to any of the streams, not just the first, available in
rbultje
parents:
4165
diff
changeset
|
1888 rt->need_subscription = 0; |
1dbda91eaebd
Allow subscription to any of the streams, not just the first, available in
rbultje
parents:
4165
diff
changeset
|
1889 |
5670
7fa188f69c22
Rename RTSP_STATE_PLAYING to _STREAMING, since that better covers the
rbultje
parents:
5667
diff
changeset
|
1890 if (rt->state == RTSP_STATE_STREAMING) |
4166
1dbda91eaebd
Allow subscription to any of the streams, not just the first, available in
rbultje
parents:
4165
diff
changeset
|
1891 rtsp_read_play (s); |
1dbda91eaebd
Allow subscription to any of the streams, not just the first, available in
rbultje
parents:
4165
diff
changeset
|
1892 } |
3903
aeb79f68ba7e
Implement a RDT-specific SET_PARAMETER command that subscribes to the
rbultje
parents:
3877
diff
changeset
|
1893 } |
aeb79f68ba7e
Implement a RDT-specific SET_PARAMETER command that subscribes to the
rbultje
parents:
3877
diff
changeset
|
1894 |
5480 | 1895 ret = rtsp_fetch_packet(s, pkt); |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1896 if (ret < 0) |
5366
a04be95927ac
Split the sdp_read_packet() function out of rtsp_read_packet().
lucabe
parents:
5365
diff
changeset
|
1897 return ret; |
4877
940946a4569b
Send dummy requests over the TCP connection (WMS wants GET_PARAMETER,
rbultje
parents:
4875
diff
changeset
|
1898 |
940946a4569b
Send dummy requests over the TCP connection (WMS wants GET_PARAMETER,
rbultje
parents:
4875
diff
changeset
|
1899 /* send dummy request to keep TCP connection alive */ |
940946a4569b
Send dummy requests over the TCP connection (WMS wants GET_PARAMETER,
rbultje
parents:
4875
diff
changeset
|
1900 if ((rt->server_type == RTSP_SERVER_WMS || |
940946a4569b
Send dummy requests over the TCP connection (WMS wants GET_PARAMETER,
rbultje
parents:
4875
diff
changeset
|
1901 rt->server_type == RTSP_SERVER_REAL) && |
940946a4569b
Send dummy requests over the TCP connection (WMS wants GET_PARAMETER,
rbultje
parents:
4875
diff
changeset
|
1902 (av_gettime() - rt->last_cmd_time) / 1000000 >= rt->timeout / 2) { |
940946a4569b
Send dummy requests over the TCP connection (WMS wants GET_PARAMETER,
rbultje
parents:
4875
diff
changeset
|
1903 if (rt->server_type == RTSP_SERVER_WMS) { |
5888
4ddbc14bc768
Add separate method/url parameters to the rtsp_send_cmd functions
mstorsjo
parents:
5887
diff
changeset
|
1904 ff_rtsp_send_cmd_async(s, "GET_PARAMETER", rt->control_uri, NULL); |
4877
940946a4569b
Send dummy requests over the TCP connection (WMS wants GET_PARAMETER,
rbultje
parents:
4875
diff
changeset
|
1905 } else { |
5888
4ddbc14bc768
Add separate method/url parameters to the rtsp_send_cmd functions
mstorsjo
parents:
5887
diff
changeset
|
1906 ff_rtsp_send_cmd_async(s, "OPTIONS", "*", NULL); |
4877
940946a4569b
Send dummy requests over the TCP connection (WMS wants GET_PARAMETER,
rbultje
parents:
4875
diff
changeset
|
1907 } |
940946a4569b
Send dummy requests over the TCP connection (WMS wants GET_PARAMETER,
rbultje
parents:
4875
diff
changeset
|
1908 } |
940946a4569b
Send dummy requests over the TCP connection (WMS wants GET_PARAMETER,
rbultje
parents:
4875
diff
changeset
|
1909 |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
229
diff
changeset
|
1910 return 0; |
0 | 1911 } |
1912 | |
304
d58c8859ff8c
initial seek support - more generic play/pause support
bellard
parents:
294
diff
changeset
|
1913 /* pause the stream */ |
d58c8859ff8c
initial seek support - more generic play/pause support
bellard
parents:
294
diff
changeset
|
1914 static int rtsp_read_pause(AVFormatContext *s) |
d58c8859ff8c
initial seek support - more generic play/pause support
bellard
parents:
294
diff
changeset
|
1915 { |
d58c8859ff8c
initial seek support - more generic play/pause support
bellard
parents:
294
diff
changeset
|
1916 RTSPState *rt = s->priv_data; |
4557
bfe6fb676d46
Rename RTSPHeader to RTSPMessageHeader to reflect more clearly what the
rbultje
parents:
4549
diff
changeset
|
1917 RTSPMessageHeader reply1, *reply = &reply1; |
304
d58c8859ff8c
initial seek support - more generic play/pause support
bellard
parents:
294
diff
changeset
|
1918 |
5670
7fa188f69c22
Rename RTSP_STATE_PLAYING to _STREAMING, since that better covers the
rbultje
parents:
5667
diff
changeset
|
1919 if (rt->state != RTSP_STATE_STREAMING) |
304
d58c8859ff8c
initial seek support - more generic play/pause support
bellard
parents:
294
diff
changeset
|
1920 return 0; |
3923
83e51bcb03c2
Rename RTSP_SERVER_RDT to RTSP_SERVER_REAL, because RDT (the transport
rbultje
parents:
3920
diff
changeset
|
1921 else if (!(rt->server_type == RTSP_SERVER_REAL && rt->need_subscription)) { |
5888
4ddbc14bc768
Add separate method/url parameters to the rtsp_send_cmd functions
mstorsjo
parents:
5887
diff
changeset
|
1922 ff_rtsp_send_cmd(s, "PAUSE", rt->control_uri, NULL, reply, NULL); |
3904 | 1923 if (reply->status_code != RTSP_STATUS_OK) { |
1924 return -1; | |
1925 } | |
3903
aeb79f68ba7e
Implement a RDT-specific SET_PARAMETER command that subscribes to the
rbultje
parents:
3877
diff
changeset
|
1926 } |
3861
a0098594ab90
Remove useless "else" case in if X { A; return }; else { B }. See discussion
rbultje
parents:
3860
diff
changeset
|
1927 rt->state = RTSP_STATE_PAUSED; |
a0098594ab90
Remove useless "else" case in if X { A; return }; else { B }. See discussion
rbultje
parents:
3860
diff
changeset
|
1928 return 0; |
179 | 1929 } |
1930 | |
885 | 1931 static int rtsp_read_seek(AVFormatContext *s, int stream_index, |
558 | 1932 int64_t timestamp, int flags) |
179 | 1933 { |
304
d58c8859ff8c
initial seek support - more generic play/pause support
bellard
parents:
294
diff
changeset
|
1934 RTSPState *rt = s->priv_data; |
885 | 1935 |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1936 rt->seek_timestamp = av_rescale_q(timestamp, |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1937 s->streams[stream_index]->time_base, |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1938 AV_TIME_BASE_Q); |
304
d58c8859ff8c
initial seek support - more generic play/pause support
bellard
parents:
294
diff
changeset
|
1939 switch(rt->state) { |
d58c8859ff8c
initial seek support - more generic play/pause support
bellard
parents:
294
diff
changeset
|
1940 default: |
d58c8859ff8c
initial seek support - more generic play/pause support
bellard
parents:
294
diff
changeset
|
1941 case RTSP_STATE_IDLE: |
d58c8859ff8c
initial seek support - more generic play/pause support
bellard
parents:
294
diff
changeset
|
1942 break; |
5670
7fa188f69c22
Rename RTSP_STATE_PLAYING to _STREAMING, since that better covers the
rbultje
parents:
5667
diff
changeset
|
1943 case RTSP_STATE_STREAMING: |
5013 | 1944 if (rtsp_read_pause(s) != 0) |
1945 return -1; | |
1946 rt->state = RTSP_STATE_SEEKING; | |
304
d58c8859ff8c
initial seek support - more generic play/pause support
bellard
parents:
294
diff
changeset
|
1947 if (rtsp_read_play(s) != 0) |
d58c8859ff8c
initial seek support - more generic play/pause support
bellard
parents:
294
diff
changeset
|
1948 return -1; |
d58c8859ff8c
initial seek support - more generic play/pause support
bellard
parents:
294
diff
changeset
|
1949 break; |
d58c8859ff8c
initial seek support - more generic play/pause support
bellard
parents:
294
diff
changeset
|
1950 case RTSP_STATE_PAUSED: |
d58c8859ff8c
initial seek support - more generic play/pause support
bellard
parents:
294
diff
changeset
|
1951 rt->state = RTSP_STATE_IDLE; |
d58c8859ff8c
initial seek support - more generic play/pause support
bellard
parents:
294
diff
changeset
|
1952 break; |
179 | 1953 } |
304
d58c8859ff8c
initial seek support - more generic play/pause support
bellard
parents:
294
diff
changeset
|
1954 return 0; |
179 | 1955 } |
1956 | |
0 | 1957 static int rtsp_read_close(AVFormatContext *s) |
1958 { | |
1959 RTSPState *rt = s->priv_data; | |
1960 | |
172 | 1961 #if 0 |
0 | 1962 /* NOTE: it is valid to flush the buffer here */ |
3957
9f943bb755f9
Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us
rbultje
parents:
3941
diff
changeset
|
1963 if (rt->lower_transport == RTSP_LOWER_TRANSPORT_TCP) { |
0 | 1964 url_fclose(&rt->rtsp_gb); |
1965 } | |
172 | 1966 #endif |
5888
4ddbc14bc768
Add separate method/url parameters to the rtsp_send_cmd functions
mstorsjo
parents:
5887
diff
changeset
|
1967 ff_rtsp_send_cmd_async(s, "TEARDOWN", rt->control_uri, NULL); |
0 | 1968 |
5697 | 1969 ff_rtsp_close_streams(s); |
0 | 1970 url_close(rt->rtsp_hd); |
5756
7c7fe75728dd
Use ff_url_join for assembling URLs, instead of snprintf
mstorsjo
parents:
5726
diff
changeset
|
1971 ff_network_close(); |
0 | 1972 return 0; |
1973 } | |
1974 | |
1167 | 1975 AVInputFormat rtsp_demuxer = { |
0 | 1976 "rtsp", |
3424
7a0230981402
Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents:
3286
diff
changeset
|
1977 NULL_IF_CONFIG_SMALL("RTSP input format"), |
0 | 1978 sizeof(RTSPState), |
1979 rtsp_probe, | |
1980 rtsp_read_header, | |
1981 rtsp_read_packet, | |
1982 rtsp_read_close, | |
304
d58c8859ff8c
initial seek support - more generic play/pause support
bellard
parents:
294
diff
changeset
|
1983 rtsp_read_seek, |
0 | 1984 .flags = AVFMT_NOFILE, |
304
d58c8859ff8c
initial seek support - more generic play/pause support
bellard
parents:
294
diff
changeset
|
1985 .read_play = rtsp_read_play, |
d58c8859ff8c
initial seek support - more generic play/pause support
bellard
parents:
294
diff
changeset
|
1986 .read_pause = rtsp_read_pause, |
0 | 1987 }; |
2054 | 1988 #endif |
0 | 1989 |
1990 static int sdp_probe(AVProbeData *p1) | |
1991 { | |
706
fc254f396f15
buffer overflow in sdp_probe() fix by (Gildas Bazin )gbazin altern org)
michael
parents:
587
diff
changeset
|
1992 const char *p = p1->buf, *p_end = p1->buf + p1->buf_size; |
0 | 1993 |
1994 /* we look for a line beginning "c=IN IP4" */ | |
706
fc254f396f15
buffer overflow in sdp_probe() fix by (Gildas Bazin )gbazin altern org)
michael
parents:
587
diff
changeset
|
1995 while (p < p_end && *p != '\0') { |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1996 if (p + sizeof("c=IN IP4") - 1 < p_end && |
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
1997 av_strstart(p, "c=IN IP4", NULL)) |
0 | 1998 return AVPROBE_SCORE_MAX / 2; |
706
fc254f396f15
buffer overflow in sdp_probe() fix by (Gildas Bazin )gbazin altern org)
michael
parents:
587
diff
changeset
|
1999 |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
2000 while (p < p_end - 1 && *p != '\n') p++; |
706
fc254f396f15
buffer overflow in sdp_probe() fix by (Gildas Bazin )gbazin altern org)
michael
parents:
587
diff
changeset
|
2001 if (++p >= p_end) |
0 | 2002 break; |
2003 if (*p == '\r') | |
2004 p++; | |
2005 } | |
2006 return 0; | |
2007 } | |
2008 | |
2009 #define SDP_MAX_SIZE 8192 | |
2010 | |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
2011 static int sdp_read_header(AVFormatContext *s, AVFormatParameters *ap) |
0 | 2012 { |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
229
diff
changeset
|
2013 RTSPState *rt = s->priv_data; |
0 | 2014 RTSPStream *rtsp_st; |
2015 int size, i, err; | |
2016 char *content; | |
2017 char url[1024]; | |
2018 | |
5756
7c7fe75728dd
Use ff_url_join for assembling URLs, instead of snprintf
mstorsjo
parents:
5726
diff
changeset
|
2019 if (!ff_network_init()) |
7c7fe75728dd
Use ff_url_join for assembling URLs, instead of snprintf
mstorsjo
parents:
5726
diff
changeset
|
2020 return AVERROR(EIO); |
7c7fe75728dd
Use ff_url_join for assembling URLs, instead of snprintf
mstorsjo
parents:
5726
diff
changeset
|
2021 |
0 | 2022 /* read the whole sdp file */ |
2023 /* XXX: better loading */ | |
2024 content = av_malloc(SDP_MAX_SIZE); | |
2771
d52c718e83f9
Use dynamically allocated ByteIOContext in AVFormatContext
andoma
parents:
2759
diff
changeset
|
2025 size = get_buffer(s->pb, content, SDP_MAX_SIZE - 1); |
0 | 2026 if (size <= 0) { |
2027 av_free(content); | |
2028 return AVERROR_INVALIDDATA; | |
2029 } | |
2030 content[size] ='\0'; | |
2031 | |
2032 sdp_parse(s, content); | |
2033 av_free(content); | |
2034 | |
2035 /* open each RTP stream */ | |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
2036 for (i = 0; i < rt->nb_rtsp_streams; i++) { |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
229
diff
changeset
|
2037 rtsp_st = rt->rtsp_streams[i]; |
885 | 2038 |
5756
7c7fe75728dd
Use ff_url_join for assembling URLs, instead of snprintf
mstorsjo
parents:
5726
diff
changeset
|
2039 ff_url_join(url, sizeof(url), "rtp", NULL, |
7c7fe75728dd
Use ff_url_join for assembling URLs, instead of snprintf
mstorsjo
parents:
5726
diff
changeset
|
2040 inet_ntoa(rtsp_st->sdp_ip), rtsp_st->sdp_port, |
7c7fe75728dd
Use ff_url_join for assembling URLs, instead of snprintf
mstorsjo
parents:
5726
diff
changeset
|
2041 "?localport=%d&ttl=%d", rtsp_st->sdp_port, |
7c7fe75728dd
Use ff_url_join for assembling URLs, instead of snprintf
mstorsjo
parents:
5726
diff
changeset
|
2042 rtsp_st->sdp_ttl); |
1425
00d9393a126f
make ffmpeg able to send back a RTCP receiver report.
gpoirier
parents:
1424
diff
changeset
|
2043 if (url_open(&rtsp_st->rtp_handle, url, URL_RDWR) < 0) { |
0 | 2044 err = AVERROR_INVALIDDATA; |
2045 goto fail; | |
2046 } | |
3919
1879eab34f88
Factorize out common code for opening of the RTP parsing context between
rbultje
parents:
3905
diff
changeset
|
2047 if ((err = rtsp_open_transport_ctx(s, rtsp_st))) |
294
6091b76cfc2a
added MPEG2TS support in RTP, SDP and RTSP - replaced fake RTP demux by a specific API
bellard
parents:
229
diff
changeset
|
2048 goto fail; |
0 | 2049 } |
2050 return 0; | |
5502
da007db2fe9c
Re-indent to more closely follow general coding standards used in other
rbultje
parents:
5493
diff
changeset
|
2051 fail: |
5697 | 2052 ff_rtsp_close_streams(s); |
5756
7c7fe75728dd
Use ff_url_join for assembling URLs, instead of snprintf
mstorsjo
parents:
5726
diff
changeset
|
2053 ff_network_close(); |
0 | 2054 return err; |
2055 } | |
2056 | |
2057 static int sdp_read_close(AVFormatContext *s) | |
2058 { | |
5697 | 2059 ff_rtsp_close_streams(s); |
5756
7c7fe75728dd
Use ff_url_join for assembling URLs, instead of snprintf
mstorsjo
parents:
5726
diff
changeset
|
2060 ff_network_close(); |
0 | 2061 return 0; |
2062 } | |
2063 | |
1169 | 2064 AVInputFormat sdp_demuxer = { |
0 | 2065 "sdp", |
3424
7a0230981402
Make long_names in lavf/lavdev optional depending on CONFIG_SMALL.
diego
parents:
3286
diff
changeset
|
2066 NULL_IF_CONFIG_SMALL("SDP"), |
0 | 2067 sizeof(RTSPState), |
2068 sdp_probe, | |
2069 sdp_read_header, | |
5480 | 2070 rtsp_fetch_packet, |
0 | 2071 sdp_read_close, |
2072 }; |