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