~ppsspp/ppsspp/ffmpeg-upstream

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