~ubuntu-branches/ubuntu/vivid/ffmpeg/vivid

« back to all changes in this revision

Viewing changes to libavformat/rtsp.c

  • Committer: Package Import Robot
  • Author(s): Andreas Cadhalpun
  • Date: 2014-11-05 01:18:23 UTC
  • mfrom: (0.2.17 sid)
  • Revision ID: package-import@ubuntu.com-20141105011823-xsbeceffs43wtkn7
Tags: 7:2.4.3-1
* Import new upstream bugfix release 2.4.3.
   - Refresh Change-symbol-versioning.patch.
   - Add new symbols to the libavdevice symbols file.
* Enable libbs2b on arm64, since it is now available.
* Disable frei0r and libx264 on x32, libsoxr and openal on sparc64
  and libopencv on m68k, sh4, sparc64 and x32, because they are not
  (yet) avialable there.
* Disable assembler optimizations on x32, as they wouldn't work there.
* Include config.log in the build-log, when compiling fails.
* Add fix-hppa-tests.patch to work around a gcc bug on hppa.

Show diffs side-by-side

added added

removed removed

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