rtpdec.c
Go to the documentation of this file.
1 /*
2  * RTP input format
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/mathematics.h"
23 #include "libavutil/avstring.h"
24 #include "libavutil/time.h"
25 #include "libavcodec/get_bits.h"
26 #include "avformat.h"
27 #include "network.h"
28 #include "srtp.h"
29 #include "url.h"
30 #include "rtpdec.h"
31 #include "rtpdec_formats.h"
32 
33 #define MIN_FEEDBACK_INTERVAL 200000 /* 200 ms in us */
34 
36  .enc_name = "X-MP3-draft-00",
37  .codec_type = AVMEDIA_TYPE_AUDIO,
38  .codec_id = AV_CODEC_ID_MP3ADU,
39 };
40 
42  .enc_name = "speex",
43  .codec_type = AVMEDIA_TYPE_AUDIO,
44  .codec_id = AV_CODEC_ID_SPEEX,
45 };
46 
48  .enc_name = "opus",
49  .codec_type = AVMEDIA_TYPE_AUDIO,
50  .codec_id = AV_CODEC_ID_OPUS,
51 };
52 
54 
56 {
58  rtp_first_dynamic_payload_handler = handler;
59 }
60 
62 {
93  ff_register_dynamic_payload_handler(&opus_dynamic_handler);
94  ff_register_dynamic_payload_handler(&realmedia_mp3_dynamic_handler);
95  ff_register_dynamic_payload_handler(&speex_dynamic_handler);
96 }
97 
100 {
101  RTPDynamicProtocolHandler *handler;
102  for (handler = rtp_first_dynamic_payload_handler;
103  handler; handler = handler->next)
104  if (!av_strcasecmp(name, handler->enc_name) &&
105  codec_type == handler->codec_type)
106  return handler;
107  return NULL;
108 }
109 
111  enum AVMediaType codec_type)
112 {
113  RTPDynamicProtocolHandler *handler;
114  for (handler = rtp_first_dynamic_payload_handler;
115  handler; handler = handler->next)
116  if (handler->static_payload_id && handler->static_payload_id == id &&
117  codec_type == handler->codec_type)
118  return handler;
119  return NULL;
120 }
121 
122 static int rtcp_parse_packet(RTPDemuxContext *s, const unsigned char *buf,
123  int len)
124 {
125  int payload_len;
126  while (len >= 4) {
127  payload_len = FFMIN(len, (AV_RB16(buf + 2) + 1) * 4);
128 
129  switch (buf[1]) {
130  case RTCP_SR:
131  if (payload_len < 20) {
133  "Invalid length for RTCP SR packet\n");
134  return AVERROR_INVALIDDATA;
135  }
136 
138  s->last_rtcp_ntp_time = AV_RB64(buf + 8);
139  s->last_rtcp_timestamp = AV_RB32(buf + 16);
142  if (!s->base_timestamp)
145  }
146 
147  break;
148  case RTCP_BYE:
149  return -RTCP_BYE;
150  }
151 
152  buf += payload_len;
153  len -= payload_len;
154  }
155  return -1;
156 }
157 
158 #define RTP_SEQ_MOD (1 << 16)
159 
160 static void rtp_init_statistics(RTPStatistics *s, uint16_t base_sequence)
161 {
162  memset(s, 0, sizeof(RTPStatistics));
163  s->max_seq = base_sequence;
164  s->probation = 1;
165 }
166 
167 /*
168  * Called whenever there is a large jump in sequence numbers,
169  * or when they get out of probation...
170  */
171 static void rtp_init_sequence(RTPStatistics *s, uint16_t seq)
172 {
173  s->max_seq = seq;
174  s->cycles = 0;
175  s->base_seq = seq - 1;
176  s->bad_seq = RTP_SEQ_MOD + 1;
177  s->received = 0;
178  s->expected_prior = 0;
179  s->received_prior = 0;
180  s->jitter = 0;
181  s->transit = 0;
182 }
183 
184 /* Returns 1 if we should handle this packet. */
185 static int rtp_valid_packet_in_sequence(RTPStatistics *s, uint16_t seq)
186 {
187  uint16_t udelta = seq - s->max_seq;
188  const int MAX_DROPOUT = 3000;
189  const int MAX_MISORDER = 100;
190  const int MIN_SEQUENTIAL = 2;
191 
192  /* source not valid until MIN_SEQUENTIAL packets with sequence
193  * seq. numbers have been received */
194  if (s->probation) {
195  if (seq == s->max_seq + 1) {
196  s->probation--;
197  s->max_seq = seq;
198  if (s->probation == 0) {
199  rtp_init_sequence(s, seq);
200  s->received++;
201  return 1;
202  }
203  } else {
204  s->probation = MIN_SEQUENTIAL - 1;
205  s->max_seq = seq;
206  }
207  } else if (udelta < MAX_DROPOUT) {
208  // in order, with permissible gap
209  if (seq < s->max_seq) {
210  // sequence number wrapped; count another 64k cycles
211  s->cycles += RTP_SEQ_MOD;
212  }
213  s->max_seq = seq;
214  } else if (udelta <= RTP_SEQ_MOD - MAX_MISORDER) {
215  // sequence made a large jump...
216  if (seq == s->bad_seq) {
217  /* two sequential packets -- assume that the other side
218  * restarted without telling us; just resync. */
219  rtp_init_sequence(s, seq);
220  } else {
221  s->bad_seq = (seq + 1) & (RTP_SEQ_MOD - 1);
222  return 0;
223  }
224  } else {
225  // duplicate or reordered packet...
226  }
227  s->received++;
228  return 1;
229 }
230 
231 static void rtcp_update_jitter(RTPStatistics *s, uint32_t sent_timestamp,
232  uint32_t arrival_timestamp)
233 {
234  // Most of this is pretty straight from RFC 3550 appendix A.8
235  uint32_t transit = arrival_timestamp - sent_timestamp;
236  uint32_t prev_transit = s->transit;
237  int32_t d = transit - prev_transit;
238  // Doing the FFABS() call directly on the "transit - prev_transit"
239  // expression doesn't work, since it's an unsigned expression. Doing the
240  // transit calculation in unsigned is desired though, since it most
241  // probably will need to wrap around.
242  d = FFABS(d);
243  s->transit = transit;
244  if (!prev_transit)
245  return;
246  s->jitter += d - (int32_t) ((s->jitter + 8) >> 4);
247 }
248 
250  AVIOContext *avio, int count)
251 {
252  AVIOContext *pb;
253  uint8_t *buf;
254  int len;
255  int rtcp_bytes;
256  RTPStatistics *stats = &s->statistics;
257  uint32_t lost;
258  uint32_t extended_max;
259  uint32_t expected_interval;
260  uint32_t received_interval;
261  int32_t lost_interval;
262  uint32_t expected;
263  uint32_t fraction;
264 
265  if ((!fd && !avio) || (count < 1))
266  return -1;
267 
268  /* TODO: I think this is way too often; RFC 1889 has algorithm for this */
269  /* XXX: MPEG pts hardcoded. RTCP send every 0.5 seconds */
270  s->octet_count += count;
271  rtcp_bytes = ((s->octet_count - s->last_octet_count) * RTCP_TX_RATIO_NUM) /
273  rtcp_bytes /= 50; // mmu_man: that's enough for me... VLC sends much less btw !?
274  if (rtcp_bytes < 28)
275  return -1;
277 
278  if (!fd)
279  pb = avio;
280  else if (avio_open_dyn_buf(&pb) < 0)
281  return -1;
282 
283  // Receiver Report
284  avio_w8(pb, (RTP_VERSION << 6) + 1); /* 1 report block */
285  avio_w8(pb, RTCP_RR);
286  avio_wb16(pb, 7); /* length in words - 1 */
287  // our own SSRC: we use the server's SSRC + 1 to avoid conflicts
288  avio_wb32(pb, s->ssrc + 1);
289  avio_wb32(pb, s->ssrc); // server SSRC
290  // some placeholders we should really fill...
291  // RFC 1889/p64
292  extended_max = stats->cycles + stats->max_seq;
293  expected = extended_max - stats->base_seq;
294  lost = expected - stats->received;
295  lost = FFMIN(lost, 0xffffff); // clamp it since it's only 24 bits...
296  expected_interval = expected - stats->expected_prior;
297  stats->expected_prior = expected;
298  received_interval = stats->received - stats->received_prior;
299  stats->received_prior = stats->received;
300  lost_interval = expected_interval - received_interval;
301  if (expected_interval == 0 || lost_interval <= 0)
302  fraction = 0;
303  else
304  fraction = (lost_interval << 8) / expected_interval;
305 
306  fraction = (fraction << 24) | lost;
307 
308  avio_wb32(pb, fraction); /* 8 bits of fraction, 24 bits of total packets lost */
309  avio_wb32(pb, extended_max); /* max sequence received */
310  avio_wb32(pb, stats->jitter >> 4); /* jitter */
311 
313  avio_wb32(pb, 0); /* last SR timestamp */
314  avio_wb32(pb, 0); /* delay since last SR */
315  } else {
316  uint32_t middle_32_bits = s->last_rtcp_ntp_time >> 16; // this is valid, right? do we need to handle 64 bit values special?
317  uint32_t delay_since_last = av_rescale(av_gettime() - s->last_rtcp_reception_time,
318  65536, AV_TIME_BASE);
319 
320  avio_wb32(pb, middle_32_bits); /* last SR timestamp */
321  avio_wb32(pb, delay_since_last); /* delay since last SR */
322  }
323 
324  // CNAME
325  avio_w8(pb, (RTP_VERSION << 6) + 1); /* 1 report block */
326  avio_w8(pb, RTCP_SDES);
327  len = strlen(s->hostname);
328  avio_wb16(pb, (7 + len + 3) / 4); /* length in words - 1 */
329  avio_wb32(pb, s->ssrc + 1);
330  avio_w8(pb, 0x01);
331  avio_w8(pb, len);
332  avio_write(pb, s->hostname, len);
333  avio_w8(pb, 0); /* END */
334  // padding
335  for (len = (7 + len) % 4; len % 4; len++)
336  avio_w8(pb, 0);
337 
338  avio_flush(pb);
339  if (!fd)
340  return 0;
341  len = avio_close_dyn_buf(pb, &buf);
342  if ((len > 0) && buf) {
343  int av_unused result;
344  av_dlog(s->ic, "sending %d bytes of RR\n", len);
345  result = ffurl_write(fd, buf, len);
346  av_dlog(s->ic, "result from ffurl_write: %d\n", result);
347  av_free(buf);
348  }
349  return 0;
350 }
351 
353 {
354  AVIOContext *pb;
355  uint8_t *buf;
356  int len;
357 
358  /* Send a small RTP packet */
359  if (avio_open_dyn_buf(&pb) < 0)
360  return;
361 
362  avio_w8(pb, (RTP_VERSION << 6));
363  avio_w8(pb, 0); /* Payload type */
364  avio_wb16(pb, 0); /* Seq */
365  avio_wb32(pb, 0); /* Timestamp */
366  avio_wb32(pb, 0); /* SSRC */
367 
368  avio_flush(pb);
369  len = avio_close_dyn_buf(pb, &buf);
370  if ((len > 0) && buf)
371  ffurl_write(rtp_handle, buf, len);
372  av_free(buf);
373 
374  /* Send a minimal RTCP RR */
375  if (avio_open_dyn_buf(&pb) < 0)
376  return;
377 
378  avio_w8(pb, (RTP_VERSION << 6));
379  avio_w8(pb, RTCP_RR); /* receiver report */
380  avio_wb16(pb, 1); /* length in words - 1 */
381  avio_wb32(pb, 0); /* our own SSRC */
382 
383  avio_flush(pb);
384  len = avio_close_dyn_buf(pb, &buf);
385  if ((len > 0) && buf)
386  ffurl_write(rtp_handle, buf, len);
387  av_free(buf);
388 }
389 
390 static int find_missing_packets(RTPDemuxContext *s, uint16_t *first_missing,
391  uint16_t *missing_mask)
392 {
393  int i;
394  uint16_t next_seq = s->seq + 1;
395  RTPPacket *pkt = s->queue;
396 
397  if (!pkt || pkt->seq == next_seq)
398  return 0;
399 
400  *missing_mask = 0;
401  for (i = 1; i <= 16; i++) {
402  uint16_t missing_seq = next_seq + i;
403  while (pkt) {
404  int16_t diff = pkt->seq - missing_seq;
405  if (diff >= 0)
406  break;
407  pkt = pkt->next;
408  }
409  if (!pkt)
410  break;
411  if (pkt->seq == missing_seq)
412  continue;
413  *missing_mask |= 1 << (i - 1);
414  }
415 
416  *first_missing = next_seq;
417  return 1;
418 }
419 
421  AVIOContext *avio)
422 {
423  int len, need_keyframe, missing_packets;
424  AVIOContext *pb;
425  uint8_t *buf;
426  int64_t now;
427  uint16_t first_missing = 0, missing_mask = 0;
428 
429  if (!fd && !avio)
430  return -1;
431 
432  need_keyframe = s->handler && s->handler->need_keyframe &&
434  missing_packets = find_missing_packets(s, &first_missing, &missing_mask);
435 
436  if (!need_keyframe && !missing_packets)
437  return 0;
438 
439  /* Send new feedback if enough time has elapsed since the last
440  * feedback packet. */
441 
442  now = av_gettime();
443  if (s->last_feedback_time &&
445  return 0;
446  s->last_feedback_time = now;
447 
448  if (!fd)
449  pb = avio;
450  else if (avio_open_dyn_buf(&pb) < 0)
451  return -1;
452 
453  if (need_keyframe) {
454  avio_w8(pb, (RTP_VERSION << 6) | 1); /* PLI */
455  avio_w8(pb, RTCP_PSFB);
456  avio_wb16(pb, 2); /* length in words - 1 */
457  // our own SSRC: we use the server's SSRC + 1 to avoid conflicts
458  avio_wb32(pb, s->ssrc + 1);
459  avio_wb32(pb, s->ssrc); // server SSRC
460  }
461 
462  if (missing_packets) {
463  avio_w8(pb, (RTP_VERSION << 6) | 1); /* NACK */
464  avio_w8(pb, RTCP_RTPFB);
465  avio_wb16(pb, 3); /* length in words - 1 */
466  avio_wb32(pb, s->ssrc + 1);
467  avio_wb32(pb, s->ssrc); // server SSRC
468 
469  avio_wb16(pb, first_missing);
470  avio_wb16(pb, missing_mask);
471  }
472 
473  avio_flush(pb);
474  if (!fd)
475  return 0;
476  len = avio_close_dyn_buf(pb, &buf);
477  if (len > 0 && buf) {
478  ffurl_write(fd, buf, len);
479  av_free(buf);
480  }
481  return 0;
482 }
483 
484 /**
485  * open a new RTP parse context for stream 'st'. 'st' can be NULL for
486  * MPEG2-TS streams.
487  */
489  int payload_type, int queue_size)
490 {
492 
493  s = av_mallocz(sizeof(RTPDemuxContext));
494  if (!s)
495  return NULL;
496  s->payload_type = payload_type;
499  s->ic = s1;
500  s->st = st;
501  s->queue_size = queue_size;
503  if (st) {
504  switch (st->codec->codec_id) {
506  /* According to RFC 3551, the stream clock rate is 8000
507  * even if the sample rate is 16000. */
508  if (st->codec->sample_rate == 8000)
509  st->codec->sample_rate = 16000;
510  break;
511  default:
512  break;
513  }
514  }
515  // needed to send back RTCP RR in RTSP sessions
516  gethostname(s->hostname, sizeof(s->hostname));
517  return s;
518 }
519 
521  RTPDynamicProtocolHandler *handler)
522 {
523  s->dynamic_protocol_context = ctx;
524  s->handler = handler;
525 }
526 
528  const char *params)
529 {
530  if (!ff_srtp_set_crypto(&s->srtp, suite, params))
531  s->srtp_enabled = 1;
532 }
533 
534 /**
535  * This was the second switch in rtp_parse packet.
536  * Normalizes time, if required, sets stream_index, etc.
537  */
538 static void finalize_packet(RTPDemuxContext *s, AVPacket *pkt, uint32_t timestamp)
539 {
540  if (pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE)
541  return; /* Timestamp already set by depacketizer */
542  if (timestamp == RTP_NOTS_VALUE)
543  return;
544 
545  if (s->last_rtcp_ntp_time != AV_NOPTS_VALUE && s->ic->nb_streams > 1) {
546  int64_t addend;
547  int delta_timestamp;
548 
549  /* compute pts from timestamp with received ntp_time */
550  delta_timestamp = timestamp - s->last_rtcp_timestamp;
551  /* convert to the PTS timebase */
553  s->st->time_base.den,
554  (uint64_t) s->st->time_base.num << 32);
555  pkt->pts = s->range_start_offset + s->rtcp_ts_offset + addend +
556  delta_timestamp;
557  return;
558  }
559 
560  if (!s->base_timestamp)
561  s->base_timestamp = timestamp;
562  /* assume that the difference is INT32_MIN < x < INT32_MAX,
563  * but allow the first timestamp to exceed INT32_MAX */
564  if (!s->timestamp)
565  s->unwrapped_timestamp += timestamp;
566  else
567  s->unwrapped_timestamp += (int32_t)(timestamp - s->timestamp);
568  s->timestamp = timestamp;
570  s->base_timestamp;
571 }
572 
574  const uint8_t *buf, int len)
575 {
576  unsigned int ssrc;
577  int payload_type, seq, flags = 0;
578  int ext, csrc;
579  AVStream *st;
580  uint32_t timestamp;
581  int rv = 0;
582 
583  csrc = buf[0] & 0x0f;
584  ext = buf[0] & 0x10;
585  payload_type = buf[1] & 0x7f;
586  if (buf[1] & 0x80)
587  flags |= RTP_FLAG_MARKER;
588  seq = AV_RB16(buf + 2);
589  timestamp = AV_RB32(buf + 4);
590  ssrc = AV_RB32(buf + 8);
591  /* store the ssrc in the RTPDemuxContext */
592  s->ssrc = ssrc;
593 
594  /* NOTE: we can handle only one payload type */
595  if (s->payload_type != payload_type)
596  return -1;
597 
598  st = s->st;
599  // only do something with this if all the rtp checks pass...
600  if (!rtp_valid_packet_in_sequence(&s->statistics, seq)) {
601  av_log(st ? st->codec : NULL, AV_LOG_ERROR,
602  "RTP: PT=%02x: bad cseq %04x expected=%04x\n",
603  payload_type, seq, ((s->seq + 1) & 0xffff));
604  return -1;
605  }
606 
607  if (buf[0] & 0x20) {
608  int padding = buf[len - 1];
609  if (len >= 12 + padding)
610  len -= padding;
611  }
612 
613  s->seq = seq;
614  len -= 12;
615  buf += 12;
616 
617  len -= 4 * csrc;
618  buf += 4 * csrc;
619  if (len < 0)
620  return AVERROR_INVALIDDATA;
621 
622  /* RFC 3550 Section 5.3.1 RTP Header Extension handling */
623  if (ext) {
624  if (len < 4)
625  return -1;
626  /* calculate the header extension length (stored as number
627  * of 32-bit words) */
628  ext = (AV_RB16(buf + 2) + 1) << 2;
629 
630  if (len < ext)
631  return -1;
632  // skip past RTP header extension
633  len -= ext;
634  buf += ext;
635  }
636 
637  if (s->handler && s->handler->parse_packet) {
639  s->st, pkt, &timestamp, buf, len, seq,
640  flags);
641  } else if (st) {
642  if ((rv = av_new_packet(pkt, len)) < 0)
643  return rv;
644  memcpy(pkt->data, buf, len);
645  pkt->stream_index = st->index;
646  } else {
647  return AVERROR(EINVAL);
648  }
649 
650  // now perform timestamp things....
651  finalize_packet(s, pkt, timestamp);
652 
653  return rv;
654 }
655 
657 {
658  while (s->queue) {
659  RTPPacket *next = s->queue->next;
660  av_free(s->queue->buf);
661  av_free(s->queue);
662  s->queue = next;
663  }
664  s->seq = 0;
665  s->queue_len = 0;
666  s->prev_ret = 0;
667 }
668 
670 {
671  uint16_t seq = AV_RB16(buf + 2);
672  RTPPacket **cur = &s->queue, *packet;
673 
674  /* Find the correct place in the queue to insert the packet */
675  while (*cur) {
676  int16_t diff = seq - (*cur)->seq;
677  if (diff < 0)
678  break;
679  cur = &(*cur)->next;
680  }
681 
682  packet = av_mallocz(sizeof(*packet));
683  if (!packet)
684  return;
685  packet->recvtime = av_gettime();
686  packet->seq = seq;
687  packet->len = len;
688  packet->buf = buf;
689  packet->next = *cur;
690  *cur = packet;
691  s->queue_len++;
692 }
693 
695 {
696  return s->queue && s->queue->seq == (uint16_t) (s->seq + 1);
697 }
698 
700 {
701  return s->queue ? s->queue->recvtime : 0;
702 }
703 
705 {
706  int rv;
707  RTPPacket *next;
708 
709  if (s->queue_len <= 0)
710  return -1;
711 
712  if (!has_next_packet(s))
713  av_log(s->st ? s->st->codec : NULL, AV_LOG_WARNING,
714  "RTP: missed %d packets\n", s->queue->seq - s->seq - 1);
715 
716  /* Parse the first packet in the queue, and dequeue it */
717  rv = rtp_parse_packet_internal(s, pkt, s->queue->buf, s->queue->len);
718  next = s->queue->next;
719  av_free(s->queue->buf);
720  av_free(s->queue);
721  s->queue = next;
722  s->queue_len--;
723  return rv;
724 }
725 
727  uint8_t **bufptr, int len)
728 {
729  uint8_t *buf = bufptr ? *bufptr : NULL;
730  int flags = 0;
731  uint32_t timestamp;
732  int rv = 0;
733 
734  if (!buf) {
735  /* If parsing of the previous packet actually returned 0 or an error,
736  * there's nothing more to be parsed from that packet, but we may have
737  * indicated that we can return the next enqueued packet. */
738  if (s->prev_ret <= 0)
739  return rtp_parse_queued_packet(s, pkt);
740  /* return the next packets, if any */
741  if (s->handler && s->handler->parse_packet) {
742  /* timestamp should be overwritten by parse_packet, if not,
743  * the packet is left with pts == AV_NOPTS_VALUE */
744  timestamp = RTP_NOTS_VALUE;
746  s->st, pkt, &timestamp, NULL, 0, 0,
747  flags);
748  finalize_packet(s, pkt, timestamp);
749  return rv;
750  }
751  }
752 
753  if (len < 12)
754  return -1;
755 
756  if ((buf[0] & 0xc0) != (RTP_VERSION << 6))
757  return -1;
758  if (RTP_PT_IS_RTCP(buf[1])) {
759  return rtcp_parse_packet(s, buf, len);
760  }
761 
762  if (s->st) {
763  int64_t received = av_gettime();
764  uint32_t arrival_ts = av_rescale_q(received, AV_TIME_BASE_Q,
765  s->st->time_base);
766  timestamp = AV_RB32(buf + 4);
767  // Calculate the jitter immediately, before queueing the packet
768  // into the reordering queue.
769  rtcp_update_jitter(&s->statistics, timestamp, arrival_ts);
770  }
771 
772  if ((s->seq == 0 && !s->queue) || s->queue_size <= 1) {
773  /* First packet, or no reordering */
774  return rtp_parse_packet_internal(s, pkt, buf, len);
775  } else {
776  uint16_t seq = AV_RB16(buf + 2);
777  int16_t diff = seq - s->seq;
778  if (diff < 0) {
779  /* Packet older than the previously emitted one, drop */
780  av_log(s->st ? s->st->codec : NULL, AV_LOG_WARNING,
781  "RTP: dropping old packet received too late\n");
782  return -1;
783  } else if (diff <= 1) {
784  /* Correct packet */
785  rv = rtp_parse_packet_internal(s, pkt, buf, len);
786  return rv;
787  } else {
788  /* Still missing some packet, enqueue this one. */
789  enqueue_packet(s, buf, len);
790  *bufptr = NULL;
791  /* Return the first enqueued packet if the queue is full,
792  * even if we're missing something */
793  if (s->queue_len >= s->queue_size)
794  return rtp_parse_queued_packet(s, pkt);
795  return -1;
796  }
797  }
798 }
799 
800 /**
801  * Parse an RTP or RTCP packet directly sent as a buffer.
802  * @param s RTP parse context.
803  * @param pkt returned packet
804  * @param bufptr pointer to the input buffer or NULL to read the next packets
805  * @param len buffer len
806  * @return 0 if a packet is returned, 1 if a packet is returned and more can follow
807  * (use buf as NULL to read the next). -1 if no packet (error or no more packet).
808  */
810  uint8_t **bufptr, int len)
811 {
812  int rv;
813  if (s->srtp_enabled && bufptr && ff_srtp_decrypt(&s->srtp, *bufptr, &len) < 0)
814  return -1;
815  rv = rtp_parse_one_packet(s, pkt, bufptr, len);
816  s->prev_ret = rv;
817  while (rv == AVERROR(EAGAIN) && has_next_packet(s))
818  rv = rtp_parse_queued_packet(s, pkt);
819  return rv ? rv : has_next_packet(s);
820 }
821 
823 {
825  ff_srtp_free(&s->srtp);
826  av_free(s);
827 }
828 
829 int ff_parse_fmtp(AVStream *stream, PayloadContext *data, const char *p,
830  int (*parse_fmtp)(AVStream *stream,
831  PayloadContext *data,
832  char *attr, char *value))
833 {
834  char attr[256];
835  char *value;
836  int res;
837  int value_size = strlen(p) + 1;
838 
839  if (!(value = av_malloc(value_size))) {
840  av_log(NULL, AV_LOG_ERROR, "Failed to allocate data for FMTP.\n");
841  return AVERROR(ENOMEM);
842  }
843 
844  // remove protocol identifier
845  while (*p && *p == ' ')
846  p++; // strip spaces
847  while (*p && *p != ' ')
848  p++; // eat protocol identifier
849  while (*p && *p == ' ')
850  p++; // strip trailing spaces
851 
852  while (ff_rtsp_next_attr_and_value(&p,
853  attr, sizeof(attr),
854  value, value_size)) {
855  res = parse_fmtp(stream, data, attr, value);
856  if (res < 0 && res != AVERROR_PATCHWELCOME) {
857  av_free(value);
858  return res;
859  }
860  }
861  av_free(value);
862  return 0;
863 }
864 
865 int ff_rtp_finalize_packet(AVPacket *pkt, AVIOContext **dyn_buf, int stream_idx)
866 {
867  int ret;
868  av_init_packet(pkt);
869 
870  pkt->size = avio_close_dyn_buf(*dyn_buf, &pkt->data);
871  pkt->stream_index = stream_idx;
872  *dyn_buf = NULL;
873  if ((ret = av_packet_from_data(pkt, pkt->data, pkt->size)) < 0) {
874  av_freep(&pkt->data);
875  return ret;
876  }
877  return pkt->size;
878 }
const char * name
Definition: avisynth_c.h:675
int queue_size
The size of queue, or 0 if reordering is disabled.
Definition: rtpdec.h:176
void * av_mallocz(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
Definition: mem.c:205
void ff_rtp_parse_set_crypto(RTPDemuxContext *s, const char *suite, const char *params)
Definition: rtpdec.c:527
const char * s
Definition: avisynth_c.h:668
Bytestream IO Context.
Definition: avio.h:68
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
AVFormatContext * ic
Definition: rtpdec.h:152
uint16_t seq
Definition: rtpdec.h:156
RTPDynamicProtocolHandler ff_quicktime_rtp_aud_handler
void ff_rtp_send_punch_packets(URLContext *rtp_handle)
Send a dummy packet on both port pairs to set up the connection state in potential NAT routers...
Definition: rtpdec.c:352
int avio_close_dyn_buf(AVIOContext *s, uint8_t **pbuffer)
Return the written size and a pointer to the buffer.
Definition: aviobuf.c:988
#define AV_RB64
static void rtcp_update_jitter(RTPStatistics *s, uint32_t sent_timestamp, uint32_t arrival_timestamp)
Definition: rtpdec.c:231
int ffurl_write(URLContext *h, const unsigned char *buf, int size)
Write size bytes from buf to the resource accessed by h.
Definition: avio.c:317
int payload_type
Definition: rtpdec.h:154
int64_t range_start_offset
Definition: rtpdec.h:161
int prev_ret
Fields for packet reordering.
Definition: rtpdec.h:173
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:154
RTP/JPEG specific private data.
Definition: rdt.c:83
int64_t last_feedback_time
Definition: rtpdec.h:190
unsigned int last_octet_count
Definition: rtpdec.h:189
static int rtp_parse_packet_internal(RTPDemuxContext *s, AVPacket *pkt, const uint8_t *buf, int len)
Definition: rtpdec.c:573
RTPPacket * queue
A sorted queue of buffered packets not yet returned.
Definition: rtpdec.h:174
#define RTP_VERSION
Definition: rtp.h:77
RTPDynamicProtocolHandler ff_mp4a_latm_dynamic_handler
Definition: rtpdec_latm.c:181
int num
numerator
Definition: rational.h:44
int index
stream index in AVFormatContext
Definition: avformat.h:644
void av_register_rtp_dynamic_payload_handlers(void)
Definition: rtpdec.c:61
RTPDynamicProtocolHandler ff_ms_rtp_asf_pfa_handler
#define RTCP_TX_RATIO_NUM
Definition: rtp.h:81
const RTPDynamicProtocolHandler * handler
Definition: rtpdec.h:193
enum AVMediaType codec_type
Definition: rtp.c:36
static int rtcp_parse_packet(RTPDemuxContext *s, const unsigned char *buf, int len)
Definition: rtpdec.c:122
RTPDynamicProtocolHandler ff_jpeg_dynamic_handler
Definition: rtpdec_jpeg.c:384
av_dlog(ac->avr,"%d samples - audio_convert: %s to %s (%s)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt), use_generic?ac->func_descr_generic:ac->func_descr)
RTPDynamicProtocolHandler ff_h263_1998_dynamic_handler
Definition: rtpdec_h263.c:99
RTPDynamicProtocolHandler ff_amr_wb_dynamic_handler
Definition: rtpdec_amr.c:201
uint32_t cycles
shifted count of sequence number cycles
Definition: rtpdec.h:85
#define RTCP_TX_RATIO_DEN
Definition: rtp.h:82
static RTPDynamicProtocolHandler speex_dynamic_handler
Definition: rtpdec.c:41
RTPDynamicProtocolHandler ff_h263_2000_dynamic_handler
Definition: rtpdec_h263.c:107
int avio_open_dyn_buf(AVIOContext **s)
Open a write only memory stream.
Definition: aviobuf.c:976
static int find_missing_packets(RTPDemuxContext *s, uint16_t *first_missing, uint16_t *missing_mask)
Definition: rtpdec.c:390
enum AVMediaType codec_type
Definition: rtpdec.h:121
RTPDemuxContext * ff_rtp_parse_open(AVFormatContext *s1, AVStream *st, int payload_type, int queue_size)
open a new RTP parse context for stream &#39;st&#39;.
Definition: rtpdec.c:488
void av_freep(void *arg)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc() and set the pointer ...
Definition: mem.c:198
PayloadContext * dynamic_protocol_context
Definition: rtpdec.h:194
set threshold d
Format I/O context.
Definition: avformat.h:944
uint32_t base_seq
base sequence number
Definition: rtpdec.h:86
void ff_srtp_free(struct SRTPContext *s)
Definition: srtp.c:31
uint8_t
int(* need_keyframe)(PayloadContext *context)
Definition: rtpdec.h:138
#define AV_RB32
static AVPacket pkt
Definition: demuxing.c:56
void ff_rtp_reset_packet_queue(RTPDemuxContext *s)
Definition: rtpdec.c:656
RTPDynamicProtocolHandler ff_ilbc_dynamic_handler
Definition: rtpdec_ilbc.c:68
int len
Definition: rtpdec.h:146
int av_packet_from_data(AVPacket *pkt, uint8_t *data, int size)
Initialize a reference-counted packet from av_malloc()ed data.
Definition: avpacket.c:136
int ff_rtsp_next_attr_and_value(const char **p, char *attr, int attr_size, char *value, int value_size)
RTPDynamicProtocolHandler ff_theora_dynamic_handler
Definition: rtpdec_xiph.c:390
uint8_t * data
Definition: rtp.h:98
static int rtp_parse_queued_packet(RTPDemuxContext *s, AVPacket *pkt)
Definition: rtpdec.c:704
bitstream reader API header.
char hostname[256]
Definition: rtpdec.h:164
void avio_write(AVIOContext *s, const unsigned char *buf, int size)
Definition: aviobuf.c:173
uint32_t expected_prior
packets expected in last interval
Definition: rtpdec.h:90
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
Definition: mathematics.c:130
int srtp_enabled
Definition: rtpdec.h:166
int av_new_packet(AVPacket *pkt, int size)
Allocate the payload of a packet and initialize its fields with default values.
Definition: avpacket.c:73
void av_free(void *ptr)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc(). ...
Definition: mem.c:183
uint16_t seq
Definition: rtpdec.h:144
#define RTP_FLAG_MARKER
RTP marker bit was set for this packet.
Definition: rtpdec.h:97
#define AV_RB16
Definition: rtp.h:102
int probation
sequence packets till source is valid
Definition: rtpdec.h:88
static void rtp_init_sequence(RTPStatistics *s, uint16_t seq)
Definition: rtpdec.c:171
Spectrum Plot time data
FFmpeg currently uses a custom build this text attempts to document some of its obscure features and options Makefile the full command issued by make and its output will be shown on the screen DESTDIR Destination directory for the install useful to prepare packages or install FFmpeg in cross environments Makefile builds all the libraries and the executables fate Run the fate test suite
Definition: build_system.txt:1
#define RTP_SEQ_MOD
Definition: rtpdec.c:158
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:246
RTPDynamicProtocolHandler ff_vorbis_dynamic_handler
Definition: rtpdec_xiph.c:400
RTPDynamicProtocolHandler ff_ms_rtp_asf_pfv_handler
RTPDynamicProtocolHandler ff_svq3_dynamic_handler
Definition: rtpdec_svq3.c:127
DynamicPayloadPacketHandlerProc parse_packet
Parse handler for this dynamic packet.
Definition: rtpdec.h:137
int64_t rtcp_ts_offset
Definition: rtpdec.h:184
RTPDynamicProtocolHandler * ff_rtp_handler_find_by_id(int id, enum AVMediaType codec_type)
Definition: rtpdec.c:110
uint32_t timestamp
Definition: rtpdec.h:157
AVCodecContext * codec
Codec context associated with this stream.
Definition: avformat.h:662
uint32_t transit
relative transit time for previous packet
Definition: rtpdec.h:92
uint32_t jitter
estimated jitter.
Definition: rtpdec.h:93
int queue_len
The number of packets in queue.
Definition: rtpdec.h:175
RTPDynamicProtocolHandler ff_qt_rtp_vid_handler
unsigned int nb_streams
A list of all streams in the file.
Definition: avformat.h:991
int void avio_flush(AVIOContext *s)
Force flushing of buffered data to the output s.
Definition: aviobuf.c:193
int ff_srtp_decrypt(struct SRTPContext *s, uint8_t *buf, int *lenptr)
Definition: srtp.c:126
int64_t av_rescale(int64_t a, int64_t b, int64_t c)
Rescale a 64-bit integer with rounding to nearest.
Definition: mathematics.c:118
int64_t first_rtcp_ntp_time
Definition: rtpdec.h:182
#define AV_TIME_BASE
Internal time base represented as integer.
Definition: avutil.h:196
#define FFMIN(a, b)
Definition: common.h:58
int av_strcasecmp(const char *a, const char *b)
Locale-independent case-insensitive compare.
Definition: avstring.c:212
static RTPDynamicProtocolHandler * rtp_first_dynamic_payload_handler
Definition: rtpdec.c:53
Definition: rtp.h:97
ret
Definition: avfilter.c:821
int64_t last_rtcp_ntp_time
Definition: rtpdec.h:180
RTPDynamicProtocolHandler ff_h263_rfc2190_dynamic_handler
int32_t
#define FFABS(a)
Definition: common.h:53
#define diff(a, as, b, bs)
Definition: vf_phase.c:80
void ff_rtp_parse_set_dynamic_protocol(RTPDemuxContext *s, PayloadContext *ctx, RTPDynamicProtocolHandler *handler)
Definition: rtpdec.c:520
int64_t av_gettime(void)
Get the current time in microseconds.
Definition: time.c:39
int ff_rtp_send_rtcp_feedback(RTPDemuxContext *s, URLContext *fd, AVIOContext *avio)
Definition: rtpdec.c:420
Stream structure.
Definition: avformat.h:643
uint32_t received
packets received
Definition: rtpdec.h:89
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition: error.h:62
RTPDynamicProtocolHandler ff_g726_16_dynamic_handler
int64_t last_rtcp_reception_time
Definition: rtpdec.h:181
NULL
Definition: eval.c:55
enum AVCodecID codec_id
#define AV_TIME_BASE_Q
Internal time base represented as fractional value.
Definition: avutil.h:202
Definition: rtp.h:99
int sample_rate
samples per second
static int rtp_parse_one_packet(RTPDemuxContext *s, AVPacket *pkt, uint8_t **bufptr, int len)
Definition: rtpdec.c:726
int64_t unwrapped_timestamp
Definition: rtpdec.h:160
uint32_t last_rtcp_timestamp
Definition: rtpdec.h:183
static int parse_fmtp(AVStream *stream, PayloadContext *data, char *attr, char *value)
Definition: rtpdec_latm.c:148
static int has_next_packet(RTPDemuxContext *s)
Definition: rtpdec.c:694
void ff_register_dynamic_payload_handler(RTPDynamicProtocolHandler *handler)
Definition: rtpdec.c:55
void avio_w8(AVIOContext *s, int b)
Definition: aviobuf.c:151
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:148
RTPDynamicProtocolHandler ff_mp4v_es_dynamic_handler
Definition: rtpdec_mpeg4.c:263
unsigned int octet_count
Definition: rtpdec.h:188
void * buf
Definition: avisynth_c.h:594
Definition: url.h:41
double value
Definition: eval.c:82
void * av_malloc(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
Definition: mem.c:73
RTPStatistics statistics
Statistics for this stream (used by RTCP receiver reports)
Definition: rtpdec.h:170
synthesis window for stochastic i
uint32_t received_prior
packets received in last interval
Definition: rtpdec.h:91
RTPDynamicProtocolHandler ff_qdm2_dynamic_handler
Definition: rtpdec_qdm2.c:312
uint32_t bad_seq
last bad sequence number + 1
Definition: rtpdec.h:87
AVMediaType
Definition: avutil.h:141
int64_t ff_rtp_queued_packet_time(RTPDemuxContext *s)
Definition: rtpdec.c:699
int ff_rtp_check_and_send_back_rr(RTPDemuxContext *s, URLContext *fd, AVIOContext *avio, int count)
some rtp servers assume client is dead if they don&#39;t hear from them...
Definition: rtpdec.c:249
const char enc_name[50]
Definition: rtpdec.h:120
#define s1
Definition: regdef.h:38
static void finalize_packet(RTPDemuxContext *s, AVPacket *pkt, uint32_t timestamp)
This was the second switch in rtp_parse packet.
Definition: rtpdec.c:538
uint16_t max_seq
highest sequence number seen
Definition: rtpdec.h:84
RTPDynamicProtocolHandler ff_mpegts_dynamic_handler
Definition: rtpdec_mpegts.c:99
RTPDynamicProtocolHandler ff_g726_32_dynamic_handler
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later.That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another.Buffer references ownership and permissions
RTPDynamicProtocolHandler ff_qt_rtp_aud_handler
uint8_t * buf
Definition: rtpdec.h:145
#define RTP_PT_IS_RTCP(x)
Definition: rtp.h:109
void avio_wb16(AVIOContext *s, unsigned int val)
Definition: aviobuf.c:373
static int flags
Definition: cpu.c:23
RTPDynamicProtocolHandler ff_mpeg_audio_dynamic_handler
Definition: rtpdec_mpeg12.c:58
const char const char * params
Definition: avisynth_c.h:675
RTPDynamicProtocolHandler ff_mpeg_video_dynamic_handler
Definition: rtpdec_mpeg12.c:66
Main libavformat public API header.
struct RTPPacket * next
Definition: rtpdec.h:148
uint32_t ssrc
Definition: rtpdec.h:155
static RTPDynamicProtocolHandler realmedia_mp3_dynamic_handler
Definition: rtpdec.c:35
int64_t recvtime
Definition: rtpdec.h:147
RTPDynamicProtocolHandler * ff_rtp_handler_find_by_name(const char *name, enum AVMediaType codec_type)
Definition: rtpdec.c:98
RTPDynamicProtocolHandler ff_g726_40_dynamic_handler
RTPDynamicProtocolHandler ff_qcelp_dynamic_handler
Definition: rtpdec_qcelp.c:222
void av_init_packet(AVPacket *pkt)
Initialize optional fields of a packet with default values.
Definition: avpacket.c:56
int den
denominator
Definition: rational.h:45
Definition: rtp.h:96
int ff_rtp_finalize_packet(AVPacket *pkt, AVIOContext **dyn_buf, int stream_idx)
Close the dynamic buffer and make a packet from it.
Definition: rtpdec.c:865
uint32_t base_timestamp
Definition: rtpdec.h:158
RTPDynamicProtocolHandler ff_g726_24_dynamic_handler
RTPDynamicProtocolHandler ff_h264_dynamic_handler
Definition: rtpdec_h264.c:390
int len
int ff_srtp_set_crypto(struct SRTPContext *s, const char *suite, const char *params)
Definition: srtp.c:65
void ff_rtp_parse_close(RTPDemuxContext *s)
Definition: rtpdec.c:822
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed...
void avio_wb32(AVIOContext *s, unsigned int val)
Definition: aviobuf.c:299
#define RTP_NOTS_VALUE
Definition: rtpdec.h:40
void INT64 INT64 count
Definition: avisynth_c.h:594
int ff_parse_fmtp(AVStream *stream, PayloadContext *data, const char *p, int(*parse_fmtp)(AVStream *stream, PayloadContext *data, char *attr, char *value))
Definition: rtpdec.c:829
unbuffered private I/O API
static void rtp_init_statistics(RTPStatistics *s, uint16_t base_sequence)
Definition: rtpdec.c:160
static RTPDynamicProtocolHandler opus_dynamic_handler
Definition: rtpdec.c:47
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented...
Definition: avformat.h:679
RTPDynamicProtocolHandler ff_quicktime_rtp_vid_handler
RTPDynamicProtocolHandler ff_mpeg4_generic_dynamic_handler
Definition: rtpdec_mpeg4.c:271
int ff_rtp_parse_packet(RTPDemuxContext *s, AVPacket *pkt, uint8_t **bufptr, int len)
Parse an RTP or RTCP packet directly sent as a buffer.
Definition: rtpdec.c:809
RTPDynamicProtocolHandler ff_amr_nb_dynamic_handler
Definition: rtpdec_amr.c:191
AVStream * st
Definition: rtpdec.h:153
This structure stores compressed data.
static int rtp_valid_packet_in_sequence(RTPStatistics *s, uint16_t seq)
Definition: rtpdec.c:185
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
RTPDynamicProtocolHandler ff_vp8_dynamic_handler
Definition: rtpdec_vp8.c:290
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:190
#define MIN_FEEDBACK_INTERVAL
Definition: rtpdec.c:33
#define av_unused
Definition: attributes.h:114
struct SRTPContext srtp
Definition: rtpdec.h:167
struct RTPDynamicProtocolHandler * next
Definition: rtpdec.h:140
static void enqueue_packet(RTPDemuxContext *s, uint8_t *buf, int len)
Definition: rtpdec.c:669