]> git.sesse.net Git - ffmpeg/blob - libavformat/rtsp.c
Fix compilation with --disable-everything --enable-demuxer=matroska.
[ffmpeg] / libavformat / rtsp.c
1 /*
2  * RTSP/SDP client
3  * Copyright (c) 2002 Fabrice Bellard
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
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
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21
22 #include "libavutil/avassert.h"
23 #include "libavutil/base64.h"
24 #include "libavutil/avstring.h"
25 #include "libavutil/intreadwrite.h"
26 #include "libavutil/mathematics.h"
27 #include "libavutil/parseutils.h"
28 #include "libavutil/random_seed.h"
29 #include "libavutil/dict.h"
30 #include "libavutil/opt.h"
31 #include "libavutil/time.h"
32 #include "avformat.h"
33 #include "avio_internal.h"
34
35 #if HAVE_POLL_H
36 #include <poll.h>
37 #endif
38 #include "internal.h"
39 #include "network.h"
40 #include "os_support.h"
41 #include "http.h"
42 #include "rtsp.h"
43
44 #include "rtpdec.h"
45 #include "rtpproto.h"
46 #include "rdt.h"
47 #include "rtpdec_formats.h"
48 #include "rtpenc_chain.h"
49 #include "url.h"
50 #include "rtpenc.h"
51 #include "mpegts.h"
52
53 /* Timeout values for socket poll, in ms,
54  * and read_packet(), in seconds  */
55 #define POLL_TIMEOUT_MS 100
56 #define READ_PACKET_TIMEOUT_S 10
57 #define MAX_TIMEOUTS READ_PACKET_TIMEOUT_S * 1000 / POLL_TIMEOUT_MS
58 #define SDP_MAX_SIZE 16384
59 #define RECVBUF_SIZE 10 * RTP_MAX_PACKET_LENGTH
60 #define DEFAULT_REORDERING_DELAY 100000
61
62 #define OFFSET(x) offsetof(RTSPState, x)
63 #define DEC AV_OPT_FLAG_DECODING_PARAM
64 #define ENC AV_OPT_FLAG_ENCODING_PARAM
65
66 #define RTSP_FLAG_OPTS(name, longname) \
67     { name, longname, OFFSET(rtsp_flags), AV_OPT_TYPE_FLAGS, {.i64 = 0}, INT_MIN, INT_MAX, DEC, "rtsp_flags" }, \
68     { "filter_src", "only receive packets from the negotiated peer IP", 0, AV_OPT_TYPE_CONST, {.i64 = RTSP_FLAG_FILTER_SRC}, 0, 0, DEC, "rtsp_flags" }
69
70 #define RTSP_MEDIATYPE_OPTS(name, longname) \
71     { name, longname, OFFSET(media_type_mask), AV_OPT_TYPE_FLAGS, { .i64 = (1 << (AVMEDIA_TYPE_DATA+1)) - 1 }, INT_MIN, INT_MAX, DEC, "allowed_media_types" }, \
72     { "video", "Video", 0, AV_OPT_TYPE_CONST, {.i64 = 1 << AVMEDIA_TYPE_VIDEO}, 0, 0, DEC, "allowed_media_types" }, \
73     { "audio", "Audio", 0, AV_OPT_TYPE_CONST, {.i64 = 1 << AVMEDIA_TYPE_AUDIO}, 0, 0, DEC, "allowed_media_types" }, \
74     { "data", "Data", 0, AV_OPT_TYPE_CONST, {.i64 = 1 << AVMEDIA_TYPE_DATA}, 0, 0, DEC, "allowed_media_types" }
75
76 #define RTSP_REORDERING_OPTS() \
77     { "reorder_queue_size", "set number of packets to buffer for handling of reordered packets", OFFSET(reordering_queue_size), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, DEC }
78
79 const AVOption ff_rtsp_options[] = {
80     { "initial_pause",  "do not start playing the stream immediately", OFFSET(initial_pause), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 1, DEC },
81     FF_RTP_FLAG_OPTS(RTSPState, rtp_muxer_flags),
82     { "rtsp_transport", "set RTSP transport protocols", OFFSET(lower_transport_mask), AV_OPT_TYPE_FLAGS, {.i64 = 0}, INT_MIN, INT_MAX, DEC|ENC, "rtsp_transport" }, \
83     { "udp", "UDP", 0, AV_OPT_TYPE_CONST, {.i64 = 1 << RTSP_LOWER_TRANSPORT_UDP}, 0, 0, DEC|ENC, "rtsp_transport" }, \
84     { "tcp", "TCP", 0, AV_OPT_TYPE_CONST, {.i64 = 1 << RTSP_LOWER_TRANSPORT_TCP}, 0, 0, DEC|ENC, "rtsp_transport" }, \
85     { "udp_multicast", "UDP multicast", 0, AV_OPT_TYPE_CONST, {.i64 = 1 << RTSP_LOWER_TRANSPORT_UDP_MULTICAST}, 0, 0, DEC, "rtsp_transport" },
86     { "http", "HTTP tunneling", 0, AV_OPT_TYPE_CONST, {.i64 = (1 << RTSP_LOWER_TRANSPORT_HTTP)}, 0, 0, DEC, "rtsp_transport" },
87     RTSP_FLAG_OPTS("rtsp_flags", "set RTSP flags"),
88     { "listen", "wait for incoming connections", 0, AV_OPT_TYPE_CONST, {.i64 = RTSP_FLAG_LISTEN}, 0, 0, DEC, "rtsp_flags" },
89     { "prefer_tcp", "try RTP via TCP first, if available", 0, AV_OPT_TYPE_CONST, {.i64 = RTSP_FLAG_PREFER_TCP}, 0, 0, DEC|ENC, "rtsp_flags" },
90     RTSP_MEDIATYPE_OPTS("allowed_media_types", "set media types to accept from the server"),
91     { "min_port", "set minimum local UDP port", OFFSET(rtp_port_min), AV_OPT_TYPE_INT, {.i64 = RTSP_RTP_PORT_MIN}, 0, 65535, DEC|ENC },
92     { "max_port", "set maximum local UDP port", OFFSET(rtp_port_max), AV_OPT_TYPE_INT, {.i64 = RTSP_RTP_PORT_MAX}, 0, 65535, DEC|ENC },
93     { "timeout", "set maximum timeout (in seconds) to wait for incoming connections (-1 is infinite, imply flag listen)", OFFSET(initial_timeout), AV_OPT_TYPE_INT, {.i64 = -1}, INT_MIN, INT_MAX, DEC },
94     { "stimeout", "set timeout (in micro seconds) of socket TCP I/O operations", OFFSET(stimeout), AV_OPT_TYPE_INT, {.i64 = 0}, INT_MIN, INT_MAX, DEC },
95     RTSP_REORDERING_OPTS(),
96     { "user-agent", "override User-Agent header", OFFSET(user_agent), AV_OPT_TYPE_STRING, {.str = LIBAVFORMAT_IDENT}, 0, 0, DEC },
97     { NULL },
98 };
99
100 static const AVOption sdp_options[] = {
101     RTSP_FLAG_OPTS("sdp_flags", "SDP flags"),
102     { "custom_io", "use custom I/O", 0, AV_OPT_TYPE_CONST, {.i64 = RTSP_FLAG_CUSTOM_IO}, 0, 0, DEC, "rtsp_flags" },
103     { "rtcp_to_source", "send RTCP packets to the source address of received packets", 0, AV_OPT_TYPE_CONST, {.i64 = RTSP_FLAG_RTCP_TO_SOURCE}, 0, 0, DEC, "rtsp_flags" },
104     RTSP_MEDIATYPE_OPTS("allowed_media_types", "set media types to accept from the server"),
105     RTSP_REORDERING_OPTS(),
106     { NULL },
107 };
108
109 static const AVOption rtp_options[] = {
110     RTSP_FLAG_OPTS("rtp_flags", "set RTP flags"),
111     RTSP_REORDERING_OPTS(),
112     { NULL },
113 };
114
115 static void get_word_until_chars(char *buf, int buf_size,
116                                  const char *sep, const char **pp)
117 {
118     const char *p;
119     char *q;
120
121     p = *pp;
122     p += strspn(p, SPACE_CHARS);
123     q = buf;
124     while (!strchr(sep, *p) && *p != '\0') {
125         if ((q - buf) < buf_size - 1)
126             *q++ = *p;
127         p++;
128     }
129     if (buf_size > 0)
130         *q = '\0';
131     *pp = p;
132 }
133
134 static void get_word_sep(char *buf, int buf_size, const char *sep,
135                          const char **pp)
136 {
137     if (**pp == '/') (*pp)++;
138     get_word_until_chars(buf, buf_size, sep, pp);
139 }
140
141 static void get_word(char *buf, int buf_size, const char **pp)
142 {
143     get_word_until_chars(buf, buf_size, SPACE_CHARS, pp);
144 }
145
146 /** Parse a string p in the form of Range:npt=xx-xx, and determine the start
147  *  and end time.
148  *  Used for seeking in the rtp stream.
149  */
150 static void rtsp_parse_range_npt(const char *p, int64_t *start, int64_t *end)
151 {
152     char buf[256];
153
154     p += strspn(p, SPACE_CHARS);
155     if (!av_stristart(p, "npt=", &p))
156         return;
157
158     *start = AV_NOPTS_VALUE;
159     *end = AV_NOPTS_VALUE;
160
161     get_word_sep(buf, sizeof(buf), "-", &p);
162     av_parse_time(start, buf, 1);
163     if (*p == '-') {
164         p++;
165         get_word_sep(buf, sizeof(buf), "-", &p);
166         av_parse_time(end, buf, 1);
167     }
168 }
169
170 static int get_sockaddr(const char *buf, struct sockaddr_storage *sock)
171 {
172     struct addrinfo hints = { 0 }, *ai = NULL;
173     hints.ai_flags = AI_NUMERICHOST;
174     if (getaddrinfo(buf, NULL, &hints, &ai))
175         return -1;
176     memcpy(sock, ai->ai_addr, FFMIN(sizeof(*sock), ai->ai_addrlen));
177     freeaddrinfo(ai);
178     return 0;
179 }
180
181 #if CONFIG_RTPDEC
182 static void init_rtp_handler(RTPDynamicProtocolHandler *handler,
183                              RTSPStream *rtsp_st, AVCodecContext *codec)
184 {
185     if (!handler)
186         return;
187     if (codec)
188         codec->codec_id          = handler->codec_id;
189     rtsp_st->dynamic_handler = handler;
190     if (handler->alloc) {
191         rtsp_st->dynamic_protocol_context = handler->alloc();
192         if (!rtsp_st->dynamic_protocol_context)
193             rtsp_st->dynamic_handler = NULL;
194     }
195 }
196
197 /* parse the rtpmap description: <codec_name>/<clock_rate>[/<other params>] */
198 static int sdp_parse_rtpmap(AVFormatContext *s,
199                             AVStream *st, RTSPStream *rtsp_st,
200                             int payload_type, const char *p)
201 {
202     AVCodecContext *codec = st->codec;
203     char buf[256];
204     int i;
205     AVCodec *c;
206     const char *c_name;
207
208     /* See if we can handle this kind of payload.
209      * The space should normally not be there but some Real streams or
210      * particular servers ("RealServer Version 6.1.3.970", see issue 1658)
211      * have a trailing space. */
212     get_word_sep(buf, sizeof(buf), "/ ", &p);
213     if (payload_type < RTP_PT_PRIVATE) {
214         /* We are in a standard case
215          * (from http://www.iana.org/assignments/rtp-parameters). */
216         codec->codec_id = ff_rtp_codec_id(buf, codec->codec_type);
217     }
218
219     if (codec->codec_id == AV_CODEC_ID_NONE) {
220         RTPDynamicProtocolHandler *handler =
221             ff_rtp_handler_find_by_name(buf, codec->codec_type);
222         init_rtp_handler(handler, rtsp_st, codec);
223         /* If no dynamic handler was found, check with the list of standard
224          * allocated types, if such a stream for some reason happens to
225          * use a private payload type. This isn't handled in rtpdec.c, since
226          * the format name from the rtpmap line never is passed into rtpdec. */
227         if (!rtsp_st->dynamic_handler)
228             codec->codec_id = ff_rtp_codec_id(buf, codec->codec_type);
229     }
230
231     c = avcodec_find_decoder(codec->codec_id);
232     if (c && c->name)
233         c_name = c->name;
234     else
235         c_name = "(null)";
236
237     get_word_sep(buf, sizeof(buf), "/", &p);
238     i = atoi(buf);
239     switch (codec->codec_type) {
240     case AVMEDIA_TYPE_AUDIO:
241         av_log(s, AV_LOG_DEBUG, "audio codec set to: %s\n", c_name);
242         codec->sample_rate = RTSP_DEFAULT_AUDIO_SAMPLERATE;
243         codec->channels = RTSP_DEFAULT_NB_AUDIO_CHANNELS;
244         if (i > 0) {
245             codec->sample_rate = i;
246             avpriv_set_pts_info(st, 32, 1, codec->sample_rate);
247             get_word_sep(buf, sizeof(buf), "/", &p);
248             i = atoi(buf);
249             if (i > 0)
250                 codec->channels = i;
251         }
252         av_log(s, AV_LOG_DEBUG, "audio samplerate set to: %i\n",
253                codec->sample_rate);
254         av_log(s, AV_LOG_DEBUG, "audio channels set to: %i\n",
255                codec->channels);
256         break;
257     case AVMEDIA_TYPE_VIDEO:
258         av_log(s, AV_LOG_DEBUG, "video codec set to: %s\n", c_name);
259         if (i > 0)
260             avpriv_set_pts_info(st, 32, 1, i);
261         break;
262     default:
263         break;
264     }
265     if (rtsp_st->dynamic_handler && rtsp_st->dynamic_handler->init)
266         rtsp_st->dynamic_handler->init(s, st->index,
267                                        rtsp_st->dynamic_protocol_context);
268     return 0;
269 }
270
271 /* parse the attribute line from the fmtp a line of an sdp response. This
272  * is broken out as a function because it is used in rtp_h264.c, which is
273  * forthcoming. */
274 int ff_rtsp_next_attr_and_value(const char **p, char *attr, int attr_size,
275                                 char *value, int value_size)
276 {
277     *p += strspn(*p, SPACE_CHARS);
278     if (**p) {
279         get_word_sep(attr, attr_size, "=", p);
280         if (**p == '=')
281             (*p)++;
282         get_word_sep(value, value_size, ";", p);
283         if (**p == ';')
284             (*p)++;
285         return 1;
286     }
287     return 0;
288 }
289
290 typedef struct SDPParseState {
291     /* SDP only */
292     struct sockaddr_storage default_ip;
293     int            default_ttl;
294     int            skip_media;  ///< set if an unknown m= line occurs
295     int nb_default_include_source_addrs; /**< Number of source-specific multicast include source IP address (from SDP content) */
296     struct RTSPSource **default_include_source_addrs; /**< Source-specific multicast include source IP address (from SDP content) */
297     int nb_default_exclude_source_addrs; /**< Number of source-specific multicast exclude source IP address (from SDP content) */
298     struct RTSPSource **default_exclude_source_addrs; /**< Source-specific multicast exclude source IP address (from SDP content) */
299 } SDPParseState;
300
301 static void copy_default_source_addrs(struct RTSPSource **addrs, int count,
302                                       struct RTSPSource ***dest, int *dest_count)
303 {
304     RTSPSource *rtsp_src, *rtsp_src2;
305     int i;
306     for (i = 0; i < count; i++) {
307         rtsp_src = addrs[i];
308         rtsp_src2 = av_malloc(sizeof(*rtsp_src2));
309         if (!rtsp_src2)
310             continue;
311         memcpy(rtsp_src2, rtsp_src, sizeof(*rtsp_src));
312         dynarray_add(dest, dest_count, rtsp_src2);
313     }
314 }
315
316 static void sdp_parse_line(AVFormatContext *s, SDPParseState *s1,
317                            int letter, const char *buf)
318 {
319     RTSPState *rt = s->priv_data;
320     char buf1[64], st_type[64];
321     const char *p;
322     enum AVMediaType codec_type;
323     int payload_type, i;
324     AVStream *st;
325     RTSPStream *rtsp_st;
326     RTSPSource *rtsp_src;
327     struct sockaddr_storage sdp_ip;
328     int ttl;
329
330     av_dlog(s, "sdp: %c='%s'\n", letter, buf);
331
332     p = buf;
333     if (s1->skip_media && letter != 'm')
334         return;
335     switch (letter) {
336     case 'c':
337         get_word(buf1, sizeof(buf1), &p);
338         if (strcmp(buf1, "IN") != 0)
339             return;
340         get_word(buf1, sizeof(buf1), &p);
341         if (strcmp(buf1, "IP4") && strcmp(buf1, "IP6"))
342             return;
343         get_word_sep(buf1, sizeof(buf1), "/", &p);
344         if (get_sockaddr(buf1, &sdp_ip))
345             return;
346         ttl = 16;
347         if (*p == '/') {
348             p++;
349             get_word_sep(buf1, sizeof(buf1), "/", &p);
350             ttl = atoi(buf1);
351         }
352         if (s->nb_streams == 0) {
353             s1->default_ip = sdp_ip;
354             s1->default_ttl = ttl;
355         } else {
356             rtsp_st = rt->rtsp_streams[rt->nb_rtsp_streams - 1];
357             rtsp_st->sdp_ip = sdp_ip;
358             rtsp_st->sdp_ttl = ttl;
359         }
360         break;
361     case 's':
362         av_dict_set(&s->metadata, "title", p, 0);
363         break;
364     case 'i':
365         if (s->nb_streams == 0) {
366             av_dict_set(&s->metadata, "comment", p, 0);
367             break;
368         }
369         break;
370     case 'm':
371         /* new stream */
372         s1->skip_media = 0;
373         codec_type = AVMEDIA_TYPE_UNKNOWN;
374         get_word(st_type, sizeof(st_type), &p);
375         if (!strcmp(st_type, "audio")) {
376             codec_type = AVMEDIA_TYPE_AUDIO;
377         } else if (!strcmp(st_type, "video")) {
378             codec_type = AVMEDIA_TYPE_VIDEO;
379         } else if (!strcmp(st_type, "application")) {
380             codec_type = AVMEDIA_TYPE_DATA;
381         }
382         if (codec_type == AVMEDIA_TYPE_UNKNOWN || !(rt->media_type_mask & (1 << codec_type))) {
383             s1->skip_media = 1;
384             return;
385         }
386         rtsp_st = av_mallocz(sizeof(RTSPStream));
387         if (!rtsp_st)
388             return;
389         rtsp_st->stream_index = -1;
390         dynarray_add(&rt->rtsp_streams, &rt->nb_rtsp_streams, rtsp_st);
391
392         rtsp_st->sdp_ip = s1->default_ip;
393         rtsp_st->sdp_ttl = s1->default_ttl;
394
395         copy_default_source_addrs(s1->default_include_source_addrs,
396                                   s1->nb_default_include_source_addrs,
397                                   &rtsp_st->include_source_addrs,
398                                   &rtsp_st->nb_include_source_addrs);
399         copy_default_source_addrs(s1->default_exclude_source_addrs,
400                                   s1->nb_default_exclude_source_addrs,
401                                   &rtsp_st->exclude_source_addrs,
402                                   &rtsp_st->nb_exclude_source_addrs);
403
404         get_word(buf1, sizeof(buf1), &p); /* port */
405         rtsp_st->sdp_port = atoi(buf1);
406
407         get_word(buf1, sizeof(buf1), &p); /* protocol */
408         if (!strcmp(buf1, "udp"))
409             rt->transport = RTSP_TRANSPORT_RAW;
410         else if (strstr(buf1, "/AVPF") || strstr(buf1, "/SAVPF"))
411             rtsp_st->feedback = 1;
412
413         /* XXX: handle list of formats */
414         get_word(buf1, sizeof(buf1), &p); /* format list */
415         rtsp_st->sdp_payload_type = atoi(buf1);
416
417         if (!strcmp(ff_rtp_enc_name(rtsp_st->sdp_payload_type), "MP2T")) {
418             /* no corresponding stream */
419             if (rt->transport == RTSP_TRANSPORT_RAW) {
420                 if (!rt->ts && CONFIG_RTPDEC)
421                     rt->ts = ff_mpegts_parse_open(s);
422             } else {
423                 RTPDynamicProtocolHandler *handler;
424                 handler = ff_rtp_handler_find_by_id(
425                               rtsp_st->sdp_payload_type, AVMEDIA_TYPE_DATA);
426                 init_rtp_handler(handler, rtsp_st, NULL);
427                 if (handler && handler->init)
428                     handler->init(s, -1, rtsp_st->dynamic_protocol_context);
429             }
430         } else if (rt->server_type == RTSP_SERVER_WMS &&
431                    codec_type == AVMEDIA_TYPE_DATA) {
432             /* RTX stream, a stream that carries all the other actual
433              * audio/video streams. Don't expose this to the callers. */
434         } else {
435             st = avformat_new_stream(s, NULL);
436             if (!st)
437                 return;
438             st->id = rt->nb_rtsp_streams - 1;
439             rtsp_st->stream_index = st->index;
440             st->codec->codec_type = codec_type;
441             if (rtsp_st->sdp_payload_type < RTP_PT_PRIVATE) {
442                 RTPDynamicProtocolHandler *handler;
443                 /* if standard payload type, we can find the codec right now */
444                 ff_rtp_get_codec_info(st->codec, rtsp_st->sdp_payload_type);
445                 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
446                     st->codec->sample_rate > 0)
447                     avpriv_set_pts_info(st, 32, 1, st->codec->sample_rate);
448                 /* Even static payload types may need a custom depacketizer */
449                 handler = ff_rtp_handler_find_by_id(
450                               rtsp_st->sdp_payload_type, st->codec->codec_type);
451                 init_rtp_handler(handler, rtsp_st, st->codec);
452                 if (handler && handler->init)
453                     handler->init(s, st->index,
454                                   rtsp_st->dynamic_protocol_context);
455             }
456         }
457         /* put a default control url */
458         av_strlcpy(rtsp_st->control_url, rt->control_uri,
459                    sizeof(rtsp_st->control_url));
460         break;
461     case 'a':
462         if (av_strstart(p, "control:", &p)) {
463             if (s->nb_streams == 0) {
464                 if (!strncmp(p, "rtsp://", 7))
465                     av_strlcpy(rt->control_uri, p,
466                                sizeof(rt->control_uri));
467             } else {
468                 char proto[32];
469                 /* get the control url */
470                 rtsp_st = rt->rtsp_streams[rt->nb_rtsp_streams - 1];
471
472                 /* XXX: may need to add full url resolution */
473                 av_url_split(proto, sizeof(proto), NULL, 0, NULL, 0,
474                              NULL, NULL, 0, p);
475                 if (proto[0] == '\0') {
476                     /* relative control URL */
477                     if (rtsp_st->control_url[strlen(rtsp_st->control_url)-1]!='/')
478                     av_strlcat(rtsp_st->control_url, "/",
479                                sizeof(rtsp_st->control_url));
480                     av_strlcat(rtsp_st->control_url, p,
481                                sizeof(rtsp_st->control_url));
482                 } else
483                     av_strlcpy(rtsp_st->control_url, p,
484                                sizeof(rtsp_st->control_url));
485             }
486         } else if (av_strstart(p, "rtpmap:", &p) && s->nb_streams > 0) {
487             /* NOTE: rtpmap is only supported AFTER the 'm=' tag */
488             get_word(buf1, sizeof(buf1), &p);
489             payload_type = atoi(buf1);
490             rtsp_st = rt->rtsp_streams[rt->nb_rtsp_streams - 1];
491             if (rtsp_st->stream_index >= 0) {
492                 st = s->streams[rtsp_st->stream_index];
493                 sdp_parse_rtpmap(s, st, rtsp_st, payload_type, p);
494             }
495         } else if (av_strstart(p, "fmtp:", &p) ||
496                    av_strstart(p, "framesize:", &p)) {
497             /* NOTE: fmtp is only supported AFTER the 'a=rtpmap:xxx' tag */
498             // let dynamic protocol handlers have a stab at the line.
499             get_word(buf1, sizeof(buf1), &p);
500             payload_type = atoi(buf1);
501             for (i = 0; i < rt->nb_rtsp_streams; i++) {
502                 rtsp_st = rt->rtsp_streams[i];
503                 if (rtsp_st->sdp_payload_type == payload_type &&
504                     rtsp_st->dynamic_handler &&
505                     rtsp_st->dynamic_handler->parse_sdp_a_line)
506                     rtsp_st->dynamic_handler->parse_sdp_a_line(s, i,
507                         rtsp_st->dynamic_protocol_context, buf);
508             }
509         } else if (av_strstart(p, "range:", &p)) {
510             int64_t start, end;
511
512             // this is so that seeking on a streamed file can work.
513             rtsp_parse_range_npt(p, &start, &end);
514             s->start_time = start;
515             /* AV_NOPTS_VALUE means live broadcast (and can't seek) */
516             s->duration   = (end == AV_NOPTS_VALUE) ?
517                             AV_NOPTS_VALUE : end - start;
518         } else if (av_strstart(p, "IsRealDataType:integer;",&p)) {
519             if (atoi(p) == 1)
520                 rt->transport = RTSP_TRANSPORT_RDT;
521         } else if (av_strstart(p, "SampleRate:integer;", &p) &&
522                    s->nb_streams > 0) {
523             st = s->streams[s->nb_streams - 1];
524             st->codec->sample_rate = atoi(p);
525         } else if (av_strstart(p, "crypto:", &p) && s->nb_streams > 0) {
526             // RFC 4568
527             rtsp_st = rt->rtsp_streams[rt->nb_rtsp_streams - 1];
528             get_word(buf1, sizeof(buf1), &p); // ignore tag
529             get_word(rtsp_st->crypto_suite, sizeof(rtsp_st->crypto_suite), &p);
530             p += strspn(p, SPACE_CHARS);
531             if (av_strstart(p, "inline:", &p))
532                 get_word(rtsp_st->crypto_params, sizeof(rtsp_st->crypto_params), &p);
533         } else if (av_strstart(p, "source-filter:", &p)) {
534             int exclude = 0;
535             get_word(buf1, sizeof(buf1), &p);
536             if (strcmp(buf1, "incl") && strcmp(buf1, "excl"))
537                 return;
538             exclude = !strcmp(buf1, "excl");
539
540             get_word(buf1, sizeof(buf1), &p);
541             if (strcmp(buf1, "IN") != 0)
542                 return;
543             get_word(buf1, sizeof(buf1), &p);
544             if (strcmp(buf1, "IP4") && strcmp(buf1, "IP6") && strcmp(buf1, "*"))
545                 return;
546             // not checking that the destination address actually matches or is wildcard
547             get_word(buf1, sizeof(buf1), &p);
548
549             while (*p != '\0') {
550                 rtsp_src = av_mallocz(sizeof(*rtsp_src));
551                 if (!rtsp_src)
552                     return;
553                 get_word(rtsp_src->addr, sizeof(rtsp_src->addr), &p);
554                 if (exclude) {
555                     if (s->nb_streams == 0) {
556                         dynarray_add(&s1->default_exclude_source_addrs, &s1->nb_default_exclude_source_addrs, rtsp_src);
557                     } else {
558                         rtsp_st = rt->rtsp_streams[rt->nb_rtsp_streams - 1];
559                         dynarray_add(&rtsp_st->exclude_source_addrs, &rtsp_st->nb_exclude_source_addrs, rtsp_src);
560                     }
561                 } else {
562                     if (s->nb_streams == 0) {
563                         dynarray_add(&s1->default_include_source_addrs, &s1->nb_default_include_source_addrs, rtsp_src);
564                     } else {
565                         rtsp_st = rt->rtsp_streams[rt->nb_rtsp_streams - 1];
566                         dynarray_add(&rtsp_st->include_source_addrs, &rtsp_st->nb_include_source_addrs, rtsp_src);
567                     }
568                 }
569             }
570         } else {
571             if (rt->server_type == RTSP_SERVER_WMS)
572                 ff_wms_parse_sdp_a_line(s, p);
573             if (s->nb_streams > 0) {
574                 rtsp_st = rt->rtsp_streams[rt->nb_rtsp_streams - 1];
575
576                 if (rt->server_type == RTSP_SERVER_REAL)
577                     ff_real_parse_sdp_a_line(s, rtsp_st->stream_index, p);
578
579                 if (rtsp_st->dynamic_handler &&
580                     rtsp_st->dynamic_handler->parse_sdp_a_line)
581                     rtsp_st->dynamic_handler->parse_sdp_a_line(s,
582                         rtsp_st->stream_index,
583                         rtsp_st->dynamic_protocol_context, buf);
584             }
585         }
586         break;
587     }
588 }
589
590 int ff_sdp_parse(AVFormatContext *s, const char *content)
591 {
592     RTSPState *rt = s->priv_data;
593     const char *p;
594     int letter, i;
595     /* Some SDP lines, particularly for Realmedia or ASF RTSP streams,
596      * contain long SDP lines containing complete ASF Headers (several
597      * kB) or arrays of MDPR (RM stream descriptor) headers plus
598      * "rulebooks" describing their properties. Therefore, the SDP line
599      * buffer is large.
600      *
601      * The Vorbis FMTP line can be up to 16KB - see xiph_parse_sdp_line
602      * in rtpdec_xiph.c. */
603     char buf[16384], *q;
604     SDPParseState sdp_parse_state = { { 0 } }, *s1 = &sdp_parse_state;
605
606     p = content;
607     for (;;) {
608         p += strspn(p, SPACE_CHARS);
609         letter = *p;
610         if (letter == '\0')
611             break;
612         p++;
613         if (*p != '=')
614             goto next_line;
615         p++;
616         /* get the content */
617         q = buf;
618         while (*p != '\n' && *p != '\r' && *p != '\0') {
619             if ((q - buf) < sizeof(buf) - 1)
620                 *q++ = *p;
621             p++;
622         }
623         *q = '\0';
624         sdp_parse_line(s, s1, letter, buf);
625     next_line:
626         while (*p != '\n' && *p != '\0')
627             p++;
628         if (*p == '\n')
629             p++;
630     }
631
632     for (i = 0; i < s1->nb_default_include_source_addrs; i++)
633         av_free(s1->default_include_source_addrs[i]);
634     av_freep(&s1->default_include_source_addrs);
635     for (i = 0; i < s1->nb_default_exclude_source_addrs; i++)
636         av_free(s1->default_exclude_source_addrs[i]);
637     av_freep(&s1->default_exclude_source_addrs);
638
639     rt->p = av_malloc(sizeof(struct pollfd)*2*(rt->nb_rtsp_streams+1));
640     if (!rt->p) return AVERROR(ENOMEM);
641     return 0;
642 }
643 #endif /* CONFIG_RTPDEC */
644
645 void ff_rtsp_undo_setup(AVFormatContext *s, int send_packets)
646 {
647     RTSPState *rt = s->priv_data;
648     int i;
649
650     for (i = 0; i < rt->nb_rtsp_streams; i++) {
651         RTSPStream *rtsp_st = rt->rtsp_streams[i];
652         if (!rtsp_st)
653             continue;
654         if (rtsp_st->transport_priv) {
655             if (s->oformat) {
656                 AVFormatContext *rtpctx = rtsp_st->transport_priv;
657                 av_write_trailer(rtpctx);
658                 if (rt->lower_transport == RTSP_LOWER_TRANSPORT_TCP) {
659                     uint8_t *ptr;
660                     if (CONFIG_RTSP_MUXER && rtpctx->pb && send_packets)
661                         ff_rtsp_tcp_write_packet(s, rtsp_st);
662                     avio_close_dyn_buf(rtpctx->pb, &ptr);
663                     av_free(ptr);
664                 } else {
665                     avio_close(rtpctx->pb);
666                 }
667                 avformat_free_context(rtpctx);
668             } else if (rt->transport == RTSP_TRANSPORT_RDT && CONFIG_RTPDEC)
669                 ff_rdt_parse_close(rtsp_st->transport_priv);
670             else if (rt->transport == RTSP_TRANSPORT_RTP && CONFIG_RTPDEC)
671                 ff_rtp_parse_close(rtsp_st->transport_priv);
672         }
673         rtsp_st->transport_priv = NULL;
674         if (rtsp_st->rtp_handle)
675             ffurl_close(rtsp_st->rtp_handle);
676         rtsp_st->rtp_handle = NULL;
677     }
678 }
679
680 /* close and free RTSP streams */
681 void ff_rtsp_close_streams(AVFormatContext *s)
682 {
683     RTSPState *rt = s->priv_data;
684     int i, j;
685     RTSPStream *rtsp_st;
686
687     ff_rtsp_undo_setup(s, 0);
688     for (i = 0; i < rt->nb_rtsp_streams; i++) {
689         rtsp_st = rt->rtsp_streams[i];
690         if (rtsp_st) {
691             if (rtsp_st->dynamic_handler && rtsp_st->dynamic_protocol_context)
692                 rtsp_st->dynamic_handler->free(
693                     rtsp_st->dynamic_protocol_context);
694             for (j = 0; j < rtsp_st->nb_include_source_addrs; j++)
695                 av_free(rtsp_st->include_source_addrs[j]);
696             av_freep(&rtsp_st->include_source_addrs);
697             for (j = 0; j < rtsp_st->nb_exclude_source_addrs; j++)
698                 av_free(rtsp_st->exclude_source_addrs[j]);
699             av_freep(&rtsp_st->exclude_source_addrs);
700
701             av_free(rtsp_st);
702         }
703     }
704     av_free(rt->rtsp_streams);
705     if (rt->asf_ctx) {
706         avformat_close_input(&rt->asf_ctx);
707     }
708     if (rt->ts && CONFIG_RTPDEC)
709         ff_mpegts_parse_close(rt->ts);
710     av_free(rt->p);
711     av_free(rt->recvbuf);
712 }
713
714 int ff_rtsp_open_transport_ctx(AVFormatContext *s, RTSPStream *rtsp_st)
715 {
716     RTSPState *rt = s->priv_data;
717     AVStream *st = NULL;
718     int reordering_queue_size = rt->reordering_queue_size;
719     if (reordering_queue_size < 0) {
720         if (rt->lower_transport == RTSP_LOWER_TRANSPORT_TCP || !s->max_delay)
721             reordering_queue_size = 0;
722         else
723             reordering_queue_size = RTP_REORDER_QUEUE_DEFAULT_SIZE;
724     }
725
726     /* open the RTP context */
727     if (rtsp_st->stream_index >= 0)
728         st = s->streams[rtsp_st->stream_index];
729     if (!st)
730         s->ctx_flags |= AVFMTCTX_NOHEADER;
731
732     if (s->oformat && CONFIG_RTSP_MUXER) {
733         int ret = ff_rtp_chain_mux_open((AVFormatContext **)&rtsp_st->transport_priv,
734                                         s, st, rtsp_st->rtp_handle,
735                                         RTSP_TCP_MAX_PACKET_SIZE,
736                                         rtsp_st->stream_index);
737         /* Ownership of rtp_handle is passed to the rtp mux context */
738         rtsp_st->rtp_handle = NULL;
739         if (ret < 0)
740             return ret;
741         st->time_base = ((AVFormatContext*)rtsp_st->transport_priv)->streams[0]->time_base;
742     } else if (rt->transport == RTSP_TRANSPORT_RAW) {
743         return 0; // Don't need to open any parser here
744     } else if (rt->transport == RTSP_TRANSPORT_RDT && CONFIG_RTPDEC)
745         rtsp_st->transport_priv = ff_rdt_parse_open(s, st->index,
746                                             rtsp_st->dynamic_protocol_context,
747                                             rtsp_st->dynamic_handler);
748     else if (CONFIG_RTPDEC)
749         rtsp_st->transport_priv = ff_rtp_parse_open(s, st,
750                                          rtsp_st->sdp_payload_type,
751                                          reordering_queue_size);
752
753     if (!rtsp_st->transport_priv) {
754          return AVERROR(ENOMEM);
755     } else if (rt->transport == RTSP_TRANSPORT_RTP && CONFIG_RTPDEC) {
756         if (rtsp_st->dynamic_handler) {
757             ff_rtp_parse_set_dynamic_protocol(rtsp_st->transport_priv,
758                                               rtsp_st->dynamic_protocol_context,
759                                               rtsp_st->dynamic_handler);
760         }
761         if (rtsp_st->crypto_suite[0])
762             ff_rtp_parse_set_crypto(rtsp_st->transport_priv,
763                                     rtsp_st->crypto_suite,
764                                     rtsp_st->crypto_params);
765     }
766
767     return 0;
768 }
769
770 #if CONFIG_RTSP_DEMUXER || CONFIG_RTSP_MUXER
771 static void rtsp_parse_range(int *min_ptr, int *max_ptr, const char **pp)
772 {
773     const char *q;
774     char *p;
775     int v;
776
777     q = *pp;
778     q += strspn(q, SPACE_CHARS);
779     v = strtol(q, &p, 10);
780     if (*p == '-') {
781         p++;
782         *min_ptr = v;
783         v = strtol(p, &p, 10);
784         *max_ptr = v;
785     } else {
786         *min_ptr = v;
787         *max_ptr = v;
788     }
789     *pp = p;
790 }
791
792 /* XXX: only one transport specification is parsed */
793 static void rtsp_parse_transport(RTSPMessageHeader *reply, const char *p)
794 {
795     char transport_protocol[16];
796     char profile[16];
797     char lower_transport[16];
798     char parameter[16];
799     RTSPTransportField *th;
800     char buf[256];
801
802     reply->nb_transports = 0;
803
804     for (;;) {
805         p += strspn(p, SPACE_CHARS);
806         if (*p == '\0')
807             break;
808
809         th = &reply->transports[reply->nb_transports];
810
811         get_word_sep(transport_protocol, sizeof(transport_protocol),
812                      "/", &p);
813         if (!av_strcasecmp (transport_protocol, "rtp")) {
814             get_word_sep(profile, sizeof(profile), "/;,", &p);
815             lower_transport[0] = '\0';
816             /* rtp/avp/<protocol> */
817             if (*p == '/') {
818                 get_word_sep(lower_transport, sizeof(lower_transport),
819                              ";,", &p);
820             }
821             th->transport = RTSP_TRANSPORT_RTP;
822         } else if (!av_strcasecmp (transport_protocol, "x-pn-tng") ||
823                    !av_strcasecmp (transport_protocol, "x-real-rdt")) {
824             /* x-pn-tng/<protocol> */
825             get_word_sep(lower_transport, sizeof(lower_transport), "/;,", &p);
826             profile[0] = '\0';
827             th->transport = RTSP_TRANSPORT_RDT;
828         } else if (!av_strcasecmp(transport_protocol, "raw")) {
829             get_word_sep(profile, sizeof(profile), "/;,", &p);
830             lower_transport[0] = '\0';
831             /* raw/raw/<protocol> */
832             if (*p == '/') {
833                 get_word_sep(lower_transport, sizeof(lower_transport),
834                              ";,", &p);
835             }
836             th->transport = RTSP_TRANSPORT_RAW;
837         }
838         if (!av_strcasecmp(lower_transport, "TCP"))
839             th->lower_transport = RTSP_LOWER_TRANSPORT_TCP;
840         else
841             th->lower_transport = RTSP_LOWER_TRANSPORT_UDP;
842
843         if (*p == ';')
844             p++;
845         /* get each parameter */
846         while (*p != '\0' && *p != ',') {
847             get_word_sep(parameter, sizeof(parameter), "=;,", &p);
848             if (!strcmp(parameter, "port")) {
849                 if (*p == '=') {
850                     p++;
851                     rtsp_parse_range(&th->port_min, &th->port_max, &p);
852                 }
853             } else if (!strcmp(parameter, "client_port")) {
854                 if (*p == '=') {
855                     p++;
856                     rtsp_parse_range(&th->client_port_min,
857                                      &th->client_port_max, &p);
858                 }
859             } else if (!strcmp(parameter, "server_port")) {
860                 if (*p == '=') {
861                     p++;
862                     rtsp_parse_range(&th->server_port_min,
863                                      &th->server_port_max, &p);
864                 }
865             } else if (!strcmp(parameter, "interleaved")) {
866                 if (*p == '=') {
867                     p++;
868                     rtsp_parse_range(&th->interleaved_min,
869                                      &th->interleaved_max, &p);
870                 }
871             } else if (!strcmp(parameter, "multicast")) {
872                 if (th->lower_transport == RTSP_LOWER_TRANSPORT_UDP)
873                     th->lower_transport = RTSP_LOWER_TRANSPORT_UDP_MULTICAST;
874             } else if (!strcmp(parameter, "ttl")) {
875                 if (*p == '=') {
876                     char *end;
877                     p++;
878                     th->ttl = strtol(p, &end, 10);
879                     p = end;
880                 }
881             } else if (!strcmp(parameter, "destination")) {
882                 if (*p == '=') {
883                     p++;
884                     get_word_sep(buf, sizeof(buf), ";,", &p);
885                     get_sockaddr(buf, &th->destination);
886                 }
887             } else if (!strcmp(parameter, "source")) {
888                 if (*p == '=') {
889                     p++;
890                     get_word_sep(buf, sizeof(buf), ";,", &p);
891                     av_strlcpy(th->source, buf, sizeof(th->source));
892                 }
893             } else if (!strcmp(parameter, "mode")) {
894                 if (*p == '=') {
895                     p++;
896                     get_word_sep(buf, sizeof(buf), ";, ", &p);
897                     if (!strcmp(buf, "record") ||
898                         !strcmp(buf, "receive"))
899                         th->mode_record = 1;
900                 }
901             }
902
903             while (*p != ';' && *p != '\0' && *p != ',')
904                 p++;
905             if (*p == ';')
906                 p++;
907         }
908         if (*p == ',')
909             p++;
910
911         reply->nb_transports++;
912     }
913 }
914
915 static void handle_rtp_info(RTSPState *rt, const char *url,
916                             uint32_t seq, uint32_t rtptime)
917 {
918     int i;
919     if (!rtptime || !url[0])
920         return;
921     if (rt->transport != RTSP_TRANSPORT_RTP)
922         return;
923     for (i = 0; i < rt->nb_rtsp_streams; i++) {
924         RTSPStream *rtsp_st = rt->rtsp_streams[i];
925         RTPDemuxContext *rtpctx = rtsp_st->transport_priv;
926         if (!rtpctx)
927             continue;
928         if (!strcmp(rtsp_st->control_url, url)) {
929             rtpctx->base_timestamp = rtptime;
930             break;
931         }
932     }
933 }
934
935 static void rtsp_parse_rtp_info(RTSPState *rt, const char *p)
936 {
937     int read = 0;
938     char key[20], value[1024], url[1024] = "";
939     uint32_t seq = 0, rtptime = 0;
940
941     for (;;) {
942         p += strspn(p, SPACE_CHARS);
943         if (!*p)
944             break;
945         get_word_sep(key, sizeof(key), "=", &p);
946         if (*p != '=')
947             break;
948         p++;
949         get_word_sep(value, sizeof(value), ";, ", &p);
950         read++;
951         if (!strcmp(key, "url"))
952             av_strlcpy(url, value, sizeof(url));
953         else if (!strcmp(key, "seq"))
954             seq = strtoul(value, NULL, 10);
955         else if (!strcmp(key, "rtptime"))
956             rtptime = strtoul(value, NULL, 10);
957         if (*p == ',') {
958             handle_rtp_info(rt, url, seq, rtptime);
959             url[0] = '\0';
960             seq = rtptime = 0;
961             read = 0;
962         }
963         if (*p)
964             p++;
965     }
966     if (read > 0)
967         handle_rtp_info(rt, url, seq, rtptime);
968 }
969
970 void ff_rtsp_parse_line(RTSPMessageHeader *reply, const char *buf,
971                         RTSPState *rt, const char *method)
972 {
973     const char *p;
974
975     /* NOTE: we do case independent match for broken servers */
976     p = buf;
977     if (av_stristart(p, "Session:", &p)) {
978         int t;
979         get_word_sep(reply->session_id, sizeof(reply->session_id), ";", &p);
980         if (av_stristart(p, ";timeout=", &p) &&
981             (t = strtol(p, NULL, 10)) > 0) {
982             reply->timeout = t;
983         }
984     } else if (av_stristart(p, "Content-Length:", &p)) {
985         reply->content_length = strtol(p, NULL, 10);
986     } else if (av_stristart(p, "Transport:", &p)) {
987         rtsp_parse_transport(reply, p);
988     } else if (av_stristart(p, "CSeq:", &p)) {
989         reply->seq = strtol(p, NULL, 10);
990     } else if (av_stristart(p, "Range:", &p)) {
991         rtsp_parse_range_npt(p, &reply->range_start, &reply->range_end);
992     } else if (av_stristart(p, "RealChallenge1:", &p)) {
993         p += strspn(p, SPACE_CHARS);
994         av_strlcpy(reply->real_challenge, p, sizeof(reply->real_challenge));
995     } else if (av_stristart(p, "Server:", &p)) {
996         p += strspn(p, SPACE_CHARS);
997         av_strlcpy(reply->server, p, sizeof(reply->server));
998     } else if (av_stristart(p, "Notice:", &p) ||
999                av_stristart(p, "X-Notice:", &p)) {
1000         reply->notice = strtol(p, NULL, 10);
1001     } else if (av_stristart(p, "Location:", &p)) {
1002         p += strspn(p, SPACE_CHARS);
1003         av_strlcpy(reply->location, p , sizeof(reply->location));
1004     } else if (av_stristart(p, "WWW-Authenticate:", &p) && rt) {
1005         p += strspn(p, SPACE_CHARS);
1006         ff_http_auth_handle_header(&rt->auth_state, "WWW-Authenticate", p);
1007     } else if (av_stristart(p, "Authentication-Info:", &p) && rt) {
1008         p += strspn(p, SPACE_CHARS);
1009         ff_http_auth_handle_header(&rt->auth_state, "Authentication-Info", p);
1010     } else if (av_stristart(p, "Content-Base:", &p) && rt) {
1011         p += strspn(p, SPACE_CHARS);
1012         if (method && !strcmp(method, "DESCRIBE"))
1013             av_strlcpy(rt->control_uri, p , sizeof(rt->control_uri));
1014     } else if (av_stristart(p, "RTP-Info:", &p) && rt) {
1015         p += strspn(p, SPACE_CHARS);
1016         if (method && !strcmp(method, "PLAY"))
1017             rtsp_parse_rtp_info(rt, p);
1018     } else if (av_stristart(p, "Public:", &p) && rt) {
1019         if (strstr(p, "GET_PARAMETER") &&
1020             method && !strcmp(method, "OPTIONS"))
1021             rt->get_parameter_supported = 1;
1022     } else if (av_stristart(p, "x-Accept-Dynamic-Rate:", &p) && rt) {
1023         p += strspn(p, SPACE_CHARS);
1024         rt->accept_dynamic_rate = atoi(p);
1025     } else if (av_stristart(p, "Content-Type:", &p)) {
1026         p += strspn(p, SPACE_CHARS);
1027         av_strlcpy(reply->content_type, p, sizeof(reply->content_type));
1028     }
1029 }
1030
1031 /* skip a RTP/TCP interleaved packet */
1032 void ff_rtsp_skip_packet(AVFormatContext *s)
1033 {
1034     RTSPState *rt = s->priv_data;
1035     int ret, len, len1;
1036     uint8_t buf[1024];
1037
1038     ret = ffurl_read_complete(rt->rtsp_hd, buf, 3);
1039     if (ret != 3)
1040         return;
1041     len = AV_RB16(buf + 1);
1042
1043     av_dlog(s, "skipping RTP packet len=%d\n", len);
1044
1045     /* skip payload */
1046     while (len > 0) {
1047         len1 = len;
1048         if (len1 > sizeof(buf))
1049             len1 = sizeof(buf);
1050         ret = ffurl_read_complete(rt->rtsp_hd, buf, len1);
1051         if (ret != len1)
1052             return;
1053         len -= len1;
1054     }
1055 }
1056
1057 int ff_rtsp_read_reply(AVFormatContext *s, RTSPMessageHeader *reply,
1058                        unsigned char **content_ptr,
1059                        int return_on_interleaved_data, const char *method)
1060 {
1061     RTSPState *rt = s->priv_data;
1062     char buf[4096], buf1[1024], *q;
1063     unsigned char ch;
1064     const char *p;
1065     int ret, content_length, line_count = 0, request = 0;
1066     unsigned char *content = NULL;
1067
1068 start:
1069     line_count = 0;
1070     request = 0;
1071     content = NULL;
1072     memset(reply, 0, sizeof(*reply));
1073
1074     /* parse reply (XXX: use buffers) */
1075     rt->last_reply[0] = '\0';
1076     for (;;) {
1077         q = buf;
1078         for (;;) {
1079             ret = ffurl_read_complete(rt->rtsp_hd, &ch, 1);
1080             av_dlog(s, "ret=%d c=%02x [%c]\n", ret, ch, ch);
1081             if (ret != 1)
1082                 return AVERROR_EOF;
1083             if (ch == '\n')
1084                 break;
1085             if (ch == '$') {
1086                 /* XXX: only parse it if first char on line ? */
1087                 if (return_on_interleaved_data) {
1088                     return 1;
1089                 } else
1090                     ff_rtsp_skip_packet(s);
1091             } else if (ch != '\r') {
1092                 if ((q - buf) < sizeof(buf) - 1)
1093                     *q++ = ch;
1094             }
1095         }
1096         *q = '\0';
1097
1098         av_dlog(s, "line='%s'\n", buf);
1099
1100         /* test if last line */
1101         if (buf[0] == '\0')
1102             break;
1103         p = buf;
1104         if (line_count == 0) {
1105             /* get reply code */
1106             get_word(buf1, sizeof(buf1), &p);
1107             if (!strncmp(buf1, "RTSP/", 5)) {
1108                 get_word(buf1, sizeof(buf1), &p);
1109                 reply->status_code = atoi(buf1);
1110                 av_strlcpy(reply->reason, p, sizeof(reply->reason));
1111             } else {
1112                 av_strlcpy(reply->reason, buf1, sizeof(reply->reason)); // method
1113                 get_word(buf1, sizeof(buf1), &p); // object
1114                 request = 1;
1115             }
1116         } else {
1117             ff_rtsp_parse_line(reply, p, rt, method);
1118             av_strlcat(rt->last_reply, p,    sizeof(rt->last_reply));
1119             av_strlcat(rt->last_reply, "\n", sizeof(rt->last_reply));
1120         }
1121         line_count++;
1122     }
1123
1124     if (rt->session_id[0] == '\0' && reply->session_id[0] != '\0' && !request)
1125         av_strlcpy(rt->session_id, reply->session_id, sizeof(rt->session_id));
1126
1127     content_length = reply->content_length;
1128     if (content_length > 0) {
1129         /* leave some room for a trailing '\0' (useful for simple parsing) */
1130         content = av_malloc(content_length + 1);
1131         ffurl_read_complete(rt->rtsp_hd, content, content_length);
1132         content[content_length] = '\0';
1133     }
1134     if (content_ptr)
1135         *content_ptr = content;
1136     else
1137         av_free(content);
1138
1139     if (request) {
1140         char buf[1024];
1141         char base64buf[AV_BASE64_SIZE(sizeof(buf))];
1142         const char* ptr = buf;
1143
1144         if (!strcmp(reply->reason, "OPTIONS")) {
1145             snprintf(buf, sizeof(buf), "RTSP/1.0 200 OK\r\n");
1146             if (reply->seq)
1147                 av_strlcatf(buf, sizeof(buf), "CSeq: %d\r\n", reply->seq);
1148             if (reply->session_id[0])
1149                 av_strlcatf(buf, sizeof(buf), "Session: %s\r\n",
1150                                               reply->session_id);
1151         } else {
1152             snprintf(buf, sizeof(buf), "RTSP/1.0 501 Not Implemented\r\n");
1153         }
1154         av_strlcat(buf, "\r\n", sizeof(buf));
1155
1156         if (rt->control_transport == RTSP_MODE_TUNNEL) {
1157             av_base64_encode(base64buf, sizeof(base64buf), buf, strlen(buf));
1158             ptr = base64buf;
1159         }
1160         ffurl_write(rt->rtsp_hd_out, ptr, strlen(ptr));
1161
1162         rt->last_cmd_time = av_gettime();
1163         /* Even if the request from the server had data, it is not the data
1164          * that the caller wants or expects. The memory could also be leaked
1165          * if the actual following reply has content data. */
1166         if (content_ptr)
1167             av_freep(content_ptr);
1168         /* If method is set, this is called from ff_rtsp_send_cmd,
1169          * where a reply to exactly this request is awaited. For
1170          * callers from within packet receiving, we just want to
1171          * return to the caller and go back to receiving packets. */
1172         if (method)
1173             goto start;
1174         return 0;
1175     }
1176
1177     if (rt->seq != reply->seq) {
1178         av_log(s, AV_LOG_WARNING, "CSeq %d expected, %d received.\n",
1179             rt->seq, reply->seq);
1180     }
1181
1182     /* EOS */
1183     if (reply->notice == 2101 /* End-of-Stream Reached */      ||
1184         reply->notice == 2104 /* Start-of-Stream Reached */    ||
1185         reply->notice == 2306 /* Continuous Feed Terminated */) {
1186         rt->state = RTSP_STATE_IDLE;
1187     } else if (reply->notice >= 4400 && reply->notice < 5500) {
1188         return AVERROR(EIO); /* data or server error */
1189     } else if (reply->notice == 2401 /* Ticket Expired */ ||
1190              (reply->notice >= 5500 && reply->notice < 5600) /* end of term */ )
1191         return AVERROR(EPERM);
1192
1193     return 0;
1194 }
1195
1196 /**
1197  * Send a command to the RTSP server without waiting for the reply.
1198  *
1199  * @param s RTSP (de)muxer context
1200  * @param method the method for the request
1201  * @param url the target url for the request
1202  * @param headers extra header lines to include in the request
1203  * @param send_content if non-null, the data to send as request body content
1204  * @param send_content_length the length of the send_content data, or 0 if
1205  *                            send_content is null
1206  *
1207  * @return zero if success, nonzero otherwise
1208  */
1209 static int rtsp_send_cmd_with_content_async(AVFormatContext *s,
1210                                             const char *method, const char *url,
1211                                             const char *headers,
1212                                             const unsigned char *send_content,
1213                                             int send_content_length)
1214 {
1215     RTSPState *rt = s->priv_data;
1216     char buf[4096], *out_buf;
1217     char base64buf[AV_BASE64_SIZE(sizeof(buf))];
1218
1219     /* Add in RTSP headers */
1220     out_buf = buf;
1221     rt->seq++;
1222     snprintf(buf, sizeof(buf), "%s %s RTSP/1.0\r\n", method, url);
1223     if (headers)
1224         av_strlcat(buf, headers, sizeof(buf));
1225     av_strlcatf(buf, sizeof(buf), "CSeq: %d\r\n", rt->seq);
1226     av_strlcatf(buf, sizeof(buf), "User-Agent: %s\r\n",  rt->user_agent);
1227     if (rt->session_id[0] != '\0' && (!headers ||
1228         !strstr(headers, "\nIf-Match:"))) {
1229         av_strlcatf(buf, sizeof(buf), "Session: %s\r\n", rt->session_id);
1230     }
1231     if (rt->auth[0]) {
1232         char *str = ff_http_auth_create_response(&rt->auth_state,
1233                                                  rt->auth, url, method);
1234         if (str)
1235             av_strlcat(buf, str, sizeof(buf));
1236         av_free(str);
1237     }
1238     if (send_content_length > 0 && send_content)
1239         av_strlcatf(buf, sizeof(buf), "Content-Length: %d\r\n", send_content_length);
1240     av_strlcat(buf, "\r\n", sizeof(buf));
1241
1242     /* base64 encode rtsp if tunneling */
1243     if (rt->control_transport == RTSP_MODE_TUNNEL) {
1244         av_base64_encode(base64buf, sizeof(base64buf), buf, strlen(buf));
1245         out_buf = base64buf;
1246     }
1247
1248     av_dlog(s, "Sending:\n%s--\n", buf);
1249
1250     ffurl_write(rt->rtsp_hd_out, out_buf, strlen(out_buf));
1251     if (send_content_length > 0 && send_content) {
1252         if (rt->control_transport == RTSP_MODE_TUNNEL) {
1253             av_log(s, AV_LOG_ERROR, "tunneling of RTSP requests "
1254                                     "with content data not supported\n");
1255             return AVERROR_PATCHWELCOME;
1256         }
1257         ffurl_write(rt->rtsp_hd_out, send_content, send_content_length);
1258     }
1259     rt->last_cmd_time = av_gettime();
1260
1261     return 0;
1262 }
1263
1264 int ff_rtsp_send_cmd_async(AVFormatContext *s, const char *method,
1265                            const char *url, const char *headers)
1266 {
1267     return rtsp_send_cmd_with_content_async(s, method, url, headers, NULL, 0);
1268 }
1269
1270 int ff_rtsp_send_cmd(AVFormatContext *s, const char *method, const char *url,
1271                      const char *headers, RTSPMessageHeader *reply,
1272                      unsigned char **content_ptr)
1273 {
1274     return ff_rtsp_send_cmd_with_content(s, method, url, headers, reply,
1275                                          content_ptr, NULL, 0);
1276 }
1277
1278 int ff_rtsp_send_cmd_with_content(AVFormatContext *s,
1279                                   const char *method, const char *url,
1280                                   const char *header,
1281                                   RTSPMessageHeader *reply,
1282                                   unsigned char **content_ptr,
1283                                   const unsigned char *send_content,
1284                                   int send_content_length)
1285 {
1286     RTSPState *rt = s->priv_data;
1287     HTTPAuthType cur_auth_type;
1288     int ret, attempts = 0;
1289
1290 retry:
1291     cur_auth_type = rt->auth_state.auth_type;
1292     if ((ret = rtsp_send_cmd_with_content_async(s, method, url, header,
1293                                                 send_content,
1294                                                 send_content_length)))
1295         return ret;
1296
1297     if ((ret = ff_rtsp_read_reply(s, reply, content_ptr, 0, method) ) < 0)
1298         return ret;
1299     attempts++;
1300
1301     if (reply->status_code == 401 &&
1302         (cur_auth_type == HTTP_AUTH_NONE || rt->auth_state.stale) &&
1303         rt->auth_state.auth_type != HTTP_AUTH_NONE && attempts < 2)
1304         goto retry;
1305
1306     if (reply->status_code > 400){
1307         av_log(s, AV_LOG_ERROR, "method %s failed: %d%s\n",
1308                method,
1309                reply->status_code,
1310                reply->reason);
1311         av_log(s, AV_LOG_DEBUG, "%s\n", rt->last_reply);
1312     }
1313
1314     return 0;
1315 }
1316
1317 int ff_rtsp_make_setup_request(AVFormatContext *s, const char *host, int port,
1318                               int lower_transport, const char *real_challenge)
1319 {
1320     RTSPState *rt = s->priv_data;
1321     int rtx = 0, j, i, err, interleave = 0, port_off;
1322     RTSPStream *rtsp_st;
1323     RTSPMessageHeader reply1, *reply = &reply1;
1324     char cmd[2048];
1325     const char *trans_pref;
1326
1327     if (rt->transport == RTSP_TRANSPORT_RDT)
1328         trans_pref = "x-pn-tng";
1329     else if (rt->transport == RTSP_TRANSPORT_RAW)
1330         trans_pref = "RAW/RAW";
1331     else
1332         trans_pref = "RTP/AVP";
1333
1334     /* default timeout: 1 minute */
1335     rt->timeout = 60;
1336
1337     /* Choose a random starting offset within the first half of the
1338      * port range, to allow for a number of ports to try even if the offset
1339      * happens to be at the end of the random range. */
1340     port_off = av_get_random_seed() % ((rt->rtp_port_max - rt->rtp_port_min)/2);
1341     /* even random offset */
1342     port_off -= port_off & 0x01;
1343
1344     for (j = rt->rtp_port_min + port_off, i = 0; i < rt->nb_rtsp_streams; ++i) {
1345         char transport[2048];
1346
1347         /*
1348          * WMS serves all UDP data over a single connection, the RTX, which
1349          * isn't necessarily the first in the SDP but has to be the first
1350          * to be set up, else the second/third SETUP will fail with a 461.
1351          */
1352         if (lower_transport == RTSP_LOWER_TRANSPORT_UDP &&
1353              rt->server_type == RTSP_SERVER_WMS) {
1354             if (i == 0) {
1355                 /* rtx first */
1356                 for (rtx = 0; rtx < rt->nb_rtsp_streams; rtx++) {
1357                     int len = strlen(rt->rtsp_streams[rtx]->control_url);
1358                     if (len >= 4 &&
1359                         !strcmp(rt->rtsp_streams[rtx]->control_url + len - 4,
1360                                 "/rtx"))
1361                         break;
1362                 }
1363                 if (rtx == rt->nb_rtsp_streams)
1364                     return -1; /* no RTX found */
1365                 rtsp_st = rt->rtsp_streams[rtx];
1366             } else
1367                 rtsp_st = rt->rtsp_streams[i > rtx ? i : i - 1];
1368         } else
1369             rtsp_st = rt->rtsp_streams[i];
1370
1371         /* RTP/UDP */
1372         if (lower_transport == RTSP_LOWER_TRANSPORT_UDP) {
1373             char buf[256];
1374
1375             if (rt->server_type == RTSP_SERVER_WMS && i > 1) {
1376                 port = reply->transports[0].client_port_min;
1377                 goto have_port;
1378             }
1379
1380             /* first try in specified port range */
1381             while (j <= rt->rtp_port_max) {
1382                 ff_url_join(buf, sizeof(buf), "rtp", NULL, host, -1,
1383                             "?localport=%d", j);
1384                 /* we will use two ports per rtp stream (rtp and rtcp) */
1385                 j += 2;
1386                 if (!ffurl_open(&rtsp_st->rtp_handle, buf, AVIO_FLAG_READ_WRITE,
1387                                &s->interrupt_callback, NULL))
1388                     goto rtp_opened;
1389             }
1390             av_log(s, AV_LOG_ERROR, "Unable to open an input RTP port\n");
1391             err = AVERROR(EIO);
1392             goto fail;
1393
1394         rtp_opened:
1395             port = ff_rtp_get_local_rtp_port(rtsp_st->rtp_handle);
1396         have_port:
1397             snprintf(transport, sizeof(transport) - 1,
1398                      "%s/UDP;", trans_pref);
1399             if (rt->server_type != RTSP_SERVER_REAL)
1400                 av_strlcat(transport, "unicast;", sizeof(transport));
1401             av_strlcatf(transport, sizeof(transport),
1402                      "client_port=%d", port);
1403             if (rt->transport == RTSP_TRANSPORT_RTP &&
1404                 !(rt->server_type == RTSP_SERVER_WMS && i > 0))
1405                 av_strlcatf(transport, sizeof(transport), "-%d", port + 1);
1406         }
1407
1408         /* RTP/TCP */
1409         else if (lower_transport == RTSP_LOWER_TRANSPORT_TCP) {
1410             /* For WMS streams, the application streams are only used for
1411              * UDP. When trying to set it up for TCP streams, the server
1412              * will return an error. Therefore, we skip those streams. */
1413             if (rt->server_type == RTSP_SERVER_WMS &&
1414                 (rtsp_st->stream_index < 0 ||
1415                  s->streams[rtsp_st->stream_index]->codec->codec_type ==
1416                     AVMEDIA_TYPE_DATA))
1417                 continue;
1418             snprintf(transport, sizeof(transport) - 1,
1419                      "%s/TCP;", trans_pref);
1420             if (rt->transport != RTSP_TRANSPORT_RDT)
1421                 av_strlcat(transport, "unicast;", sizeof(transport));
1422             av_strlcatf(transport, sizeof(transport),
1423                         "interleaved=%d-%d",
1424                         interleave, interleave + 1);
1425             interleave += 2;
1426         }
1427
1428         else if (lower_transport == RTSP_LOWER_TRANSPORT_UDP_MULTICAST) {
1429             snprintf(transport, sizeof(transport) - 1,
1430                      "%s/UDP;multicast", trans_pref);
1431         }
1432         if (s->oformat) {
1433             av_strlcat(transport, ";mode=record", sizeof(transport));
1434         } else if (rt->server_type == RTSP_SERVER_REAL ||
1435                    rt->server_type == RTSP_SERVER_WMS)
1436             av_strlcat(transport, ";mode=play", sizeof(transport));
1437         snprintf(cmd, sizeof(cmd),
1438                  "Transport: %s\r\n",
1439                  transport);
1440         if (rt->accept_dynamic_rate)
1441             av_strlcat(cmd, "x-Dynamic-Rate: 0\r\n", sizeof(cmd));
1442         if (i == 0 && rt->server_type == RTSP_SERVER_REAL && CONFIG_RTPDEC) {
1443             char real_res[41], real_csum[9];
1444             ff_rdt_calc_response_and_checksum(real_res, real_csum,
1445                                               real_challenge);
1446             av_strlcatf(cmd, sizeof(cmd),
1447                         "If-Match: %s\r\n"
1448                         "RealChallenge2: %s, sd=%s\r\n",
1449                         rt->session_id, real_res, real_csum);
1450         }
1451         ff_rtsp_send_cmd(s, "SETUP", rtsp_st->control_url, cmd, reply, NULL);
1452         if (reply->status_code == 461 /* Unsupported protocol */ && i == 0) {
1453             err = 1;
1454             goto fail;
1455         } else if (reply->status_code != RTSP_STATUS_OK ||
1456                    reply->nb_transports != 1) {
1457             err = AVERROR_INVALIDDATA;
1458             goto fail;
1459         }
1460
1461         /* XXX: same protocol for all streams is required */
1462         if (i > 0) {
1463             if (reply->transports[0].lower_transport != rt->lower_transport ||
1464                 reply->transports[0].transport != rt->transport) {
1465                 err = AVERROR_INVALIDDATA;
1466                 goto fail;
1467             }
1468         } else {
1469             rt->lower_transport = reply->transports[0].lower_transport;
1470             rt->transport = reply->transports[0].transport;
1471         }
1472
1473         /* Fail if the server responded with another lower transport mode
1474          * than what we requested. */
1475         if (reply->transports[0].lower_transport != lower_transport) {
1476             av_log(s, AV_LOG_ERROR, "Nonmatching transport in server reply\n");
1477             err = AVERROR_INVALIDDATA;
1478             goto fail;
1479         }
1480
1481         switch(reply->transports[0].lower_transport) {
1482         case RTSP_LOWER_TRANSPORT_TCP:
1483             rtsp_st->interleaved_min = reply->transports[0].interleaved_min;
1484             rtsp_st->interleaved_max = reply->transports[0].interleaved_max;
1485             break;
1486
1487         case RTSP_LOWER_TRANSPORT_UDP: {
1488             char url[1024], options[30] = "";
1489             const char *peer = host;
1490
1491             if (rt->rtsp_flags & RTSP_FLAG_FILTER_SRC)
1492                 av_strlcpy(options, "?connect=1", sizeof(options));
1493             /* Use source address if specified */
1494             if (reply->transports[0].source[0])
1495                 peer = reply->transports[0].source;
1496             ff_url_join(url, sizeof(url), "rtp", NULL, peer,
1497                         reply->transports[0].server_port_min, "%s", options);
1498             if (!(rt->server_type == RTSP_SERVER_WMS && i > 1) &&
1499                 ff_rtp_set_remote_url(rtsp_st->rtp_handle, url) < 0) {
1500                 err = AVERROR_INVALIDDATA;
1501                 goto fail;
1502             }
1503             /* Try to initialize the connection state in a
1504              * potential NAT router by sending dummy packets.
1505              * RTP/RTCP dummy packets are used for RDT, too.
1506              */
1507             if (!(rt->server_type == RTSP_SERVER_WMS && i > 1) && s->iformat &&
1508                 CONFIG_RTPDEC)
1509                 ff_rtp_send_punch_packets(rtsp_st->rtp_handle);
1510             break;
1511         }
1512         case RTSP_LOWER_TRANSPORT_UDP_MULTICAST: {
1513             char url[1024], namebuf[50], optbuf[20] = "";
1514             struct sockaddr_storage addr;
1515             int port, ttl;
1516
1517             if (reply->transports[0].destination.ss_family) {
1518                 addr      = reply->transports[0].destination;
1519                 port      = reply->transports[0].port_min;
1520                 ttl       = reply->transports[0].ttl;
1521             } else {
1522                 addr      = rtsp_st->sdp_ip;
1523                 port      = rtsp_st->sdp_port;
1524                 ttl       = rtsp_st->sdp_ttl;
1525             }
1526             if (ttl > 0)
1527                 snprintf(optbuf, sizeof(optbuf), "?ttl=%d", ttl);
1528             getnameinfo((struct sockaddr*) &addr, sizeof(addr),
1529                         namebuf, sizeof(namebuf), NULL, 0, NI_NUMERICHOST);
1530             ff_url_join(url, sizeof(url), "rtp", NULL, namebuf,
1531                         port, "%s", optbuf);
1532             if (ffurl_open(&rtsp_st->rtp_handle, url, AVIO_FLAG_READ_WRITE,
1533                            &s->interrupt_callback, NULL) < 0) {
1534                 err = AVERROR_INVALIDDATA;
1535                 goto fail;
1536             }
1537             break;
1538         }
1539         }
1540
1541         if ((err = ff_rtsp_open_transport_ctx(s, rtsp_st)))
1542             goto fail;
1543     }
1544
1545     if (rt->nb_rtsp_streams && reply->timeout > 0)
1546         rt->timeout = reply->timeout;
1547
1548     if (rt->server_type == RTSP_SERVER_REAL)
1549         rt->need_subscription = 1;
1550
1551     return 0;
1552
1553 fail:
1554     ff_rtsp_undo_setup(s, 0);
1555     return err;
1556 }
1557
1558 void ff_rtsp_close_connections(AVFormatContext *s)
1559 {
1560     RTSPState *rt = s->priv_data;
1561     if (rt->rtsp_hd_out != rt->rtsp_hd) ffurl_close(rt->rtsp_hd_out);
1562     ffurl_close(rt->rtsp_hd);
1563     rt->rtsp_hd = rt->rtsp_hd_out = NULL;
1564 }
1565
1566 int ff_rtsp_connect(AVFormatContext *s)
1567 {
1568     RTSPState *rt = s->priv_data;
1569     char host[1024], path[1024], tcpname[1024], cmd[2048], auth[128];
1570     int port, err, tcp_fd;
1571     RTSPMessageHeader reply1 = {0}, *reply = &reply1;
1572     int lower_transport_mask = 0;
1573     char real_challenge[64] = "";
1574     struct sockaddr_storage peer;
1575     socklen_t peer_len = sizeof(peer);
1576
1577     if (rt->rtp_port_max < rt->rtp_port_min) {
1578         av_log(s, AV_LOG_ERROR, "Invalid UDP port range, max port %d less "
1579                                 "than min port %d\n", rt->rtp_port_max,
1580                                                       rt->rtp_port_min);
1581         return AVERROR(EINVAL);
1582     }
1583
1584     if (!ff_network_init())
1585         return AVERROR(EIO);
1586
1587     if (s->max_delay < 0) /* Not set by the caller */
1588         s->max_delay = s->iformat ? DEFAULT_REORDERING_DELAY : 0;
1589
1590     rt->control_transport = RTSP_MODE_PLAIN;
1591     if (rt->lower_transport_mask & (1 << RTSP_LOWER_TRANSPORT_HTTP)) {
1592         rt->lower_transport_mask = 1 << RTSP_LOWER_TRANSPORT_TCP;
1593         rt->control_transport = RTSP_MODE_TUNNEL;
1594     }
1595     /* Only pass through valid flags from here */
1596     rt->lower_transport_mask &= (1 << RTSP_LOWER_TRANSPORT_NB) - 1;
1597
1598 redirect:
1599     lower_transport_mask = rt->lower_transport_mask;
1600     /* extract hostname and port */
1601     av_url_split(NULL, 0, auth, sizeof(auth),
1602                  host, sizeof(host), &port, path, sizeof(path), s->filename);
1603     if (*auth) {
1604         av_strlcpy(rt->auth, auth, sizeof(rt->auth));
1605     }
1606     if (port < 0)
1607         port = RTSP_DEFAULT_PORT;
1608
1609     if (!lower_transport_mask)
1610         lower_transport_mask = (1 << RTSP_LOWER_TRANSPORT_NB) - 1;
1611
1612     if (s->oformat) {
1613         /* Only UDP or TCP - UDP multicast isn't supported. */
1614         lower_transport_mask &= (1 << RTSP_LOWER_TRANSPORT_UDP) |
1615                                 (1 << RTSP_LOWER_TRANSPORT_TCP);
1616         if (!lower_transport_mask || rt->control_transport == RTSP_MODE_TUNNEL) {
1617             av_log(s, AV_LOG_ERROR, "Unsupported lower transport method, "
1618                                     "only UDP and TCP are supported for output.\n");
1619             err = AVERROR(EINVAL);
1620             goto fail;
1621         }
1622     }
1623
1624     /* Construct the URI used in request; this is similar to s->filename,
1625      * but with authentication credentials removed and RTSP specific options
1626      * stripped out. */
1627     ff_url_join(rt->control_uri, sizeof(rt->control_uri), "rtsp", NULL,
1628                 host, port, "%s", path);
1629
1630     if (rt->control_transport == RTSP_MODE_TUNNEL) {
1631         /* set up initial handshake for tunneling */
1632         char httpname[1024];
1633         char sessioncookie[17];
1634         char headers[1024];
1635
1636         ff_url_join(httpname, sizeof(httpname), "http", auth, host, port, "%s", path);
1637         snprintf(sessioncookie, sizeof(sessioncookie), "%08x%08x",
1638                  av_get_random_seed(), av_get_random_seed());
1639
1640         /* GET requests */
1641         if (ffurl_alloc(&rt->rtsp_hd, httpname, AVIO_FLAG_READ,
1642                         &s->interrupt_callback) < 0) {
1643             err = AVERROR(EIO);
1644             goto fail;
1645         }
1646
1647         /* generate GET headers */
1648         snprintf(headers, sizeof(headers),
1649                  "x-sessioncookie: %s\r\n"
1650                  "Accept: application/x-rtsp-tunnelled\r\n"
1651                  "Pragma: no-cache\r\n"
1652                  "Cache-Control: no-cache\r\n",
1653                  sessioncookie);
1654         av_opt_set(rt->rtsp_hd->priv_data, "headers", headers, 0);
1655
1656         /* complete the connection */
1657         if (ffurl_connect(rt->rtsp_hd, NULL)) {
1658             err = AVERROR(EIO);
1659             goto fail;
1660         }
1661
1662         /* POST requests */
1663         if (ffurl_alloc(&rt->rtsp_hd_out, httpname, AVIO_FLAG_WRITE,
1664                         &s->interrupt_callback) < 0 ) {
1665             err = AVERROR(EIO);
1666             goto fail;
1667         }
1668
1669         /* generate POST headers */
1670         snprintf(headers, sizeof(headers),
1671                  "x-sessioncookie: %s\r\n"
1672                  "Content-Type: application/x-rtsp-tunnelled\r\n"
1673                  "Pragma: no-cache\r\n"
1674                  "Cache-Control: no-cache\r\n"
1675                  "Content-Length: 32767\r\n"
1676                  "Expires: Sun, 9 Jan 1972 00:00:00 GMT\r\n",
1677                  sessioncookie);
1678         av_opt_set(rt->rtsp_hd_out->priv_data, "headers", headers, 0);
1679         av_opt_set(rt->rtsp_hd_out->priv_data, "chunked_post", "0", 0);
1680
1681         /* Initialize the authentication state for the POST session. The HTTP
1682          * protocol implementation doesn't properly handle multi-pass
1683          * authentication for POST requests, since it would require one of
1684          * the following:
1685          * - implementing Expect: 100-continue, which many HTTP servers
1686          *   don't support anyway, even less the RTSP servers that do HTTP
1687          *   tunneling
1688          * - sending the whole POST data until getting a 401 reply specifying
1689          *   what authentication method to use, then resending all that data
1690          * - waiting for potential 401 replies directly after sending the
1691          *   POST header (waiting for some unspecified time)
1692          * Therefore, we copy the full auth state, which works for both basic
1693          * and digest. (For digest, we would have to synchronize the nonce
1694          * count variable between the two sessions, if we'd do more requests
1695          * with the original session, though.)
1696          */
1697         ff_http_init_auth_state(rt->rtsp_hd_out, rt->rtsp_hd);
1698
1699         /* complete the connection */
1700         if (ffurl_connect(rt->rtsp_hd_out, NULL)) {
1701             err = AVERROR(EIO);
1702             goto fail;
1703         }
1704     } else {
1705         /* open the tcp connection */
1706         ff_url_join(tcpname, sizeof(tcpname), "tcp", NULL, host, port,
1707                     "?timeout=%d", rt->stimeout);
1708         if (ffurl_open(&rt->rtsp_hd, tcpname, AVIO_FLAG_READ_WRITE,
1709                        &s->interrupt_callback, NULL) < 0) {
1710             err = AVERROR(EIO);
1711             goto fail;
1712         }
1713         rt->rtsp_hd_out = rt->rtsp_hd;
1714     }
1715     rt->seq = 0;
1716
1717     tcp_fd = ffurl_get_file_handle(rt->rtsp_hd);
1718     if (!getpeername(tcp_fd, (struct sockaddr*) &peer, &peer_len)) {
1719         getnameinfo((struct sockaddr*) &peer, peer_len, host, sizeof(host),
1720                     NULL, 0, NI_NUMERICHOST);
1721     }
1722
1723     /* request options supported by the server; this also detects server
1724      * type */
1725     for (rt->server_type = RTSP_SERVER_RTP;;) {
1726         cmd[0] = 0;
1727         if (rt->server_type == RTSP_SERVER_REAL)
1728             av_strlcat(cmd,
1729                        /*
1730                         * The following entries are required for proper
1731                         * streaming from a Realmedia server. They are
1732                         * interdependent in some way although we currently
1733                         * don't quite understand how. Values were copied
1734                         * from mplayer SVN r23589.
1735                         *   ClientChallenge is a 16-byte ID in hex
1736                         *   CompanyID is a 16-byte ID in base64
1737                         */
1738                        "ClientChallenge: 9e26d33f2984236010ef6253fb1887f7\r\n"
1739                        "PlayerStarttime: [28/03/2003:22:50:23 00:00]\r\n"
1740                        "CompanyID: KnKV4M4I/B2FjJ1TToLycw==\r\n"
1741                        "GUID: 00000000-0000-0000-0000-000000000000\r\n",
1742                        sizeof(cmd));
1743         ff_rtsp_send_cmd(s, "OPTIONS", rt->control_uri, cmd, reply, NULL);
1744         if (reply->status_code != RTSP_STATUS_OK) {
1745             err = AVERROR_INVALIDDATA;
1746             goto fail;
1747         }
1748
1749         /* detect server type if not standard-compliant RTP */
1750         if (rt->server_type != RTSP_SERVER_REAL && reply->real_challenge[0]) {
1751             rt->server_type = RTSP_SERVER_REAL;
1752             continue;
1753         } else if (!av_strncasecmp(reply->server, "WMServer/", 9)) {
1754             rt->server_type = RTSP_SERVER_WMS;
1755         } else if (rt->server_type == RTSP_SERVER_REAL)
1756             strcpy(real_challenge, reply->real_challenge);
1757         break;
1758     }
1759
1760     if (s->iformat && CONFIG_RTSP_DEMUXER)
1761         err = ff_rtsp_setup_input_streams(s, reply);
1762     else if (CONFIG_RTSP_MUXER)
1763         err = ff_rtsp_setup_output_streams(s, host);
1764     if (err)
1765         goto fail;
1766
1767     do {
1768         int lower_transport = ff_log2_tab[lower_transport_mask &
1769                                   ~(lower_transport_mask - 1)];
1770
1771         if ((lower_transport_mask & (1 << RTSP_LOWER_TRANSPORT_TCP))
1772                 && (rt->rtsp_flags & RTSP_FLAG_PREFER_TCP))
1773             lower_transport = RTSP_LOWER_TRANSPORT_TCP;
1774
1775         err = ff_rtsp_make_setup_request(s, host, port, lower_transport,
1776                                  rt->server_type == RTSP_SERVER_REAL ?
1777                                      real_challenge : NULL);
1778         if (err < 0)
1779             goto fail;
1780         lower_transport_mask &= ~(1 << lower_transport);
1781         if (lower_transport_mask == 0 && err == 1) {
1782             err = AVERROR(EPROTONOSUPPORT);
1783             goto fail;
1784         }
1785     } while (err);
1786
1787     rt->lower_transport_mask = lower_transport_mask;
1788     av_strlcpy(rt->real_challenge, real_challenge, sizeof(rt->real_challenge));
1789     rt->state = RTSP_STATE_IDLE;
1790     rt->seek_timestamp = 0; /* default is to start stream at position zero */
1791     return 0;
1792  fail:
1793     ff_rtsp_close_streams(s);
1794     ff_rtsp_close_connections(s);
1795     if (reply->status_code >=300 && reply->status_code < 400 && s->iformat) {
1796         av_strlcpy(s->filename, reply->location, sizeof(s->filename));
1797         av_log(s, AV_LOG_INFO, "Status %d: Redirecting to %s\n",
1798                reply->status_code,
1799                s->filename);
1800         goto redirect;
1801     }
1802     ff_network_close();
1803     return err;
1804 }
1805 #endif /* CONFIG_RTSP_DEMUXER || CONFIG_RTSP_MUXER */
1806
1807 #if CONFIG_RTPDEC
1808 static int udp_read_packet(AVFormatContext *s, RTSPStream **prtsp_st,
1809                            uint8_t *buf, int buf_size, int64_t wait_end)
1810 {
1811     RTSPState *rt = s->priv_data;
1812     RTSPStream *rtsp_st;
1813     int n, i, ret, tcp_fd, timeout_cnt = 0;
1814     int max_p = 0;
1815     struct pollfd *p = rt->p;
1816     int *fds = NULL, fdsnum, fdsidx;
1817
1818     for (;;) {
1819         if (ff_check_interrupt(&s->interrupt_callback))
1820             return AVERROR_EXIT;
1821         if (wait_end && wait_end - av_gettime() < 0)
1822             return AVERROR(EAGAIN);
1823         max_p = 0;
1824         if (rt->rtsp_hd) {
1825             tcp_fd = ffurl_get_file_handle(rt->rtsp_hd);
1826             p[max_p].fd = tcp_fd;
1827             p[max_p++].events = POLLIN;
1828         } else {
1829             tcp_fd = -1;
1830         }
1831         for (i = 0; i < rt->nb_rtsp_streams; i++) {
1832             rtsp_st = rt->rtsp_streams[i];
1833             if (rtsp_st->rtp_handle) {
1834                 if (ret = ffurl_get_multi_file_handle(rtsp_st->rtp_handle,
1835                                                       &fds, &fdsnum)) {
1836                     av_log(s, AV_LOG_ERROR, "Unable to recover rtp ports\n");
1837                     return ret;
1838                 }
1839                 if (fdsnum != 2) {
1840                     av_log(s, AV_LOG_ERROR,
1841                            "Number of fds %d not supported\n", fdsnum);
1842                     return AVERROR_INVALIDDATA;
1843                 }
1844                 for (fdsidx = 0; fdsidx < fdsnum; fdsidx++) {
1845                     p[max_p].fd       = fds[fdsidx];
1846                     p[max_p++].events = POLLIN;
1847                 }
1848                 av_free(fds);
1849             }
1850         }
1851         n = poll(p, max_p, POLL_TIMEOUT_MS);
1852         if (n > 0) {
1853             int j = 1 - (tcp_fd == -1);
1854             timeout_cnt = 0;
1855             for (i = 0; i < rt->nb_rtsp_streams; i++) {
1856                 rtsp_st = rt->rtsp_streams[i];
1857                 if (rtsp_st->rtp_handle) {
1858                     if (p[j].revents & POLLIN || p[j+1].revents & POLLIN) {
1859                         ret = ffurl_read(rtsp_st->rtp_handle, buf, buf_size);
1860                         if (ret > 0) {
1861                             *prtsp_st = rtsp_st;
1862                             return ret;
1863                         }
1864                     }
1865                     j+=2;
1866                 }
1867             }
1868 #if CONFIG_RTSP_DEMUXER
1869             if (tcp_fd != -1 && p[0].revents & POLLIN) {
1870                 if (rt->rtsp_flags & RTSP_FLAG_LISTEN) {
1871                     if (rt->state == RTSP_STATE_STREAMING) {
1872                         if (!ff_rtsp_parse_streaming_commands(s))
1873                             return AVERROR_EOF;
1874                         else
1875                             av_log(s, AV_LOG_WARNING,
1876                                    "Unable to answer to TEARDOWN\n");
1877                     } else
1878                         return 0;
1879                 } else {
1880                     RTSPMessageHeader reply;
1881                     ret = ff_rtsp_read_reply(s, &reply, NULL, 0, NULL);
1882                     if (ret < 0)
1883                         return ret;
1884                     /* XXX: parse message */
1885                     if (rt->state != RTSP_STATE_STREAMING)
1886                         return 0;
1887                 }
1888             }
1889 #endif
1890         } else if (n == 0 && ++timeout_cnt >= MAX_TIMEOUTS) {
1891             return AVERROR(ETIMEDOUT);
1892         } else if (n < 0 && errno != EINTR)
1893             return AVERROR(errno);
1894     }
1895 }
1896
1897 static int pick_stream(AVFormatContext *s, RTSPStream **rtsp_st,
1898                        const uint8_t *buf, int len)
1899 {
1900     RTSPState *rt = s->priv_data;
1901     int i;
1902     if (len < 0)
1903         return len;
1904     if (rt->nb_rtsp_streams == 1) {
1905         *rtsp_st = rt->rtsp_streams[0];
1906         return len;
1907     }
1908     if (len >= 8 && rt->transport == RTSP_TRANSPORT_RTP) {
1909         if (RTP_PT_IS_RTCP(rt->recvbuf[1])) {
1910             int no_ssrc = 0;
1911             for (i = 0; i < rt->nb_rtsp_streams; i++) {
1912                 RTPDemuxContext *rtpctx = rt->rtsp_streams[i]->transport_priv;
1913                 if (!rtpctx)
1914                     continue;
1915                 if (rtpctx->ssrc == AV_RB32(&buf[4])) {
1916                     *rtsp_st = rt->rtsp_streams[i];
1917                     return len;
1918                 }
1919                 if (!rtpctx->ssrc)
1920                     no_ssrc = 1;
1921             }
1922             if (no_ssrc) {
1923                 av_log(s, AV_LOG_WARNING,
1924                        "Unable to pick stream for packet - SSRC not known for "
1925                        "all streams\n");
1926                 return AVERROR(EAGAIN);
1927             }
1928         } else {
1929             for (i = 0; i < rt->nb_rtsp_streams; i++) {
1930                 if ((buf[1] & 0x7f) == rt->rtsp_streams[i]->sdp_payload_type) {
1931                     *rtsp_st = rt->rtsp_streams[i];
1932                     return len;
1933                 }
1934             }
1935         }
1936     }
1937     av_log(s, AV_LOG_WARNING, "Unable to pick stream for packet\n");
1938     return AVERROR(EAGAIN);
1939 }
1940
1941 int ff_rtsp_fetch_packet(AVFormatContext *s, AVPacket *pkt)
1942 {
1943     RTSPState *rt = s->priv_data;
1944     int ret, len;
1945     RTSPStream *rtsp_st, *first_queue_st = NULL;
1946     int64_t wait_end = 0;
1947
1948     if (rt->nb_byes == rt->nb_rtsp_streams)
1949         return AVERROR_EOF;
1950
1951     /* get next frames from the same RTP packet */
1952     if (rt->cur_transport_priv) {
1953         if (rt->transport == RTSP_TRANSPORT_RDT) {
1954             ret = ff_rdt_parse_packet(rt->cur_transport_priv, pkt, NULL, 0);
1955         } else if (rt->transport == RTSP_TRANSPORT_RTP) {
1956             ret = ff_rtp_parse_packet(rt->cur_transport_priv, pkt, NULL, 0);
1957         } else if (rt->ts && CONFIG_RTPDEC) {
1958             ret = ff_mpegts_parse_packet(rt->ts, pkt, rt->recvbuf + rt->recvbuf_pos, rt->recvbuf_len - rt->recvbuf_pos);
1959             if (ret >= 0) {
1960                 rt->recvbuf_pos += ret;
1961                 ret = rt->recvbuf_pos < rt->recvbuf_len;
1962             }
1963         } else
1964             ret = -1;
1965         if (ret == 0) {
1966             rt->cur_transport_priv = NULL;
1967             return 0;
1968         } else if (ret == 1) {
1969             return 0;
1970         } else
1971             rt->cur_transport_priv = NULL;
1972     }
1973
1974 redo:
1975     if (rt->transport == RTSP_TRANSPORT_RTP) {
1976         int i;
1977         int64_t first_queue_time = 0;
1978         for (i = 0; i < rt->nb_rtsp_streams; i++) {
1979             RTPDemuxContext *rtpctx = rt->rtsp_streams[i]->transport_priv;
1980             int64_t queue_time;
1981             if (!rtpctx)
1982                 continue;
1983             queue_time = ff_rtp_queued_packet_time(rtpctx);
1984             if (queue_time && (queue_time - first_queue_time < 0 ||
1985                                !first_queue_time)) {
1986                 first_queue_time = queue_time;
1987                 first_queue_st   = rt->rtsp_streams[i];
1988             }
1989         }
1990         if (first_queue_time) {
1991             wait_end = first_queue_time + s->max_delay;
1992         } else {
1993             wait_end = 0;
1994             first_queue_st = NULL;
1995         }
1996     }
1997
1998     /* read next RTP packet */
1999     if (!rt->recvbuf) {
2000         rt->recvbuf = av_malloc(RECVBUF_SIZE);
2001         if (!rt->recvbuf)
2002             return AVERROR(ENOMEM);
2003     }
2004
2005     switch(rt->lower_transport) {
2006     default:
2007 #if CONFIG_RTSP_DEMUXER
2008     case RTSP_LOWER_TRANSPORT_TCP:
2009         len = ff_rtsp_tcp_read_packet(s, &rtsp_st, rt->recvbuf, RECVBUF_SIZE);
2010         break;
2011 #endif
2012     case RTSP_LOWER_TRANSPORT_UDP:
2013     case RTSP_LOWER_TRANSPORT_UDP_MULTICAST:
2014         len = udp_read_packet(s, &rtsp_st, rt->recvbuf, RECVBUF_SIZE, wait_end);
2015         if (len > 0 && rtsp_st->transport_priv && rt->transport == RTSP_TRANSPORT_RTP)
2016             ff_rtp_check_and_send_back_rr(rtsp_st->transport_priv, rtsp_st->rtp_handle, NULL, len);
2017         break;
2018     case RTSP_LOWER_TRANSPORT_CUSTOM:
2019         if (first_queue_st && rt->transport == RTSP_TRANSPORT_RTP &&
2020             wait_end && wait_end < av_gettime())
2021             len = AVERROR(EAGAIN);
2022         else
2023             len = ffio_read_partial(s->pb, rt->recvbuf, RECVBUF_SIZE);
2024         len = pick_stream(s, &rtsp_st, rt->recvbuf, len);
2025         if (len > 0 && rtsp_st->transport_priv && rt->transport == RTSP_TRANSPORT_RTP)
2026             ff_rtp_check_and_send_back_rr(rtsp_st->transport_priv, NULL, s->pb, len);
2027         break;
2028     }
2029     if (len == AVERROR(EAGAIN) && first_queue_st &&
2030         rt->transport == RTSP_TRANSPORT_RTP) {
2031         rtsp_st = first_queue_st;
2032         ret = ff_rtp_parse_packet(rtsp_st->transport_priv, pkt, NULL, 0);
2033         goto end;
2034     }
2035     if (len < 0)
2036         return len;
2037     if (len == 0)
2038         return AVERROR_EOF;
2039     if (rt->transport == RTSP_TRANSPORT_RDT) {
2040         ret = ff_rdt_parse_packet(rtsp_st->transport_priv, pkt, &rt->recvbuf, len);
2041     } else if (rt->transport == RTSP_TRANSPORT_RTP) {
2042         ret = ff_rtp_parse_packet(rtsp_st->transport_priv, pkt, &rt->recvbuf, len);
2043         if (rtsp_st->feedback) {
2044             AVIOContext *pb = NULL;
2045             if (rt->lower_transport == RTSP_LOWER_TRANSPORT_CUSTOM)
2046                 pb = s->pb;
2047             ff_rtp_send_rtcp_feedback(rtsp_st->transport_priv, rtsp_st->rtp_handle, pb);
2048         }
2049         if (ret < 0) {
2050             /* Either bad packet, or a RTCP packet. Check if the
2051              * first_rtcp_ntp_time field was initialized. */
2052             RTPDemuxContext *rtpctx = rtsp_st->transport_priv;
2053             if (rtpctx->first_rtcp_ntp_time != AV_NOPTS_VALUE) {
2054                 /* first_rtcp_ntp_time has been initialized for this stream,
2055                  * copy the same value to all other uninitialized streams,
2056                  * in order to map their timestamp origin to the same ntp time
2057                  * as this one. */
2058                 int i;
2059                 AVStream *st = NULL;
2060                 if (rtsp_st->stream_index >= 0)
2061                     st = s->streams[rtsp_st->stream_index];
2062                 for (i = 0; i < rt->nb_rtsp_streams; i++) {
2063                     RTPDemuxContext *rtpctx2 = rt->rtsp_streams[i]->transport_priv;
2064                     AVStream *st2 = NULL;
2065                     if (rt->rtsp_streams[i]->stream_index >= 0)
2066                         st2 = s->streams[rt->rtsp_streams[i]->stream_index];
2067                     if (rtpctx2 && st && st2 &&
2068                         rtpctx2->first_rtcp_ntp_time == AV_NOPTS_VALUE) {
2069                         rtpctx2->first_rtcp_ntp_time = rtpctx->first_rtcp_ntp_time;
2070                         rtpctx2->rtcp_ts_offset = av_rescale_q(
2071                             rtpctx->rtcp_ts_offset, st->time_base,
2072                             st2->time_base);
2073                     }
2074                 }
2075                 // Make real NTP start time available in AVFormatContext
2076                 if (s->start_time_realtime == AV_NOPTS_VALUE) {
2077                     s->start_time_realtime = av_rescale (rtpctx->first_rtcp_ntp_time - (NTP_OFFSET << 32), 1000000, 1LL << 32);
2078                     if (rtpctx->st) {
2079                         s->start_time_realtime -=
2080                             av_rescale (rtpctx->rtcp_ts_offset,
2081                                         (uint64_t) rtpctx->st->time_base.num * 1000000,
2082                                                    rtpctx->st->time_base.den);
2083                     }
2084                 }
2085             }
2086             if (ret == -RTCP_BYE) {
2087                 rt->nb_byes++;
2088
2089                 av_log(s, AV_LOG_DEBUG, "Received BYE for stream %d (%d/%d)\n",
2090                        rtsp_st->stream_index, rt->nb_byes, rt->nb_rtsp_streams);
2091
2092                 if (rt->nb_byes == rt->nb_rtsp_streams)
2093                     return AVERROR_EOF;
2094             }
2095         }
2096     } else if (rt->ts && CONFIG_RTPDEC) {
2097         ret = ff_mpegts_parse_packet(rt->ts, pkt, rt->recvbuf, len);
2098         if (ret >= 0) {
2099             if (ret < len) {
2100                 rt->recvbuf_len = len;
2101                 rt->recvbuf_pos = ret;
2102                 rt->cur_transport_priv = rt->ts;
2103                 return 1;
2104             } else {
2105                 ret = 0;
2106             }
2107         }
2108     } else {
2109         return AVERROR_INVALIDDATA;
2110     }
2111 end:
2112     if (ret < 0)
2113         goto redo;
2114     if (ret == 1)
2115         /* more packets may follow, so we save the RTP context */
2116         rt->cur_transport_priv = rtsp_st->transport_priv;
2117
2118     return ret;
2119 }
2120 #endif /* CONFIG_RTPDEC */
2121
2122 #if CONFIG_SDP_DEMUXER
2123 static int sdp_probe(AVProbeData *p1)
2124 {
2125     const char *p = p1->buf, *p_end = p1->buf + p1->buf_size;
2126
2127     /* we look for a line beginning "c=IN IP" */
2128     while (p < p_end && *p != '\0') {
2129         if (p + sizeof("c=IN IP") - 1 < p_end &&
2130             av_strstart(p, "c=IN IP", NULL))
2131             return AVPROBE_SCORE_EXTENSION;
2132
2133         while (p < p_end - 1 && *p != '\n') p++;
2134         if (++p >= p_end)
2135             break;
2136         if (*p == '\r')
2137             p++;
2138     }
2139     return 0;
2140 }
2141
2142 static void append_source_addrs(char *buf, int size, const char *name,
2143                                 int count, struct RTSPSource **addrs)
2144 {
2145     int i;
2146     if (!count)
2147         return;
2148     av_strlcatf(buf, size, "&%s=%s", name, addrs[0]->addr);
2149     for (i = 1; i < count; i++)
2150         av_strlcatf(buf, size, ",%s", addrs[i]->addr);
2151 }
2152
2153 static int sdp_read_header(AVFormatContext *s)
2154 {
2155     RTSPState *rt = s->priv_data;
2156     RTSPStream *rtsp_st;
2157     int size, i, err;
2158     char *content;
2159     char url[1024];
2160
2161     if (!ff_network_init())
2162         return AVERROR(EIO);
2163
2164     if (s->max_delay < 0) /* Not set by the caller */
2165         s->max_delay = DEFAULT_REORDERING_DELAY;
2166     if (rt->rtsp_flags & RTSP_FLAG_CUSTOM_IO)
2167         rt->lower_transport = RTSP_LOWER_TRANSPORT_CUSTOM;
2168
2169     /* read the whole sdp file */
2170     /* XXX: better loading */
2171     content = av_malloc(SDP_MAX_SIZE);
2172     size = avio_read(s->pb, content, SDP_MAX_SIZE - 1);
2173     if (size <= 0) {
2174         av_free(content);
2175         return AVERROR_INVALIDDATA;
2176     }
2177     content[size] ='\0';
2178
2179     err = ff_sdp_parse(s, content);
2180     av_free(content);
2181     if (err) goto fail;
2182
2183     /* open each RTP stream */
2184     for (i = 0; i < rt->nb_rtsp_streams; i++) {
2185         char namebuf[50];
2186         rtsp_st = rt->rtsp_streams[i];
2187
2188         if (!(rt->rtsp_flags & RTSP_FLAG_CUSTOM_IO)) {
2189             getnameinfo((struct sockaddr*) &rtsp_st->sdp_ip, sizeof(rtsp_st->sdp_ip),
2190                         namebuf, sizeof(namebuf), NULL, 0, NI_NUMERICHOST);
2191             ff_url_join(url, sizeof(url), "rtp", NULL,
2192                         namebuf, rtsp_st->sdp_port,
2193                         "?localport=%d&ttl=%d&connect=%d&write_to_source=%d",
2194                         rtsp_st->sdp_port, rtsp_st->sdp_ttl,
2195                         rt->rtsp_flags & RTSP_FLAG_FILTER_SRC ? 1 : 0,
2196                         rt->rtsp_flags & RTSP_FLAG_RTCP_TO_SOURCE ? 1 : 0);
2197
2198             append_source_addrs(url, sizeof(url), "sources",
2199                                 rtsp_st->nb_include_source_addrs,
2200                                 rtsp_st->include_source_addrs);
2201             append_source_addrs(url, sizeof(url), "block",
2202                                 rtsp_st->nb_exclude_source_addrs,
2203                                 rtsp_st->exclude_source_addrs);
2204             if (ffurl_open(&rtsp_st->rtp_handle, url, AVIO_FLAG_READ_WRITE,
2205                            &s->interrupt_callback, NULL) < 0) {
2206                 err = AVERROR_INVALIDDATA;
2207                 goto fail;
2208             }
2209         }
2210         if ((err = ff_rtsp_open_transport_ctx(s, rtsp_st)))
2211             goto fail;
2212     }
2213     return 0;
2214 fail:
2215     ff_rtsp_close_streams(s);
2216     ff_network_close();
2217     return err;
2218 }
2219
2220 static int sdp_read_close(AVFormatContext *s)
2221 {
2222     ff_rtsp_close_streams(s);
2223     ff_network_close();
2224     return 0;
2225 }
2226
2227 static const AVClass sdp_demuxer_class = {
2228     .class_name     = "SDP demuxer",
2229     .item_name      = av_default_item_name,
2230     .option         = sdp_options,
2231     .version        = LIBAVUTIL_VERSION_INT,
2232 };
2233
2234 AVInputFormat ff_sdp_demuxer = {
2235     .name           = "sdp",
2236     .long_name      = NULL_IF_CONFIG_SMALL("SDP"),
2237     .priv_data_size = sizeof(RTSPState),
2238     .read_probe     = sdp_probe,
2239     .read_header    = sdp_read_header,
2240     .read_packet    = ff_rtsp_fetch_packet,
2241     .read_close     = sdp_read_close,
2242     .priv_class     = &sdp_demuxer_class,
2243 };
2244 #endif /* CONFIG_SDP_DEMUXER */
2245
2246 #if CONFIG_RTP_DEMUXER
2247 static int rtp_probe(AVProbeData *p)
2248 {
2249     if (av_strstart(p->filename, "rtp:", NULL))
2250         return AVPROBE_SCORE_MAX;
2251     return 0;
2252 }
2253
2254 static int rtp_read_header(AVFormatContext *s)
2255 {
2256     uint8_t recvbuf[RTP_MAX_PACKET_LENGTH];
2257     char host[500], sdp[500];
2258     int ret, port;
2259     URLContext* in = NULL;
2260     int payload_type;
2261     AVCodecContext codec = { 0 };
2262     struct sockaddr_storage addr;
2263     AVIOContext pb;
2264     socklen_t addrlen = sizeof(addr);
2265     RTSPState *rt = s->priv_data;
2266
2267     if (!ff_network_init())
2268         return AVERROR(EIO);
2269
2270     ret = ffurl_open(&in, s->filename, AVIO_FLAG_READ,
2271                      &s->interrupt_callback, NULL);
2272     if (ret)
2273         goto fail;
2274
2275     while (1) {
2276         ret = ffurl_read(in, recvbuf, sizeof(recvbuf));
2277         if (ret == AVERROR(EAGAIN))
2278             continue;
2279         if (ret < 0)
2280             goto fail;
2281         if (ret < 12) {
2282             av_log(s, AV_LOG_WARNING, "Received too short packet\n");
2283             continue;
2284         }
2285
2286         if ((recvbuf[0] & 0xc0) != 0x80) {
2287             av_log(s, AV_LOG_WARNING, "Unsupported RTP version packet "
2288                                       "received\n");
2289             continue;
2290         }
2291
2292         if (RTP_PT_IS_RTCP(recvbuf[1]))
2293             continue;
2294
2295         payload_type = recvbuf[1] & 0x7f;
2296         break;
2297     }
2298     getsockname(ffurl_get_file_handle(in), (struct sockaddr*) &addr, &addrlen);
2299     ffurl_close(in);
2300     in = NULL;
2301
2302     if (ff_rtp_get_codec_info(&codec, payload_type)) {
2303         av_log(s, AV_LOG_ERROR, "Unable to receive RTP payload type %d "
2304                                 "without an SDP file describing it\n",
2305                                  payload_type);
2306         goto fail;
2307     }
2308     if (codec.codec_type != AVMEDIA_TYPE_DATA) {
2309         av_log(s, AV_LOG_WARNING, "Guessing on RTP content - if not received "
2310                                   "properly you need an SDP file "
2311                                   "describing it\n");
2312     }
2313
2314     av_url_split(NULL, 0, NULL, 0, host, sizeof(host), &port,
2315                  NULL, 0, s->filename);
2316
2317     snprintf(sdp, sizeof(sdp),
2318              "v=0\r\nc=IN IP%d %s\r\nm=%s %d RTP/AVP %d\r\n",
2319              addr.ss_family == AF_INET ? 4 : 6, host,
2320              codec.codec_type == AVMEDIA_TYPE_DATA  ? "application" :
2321              codec.codec_type == AVMEDIA_TYPE_VIDEO ? "video" : "audio",
2322              port, payload_type);
2323     av_log(s, AV_LOG_VERBOSE, "SDP:\n%s\n", sdp);
2324
2325     ffio_init_context(&pb, sdp, strlen(sdp), 0, NULL, NULL, NULL, NULL);
2326     s->pb = &pb;
2327
2328     /* sdp_read_header initializes this again */
2329     ff_network_close();
2330
2331     rt->media_type_mask = (1 << (AVMEDIA_TYPE_DATA+1)) - 1;
2332
2333     ret = sdp_read_header(s);
2334     s->pb = NULL;
2335     return ret;
2336
2337 fail:
2338     if (in)
2339         ffurl_close(in);
2340     ff_network_close();
2341     return ret;
2342 }
2343
2344 static const AVClass rtp_demuxer_class = {
2345     .class_name     = "RTP demuxer",
2346     .item_name      = av_default_item_name,
2347     .option         = rtp_options,
2348     .version        = LIBAVUTIL_VERSION_INT,
2349 };
2350
2351 AVInputFormat ff_rtp_demuxer = {
2352     .name           = "rtp",
2353     .long_name      = NULL_IF_CONFIG_SMALL("RTP input"),
2354     .priv_data_size = sizeof(RTSPState),
2355     .read_probe     = rtp_probe,
2356     .read_header    = rtp_read_header,
2357     .read_packet    = ff_rtsp_fetch_packet,
2358     .read_close     = sdp_read_close,
2359     .flags          = AVFMT_NOFILE,
2360     .priv_class     = &rtp_demuxer_class,
2361 };
2362 #endif /* CONFIG_RTP_DEMUXER */