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