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