FFmpeg
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
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/intreadwrite.h"
25 #include "libavutil/mem.h"
26 #include "libavutil/time.h"
27 
28 #include "libavcodec/bytestream.h"
29 
30 #include "avformat.h"
31 #include "network.h"
32 #include "srtp.h"
33 #include "url.h"
34 #include "rtpdec.h"
35 #include "rtpdec_formats.h"
36 #include "internal.h"
37 
38 #define MIN_FEEDBACK_INTERVAL 200000 /* 200 ms in us */
39 
41  .enc_name = "L24",
42  .codec_type = AVMEDIA_TYPE_AUDIO,
43  .codec_id = AV_CODEC_ID_PCM_S24BE,
44 };
45 
47  .enc_name = "GSM",
48  .codec_type = AVMEDIA_TYPE_AUDIO,
49  .codec_id = AV_CODEC_ID_GSM,
50 };
51 
53  .enc_name = "X-MP3-draft-00",
54  .codec_type = AVMEDIA_TYPE_AUDIO,
55  .codec_id = AV_CODEC_ID_MP3ADU,
56 };
57 
59  .enc_name = "speex",
60  .codec_type = AVMEDIA_TYPE_AUDIO,
61  .codec_id = AV_CODEC_ID_SPEEX,
62 };
63 
64 static const RTPDynamicProtocolHandler t140_dynamic_handler = { /* RFC 4103 */
65  .enc_name = "t140",
66  .codec_type = AVMEDIA_TYPE_SUBTITLE,
67  .codec_id = AV_CODEC_ID_TEXT,
68 };
69 
74 
76  /* rtp */
126  /* rdt */
131  NULL,
132 };
133 
134 /**
135  * Iterate over all registered rtp dynamic protocol handlers.
136  *
137  * @param opaque a pointer where libavformat will store the iteration state.
138  * Must point to NULL to start the iteration.
139  *
140  * @return the next registered rtp dynamic protocol handler
141  * or NULL when the iteration is finished
142  */
143 static const RTPDynamicProtocolHandler *rtp_handler_iterate(void **opaque)
144 {
145  uintptr_t i = (uintptr_t)*opaque;
147 
148  if (r)
149  *opaque = (void*)(i + 1);
150 
151  return r;
152 }
153 
155  enum AVMediaType codec_type)
156 {
157  void *i = 0;
159  while (handler = rtp_handler_iterate(&i)) {
160  if (handler->enc_name &&
161  !av_strcasecmp(name, handler->enc_name) &&
162  codec_type == handler->codec_type)
163  return handler;
164  }
165  return NULL;
166 }
167 
169  enum AVMediaType codec_type)
170 {
171  void *i = 0;
173  while (handler = rtp_handler_iterate(&i)) {
174  if (handler->static_payload_id && handler->static_payload_id == id &&
175  codec_type == handler->codec_type)
176  return handler;
177  }
178  return NULL;
179 }
180 
181 static int rtcp_parse_packet(RTPDemuxContext *s, const unsigned char *buf,
182  int len)
183 {
184  int payload_len;
185  while (len >= 4) {
186  payload_len = FFMIN(len, (AV_RB16(buf + 2) + 1) * 4);
187 
188  switch (buf[1]) {
189  case RTCP_SR:
190  if (payload_len < 20) {
191  av_log(s->ic, AV_LOG_ERROR, "Invalid RTCP SR packet length\n");
192  return AVERROR_INVALIDDATA;
193  }
194 
195  s->last_rtcp_reception_time = av_gettime_relative();
196  s->last_rtcp_ntp_time = AV_RB64(buf + 8);
197  s->last_rtcp_timestamp = AV_RB32(buf + 16);
198  if (s->first_rtcp_ntp_time == AV_NOPTS_VALUE) {
199  s->first_rtcp_ntp_time = s->last_rtcp_ntp_time;
200  if (!s->base_timestamp)
201  s->base_timestamp = s->last_rtcp_timestamp;
202  s->rtcp_ts_offset = (int32_t)(s->last_rtcp_timestamp - s->base_timestamp);
203  }
204 
205  break;
206  case RTCP_BYE:
207  return -RTCP_BYE;
208  }
209 
210  buf += payload_len;
211  len -= payload_len;
212  }
213  return -1;
214 }
215 
216 #define RTP_SEQ_MOD (1 << 16)
217 
218 static void rtp_init_statistics(RTPStatistics *s, uint16_t base_sequence)
219 {
220  memset(s, 0, sizeof(RTPStatistics));
221  s->max_seq = base_sequence;
222  s->probation = 1;
223 }
224 
225 /*
226  * Called whenever there is a large jump in sequence numbers,
227  * or when they get out of probation...
228  */
229 static void rtp_init_sequence(RTPStatistics *s, uint16_t seq)
230 {
231  s->max_seq = seq;
232  s->cycles = 0;
233  s->base_seq = seq - 1;
234  s->bad_seq = RTP_SEQ_MOD + 1;
235  s->received = 0;
236  s->expected_prior = 0;
237  s->received_prior = 0;
238  s->jitter = 0;
239  s->transit = 0;
240 }
241 
242 /* Returns 1 if we should handle this packet. */
243 static int rtp_valid_packet_in_sequence(RTPStatistics *s, uint16_t seq)
244 {
245  uint16_t udelta = seq - s->max_seq;
246  const int MAX_DROPOUT = 3000;
247  const int MAX_MISORDER = 100;
248  const int MIN_SEQUENTIAL = 2;
249 
250  /* source not valid until MIN_SEQUENTIAL packets with sequence
251  * seq. numbers have been received */
252  if (s->probation) {
253  if (seq == s->max_seq + 1) {
254  s->probation--;
255  s->max_seq = seq;
256  if (s->probation == 0) {
257  rtp_init_sequence(s, seq);
258  s->received++;
259  return 1;
260  }
261  } else {
262  s->probation = MIN_SEQUENTIAL - 1;
263  s->max_seq = seq;
264  }
265  } else if (udelta < MAX_DROPOUT) {
266  // in order, with permissible gap
267  if (seq < s->max_seq) {
268  // sequence number wrapped; count another 64k cycles
269  s->cycles += RTP_SEQ_MOD;
270  }
271  s->max_seq = seq;
272  } else if (udelta <= RTP_SEQ_MOD - MAX_MISORDER) {
273  // sequence made a large jump...
274  if (seq == s->bad_seq) {
275  /* two sequential packets -- assume that the other side
276  * restarted without telling us; just resync. */
277  rtp_init_sequence(s, seq);
278  } else {
279  s->bad_seq = (seq + 1) & (RTP_SEQ_MOD - 1);
280  return 0;
281  }
282  } else {
283  // duplicate or reordered packet...
284  }
285  s->received++;
286  return 1;
287 }
288 
289 static void rtcp_update_jitter(RTPStatistics *s, uint32_t sent_timestamp,
290  uint32_t arrival_timestamp)
291 {
292  // Most of this is pretty straight from RFC 3550 appendix A.8
293  uint32_t transit = arrival_timestamp - sent_timestamp;
294  uint32_t prev_transit = s->transit;
295  int32_t d = transit - prev_transit;
296  // Doing the FFABS() call directly on the "transit - prev_transit"
297  // expression doesn't work, since it's an unsigned expression. Doing the
298  // transit calculation in unsigned is desired though, since it most
299  // probably will need to wrap around.
300  d = FFABS(d);
301  s->transit = transit;
302  if (!prev_transit)
303  return;
304  s->jitter += d - (int32_t) ((s->jitter + 8) >> 4);
305 }
306 
308  AVIOContext *avio, int count)
309 {
310  AVIOContext *pb;
311  uint8_t *buf;
312  int len;
313  int rtcp_bytes;
314  RTPStatistics *stats = &s->statistics;
315  uint32_t lost;
316  uint32_t extended_max;
317  uint32_t expected_interval;
318  uint32_t received_interval;
319  int32_t lost_interval;
320  uint32_t expected;
321  uint32_t fraction;
322 
323  if ((!fd && !avio) || (count < 1))
324  return -1;
325 
326  /* TODO: I think this is way too often; RFC 1889 has algorithm for this */
327  /* XXX: MPEG pts hardcoded. RTCP send every 0.5 seconds */
328  s->octet_count += count;
329  rtcp_bytes = ((s->octet_count - s->last_octet_count) * RTCP_TX_RATIO_NUM) /
331  rtcp_bytes /= 50; // mmu_man: that's enough for me... VLC sends much less btw !?
332  if (rtcp_bytes < 28)
333  return -1;
334  s->last_octet_count = s->octet_count;
335 
336  if (!fd)
337  pb = avio;
338  else if (avio_open_dyn_buf(&pb) < 0)
339  return -1;
340 
341  // Receiver Report
342  avio_w8(pb, (RTP_VERSION << 6) + 1); /* 1 report block */
343  avio_w8(pb, RTCP_RR);
344  avio_wb16(pb, 7); /* length in words - 1 */
345  // our own SSRC: we use the server's SSRC + 1 to avoid conflicts
346  avio_wb32(pb, s->ssrc + 1);
347  avio_wb32(pb, s->ssrc); // server SSRC
348  // some placeholders we should really fill...
349  // RFC 1889/p64
350  extended_max = stats->cycles + stats->max_seq;
351  expected = extended_max - stats->base_seq;
352  lost = expected - stats->received;
353  lost = FFMIN(lost, 0xffffff); // clamp it since it's only 24 bits...
354  expected_interval = expected - stats->expected_prior;
355  stats->expected_prior = expected;
356  received_interval = stats->received - stats->received_prior;
357  stats->received_prior = stats->received;
358  lost_interval = expected_interval - received_interval;
359  if (expected_interval == 0 || lost_interval <= 0)
360  fraction = 0;
361  else
362  fraction = (lost_interval << 8) / expected_interval;
363 
364  fraction = (fraction << 24) | lost;
365 
366  avio_wb32(pb, fraction); /* 8 bits of fraction, 24 bits of total packets lost */
367  avio_wb32(pb, extended_max); /* max sequence received */
368  avio_wb32(pb, stats->jitter >> 4); /* jitter */
369 
370  if (s->last_rtcp_ntp_time == AV_NOPTS_VALUE) {
371  avio_wb32(pb, 0); /* last SR timestamp */
372  avio_wb32(pb, 0); /* delay since last SR */
373  } else {
374  uint32_t middle_32_bits = s->last_rtcp_ntp_time >> 16; // this is valid, right? do we need to handle 64 bit values special?
375  uint32_t delay_since_last = av_rescale(av_gettime_relative() - s->last_rtcp_reception_time,
376  65536, AV_TIME_BASE);
377 
378  avio_wb32(pb, middle_32_bits); /* last SR timestamp */
379  avio_wb32(pb, delay_since_last); /* delay since last SR */
380  }
381 
382  // CNAME
383  avio_w8(pb, (RTP_VERSION << 6) + 1); /* 1 report block */
384  avio_w8(pb, RTCP_SDES);
385  len = strlen(s->hostname);
386  avio_wb16(pb, (7 + len + 3) / 4); /* length in words - 1 */
387  avio_wb32(pb, s->ssrc + 1);
388  avio_w8(pb, 0x01);
389  avio_w8(pb, len);
390  avio_write(pb, s->hostname, len);
391  avio_w8(pb, 0); /* END */
392  // padding
393  for (len = (7 + len) % 4; len % 4; len++)
394  avio_w8(pb, 0);
395 
396  avio_flush(pb);
397  if (!fd)
398  return 0;
399  len = avio_close_dyn_buf(pb, &buf);
400  if ((len > 0) && buf) {
401  int av_unused result;
402  av_log(s->ic, AV_LOG_TRACE, "sending %d bytes of RR\n", len);
403  result = ffurl_write(fd, buf, len);
404  av_log(s->ic, AV_LOG_TRACE, "result from ffurl_write: %d\n", result);
405  av_free(buf);
406  }
407  return 0;
408 }
409 
411 {
412  uint8_t buf[RTP_MIN_PACKET_LENGTH], *ptr = buf;
413 
414  /* Send a small RTP packet */
415 
416  bytestream_put_byte(&ptr, (RTP_VERSION << 6));
417  bytestream_put_byte(&ptr, 0); /* Payload type */
418  bytestream_put_be16(&ptr, 0); /* Seq */
419  bytestream_put_be32(&ptr, 0); /* Timestamp */
420  bytestream_put_be32(&ptr, 0); /* SSRC */
421 
422  ffurl_write(rtp_handle, buf, ptr - buf);
423 
424  /* Send a minimal RTCP RR */
425  ptr = buf;
426  bytestream_put_byte(&ptr, (RTP_VERSION << 6));
427  bytestream_put_byte(&ptr, RTCP_RR); /* receiver report */
428  bytestream_put_be16(&ptr, 1); /* length in words - 1 */
429  bytestream_put_be32(&ptr, 0); /* our own SSRC */
430 
431  ffurl_write(rtp_handle, buf, ptr - buf);
432 }
433 
434 static int find_missing_packets(RTPDemuxContext *s, uint16_t *first_missing,
435  uint16_t *missing_mask)
436 {
437  int i;
438  uint16_t next_seq = s->seq + 1;
439  RTPPacket *pkt = s->queue;
440 
441  if (!pkt || pkt->seq == next_seq)
442  return 0;
443 
444  *missing_mask = 0;
445  for (i = 1; i <= 16; i++) {
446  uint16_t missing_seq = next_seq + i;
447  while (pkt) {
448  int16_t diff = pkt->seq - missing_seq;
449  if (diff >= 0)
450  break;
451  pkt = pkt->next;
452  }
453  if (!pkt)
454  break;
455  if (pkt->seq == missing_seq)
456  continue;
457  *missing_mask |= 1 << (i - 1);
458  }
459 
460  *first_missing = next_seq;
461  return 1;
462 }
463 
465  AVIOContext *avio)
466 {
467  int len, need_keyframe, missing_packets;
468  AVIOContext *pb;
469  uint8_t *buf;
470  int64_t now;
471  uint16_t first_missing = 0, missing_mask = 0;
472 
473  if (!fd && !avio)
474  return -1;
475 
476  need_keyframe = s->handler && s->handler->need_keyframe &&
477  s->handler->need_keyframe(s->dynamic_protocol_context);
478  missing_packets = find_missing_packets(s, &first_missing, &missing_mask);
479 
480  if (!need_keyframe && !missing_packets)
481  return 0;
482 
483  /* Send new feedback if enough time has elapsed since the last
484  * feedback packet. */
485 
486  now = av_gettime_relative();
487  if (s->last_feedback_time &&
488  (now - s->last_feedback_time) < MIN_FEEDBACK_INTERVAL)
489  return 0;
490  s->last_feedback_time = now;
491 
492  if (!fd)
493  pb = avio;
494  else if (avio_open_dyn_buf(&pb) < 0)
495  return -1;
496 
497  if (need_keyframe) {
498  avio_w8(pb, (RTP_VERSION << 6) | 1); /* PLI */
499  avio_w8(pb, RTCP_PSFB);
500  avio_wb16(pb, 2); /* length in words - 1 */
501  // our own SSRC: we use the server's SSRC + 1 to avoid conflicts
502  avio_wb32(pb, s->ssrc + 1);
503  avio_wb32(pb, s->ssrc); // server SSRC
504  }
505 
506  if (missing_packets) {
507  avio_w8(pb, (RTP_VERSION << 6) | 1); /* NACK */
508  avio_w8(pb, RTCP_RTPFB);
509  avio_wb16(pb, 3); /* length in words - 1 */
510  avio_wb32(pb, s->ssrc + 1);
511  avio_wb32(pb, s->ssrc); // server SSRC
512 
513  avio_wb16(pb, first_missing);
514  avio_wb16(pb, missing_mask);
515  }
516 
517  avio_flush(pb);
518  if (!fd)
519  return 0;
520  len = avio_close_dyn_buf(pb, &buf);
521  if (len > 0 && buf) {
522  ffurl_write(fd, buf, len);
523  av_free(buf);
524  }
525  return 0;
526 }
527 
528 /**
529  * open a new RTP parse context for stream 'st'. 'st' can be NULL for
530  * MPEG-2 TS streams.
531  */
533  int payload_type, int queue_size)
534 {
536 
537  s = av_mallocz(sizeof(RTPDemuxContext));
538  if (!s)
539  return NULL;
540  s->payload_type = payload_type;
541  s->last_rtcp_ntp_time = AV_NOPTS_VALUE;
542  s->first_rtcp_ntp_time = AV_NOPTS_VALUE;
543  s->ic = s1;
544  s->st = st;
545  s->queue_size = queue_size;
546 
547  av_log(s->ic, AV_LOG_VERBOSE, "setting jitter buffer size to %d\n",
548  s->queue_size);
549 
550  rtp_init_statistics(&s->statistics, 0);
551  if (st) {
552  switch (st->codecpar->codec_id) {
554  /* According to RFC 3551, the stream clock rate is 8000
555  * even if the sample rate is 16000. */
556  if (st->codecpar->sample_rate == 8000)
557  st->codecpar->sample_rate = 16000;
558  break;
559  case AV_CODEC_ID_PCM_MULAW: {
560  AVCodecParameters *par = st->codecpar;
563  par->bit_rate = par->block_align * 8LL * par->sample_rate;
564  break;
565  }
566  default:
567  break;
568  }
569  }
570  // needed to send back RTCP RR in RTSP sessions
571  gethostname(s->hostname, sizeof(s->hostname));
572  return s;
573 }
574 
577 {
578  s->dynamic_protocol_context = ctx;
579  s->handler = handler;
580 }
581 
583  const char *params)
584 {
585  if (!ff_srtp_set_crypto(&s->srtp, suite, params))
586  s->srtp_enabled = 1;
587 }
588 
589 static int rtp_set_prft(RTPDemuxContext *s, AVPacket *pkt, uint32_t timestamp) {
590  int64_t rtcp_time, delta_timestamp, delta_time;
591 
595  if (!prft)
596  return AVERROR(ENOMEM);
597 
598  rtcp_time = ff_parse_ntp_time(s->last_rtcp_ntp_time) - NTP_OFFSET_US;
599  delta_timestamp = (int64_t)timestamp - (int64_t)s->last_rtcp_timestamp;
600  delta_time = av_rescale_q(delta_timestamp, s->st->time_base, AV_TIME_BASE_Q);
601 
602  prft->wallclock = rtcp_time + delta_time;
603  prft->flags = 24;
604  return 0;
605 }
606 
607 /**
608  * This was the second switch in rtp_parse packet.
609  * Normalizes time, if required, sets stream_index, etc.
610  */
611 static void finalize_packet(RTPDemuxContext *s, AVPacket *pkt, uint32_t timestamp)
612 {
613  if (pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE)
614  return; /* Timestamp already set by depacketizer */
615  if (timestamp == RTP_NOTS_VALUE)
616  return;
617 
618  if (s->last_rtcp_ntp_time != AV_NOPTS_VALUE) {
619  if (rtp_set_prft(s, pkt, timestamp) < 0) {
620  av_log(s->ic, AV_LOG_WARNING, "rtpdec: failed to set prft");
621  }
622  }
623 
624  if (s->last_rtcp_ntp_time != AV_NOPTS_VALUE && s->ic->nb_streams > 1) {
625  int64_t addend;
626  int delta_timestamp;
627 
628  /* compute pts from timestamp with received ntp_time */
629  delta_timestamp = timestamp - s->last_rtcp_timestamp;
630  /* convert to the PTS timebase */
631  addend = av_rescale(s->last_rtcp_ntp_time - s->first_rtcp_ntp_time,
632  s->st->time_base.den,
633  (uint64_t) s->st->time_base.num << 32);
634  pkt->pts = s->range_start_offset + s->rtcp_ts_offset + addend +
635  delta_timestamp;
636  return;
637  }
638 
639  if (!s->base_timestamp)
640  s->base_timestamp = timestamp;
641  /* assume that the difference is INT32_MIN < x < INT32_MAX,
642  * but allow the first timestamp to exceed INT32_MAX */
643  if (!s->timestamp)
644  s->unwrapped_timestamp += timestamp;
645  else
646  s->unwrapped_timestamp += (int32_t)(timestamp - s->timestamp);
647  s->timestamp = timestamp;
648  pkt->pts = s->unwrapped_timestamp + s->range_start_offset -
649  s->base_timestamp;
650 }
651 
653  const uint8_t *buf, int len)
654 {
655  unsigned int ssrc;
656  int payload_type, seq, flags = 0;
657  int ext, csrc;
658  AVStream *st;
659  uint32_t timestamp;
660  int rv = 0;
661 
662  csrc = buf[0] & 0x0f;
663  ext = buf[0] & 0x10;
664  payload_type = buf[1] & 0x7f;
665  if (buf[1] & 0x80)
667  seq = AV_RB16(buf + 2);
668  timestamp = AV_RB32(buf + 4);
669  ssrc = AV_RB32(buf + 8);
670  /* store the ssrc in the RTPDemuxContext */
671  s->ssrc = ssrc;
672 
673  /* NOTE: we can handle only one payload type */
674  if (s->payload_type != payload_type)
675  return -1;
676 
677  st = s->st;
678  // only do something with this if all the rtp checks pass...
679  if (!rtp_valid_packet_in_sequence(&s->statistics, seq)) {
680  av_log(s->ic, AV_LOG_ERROR,
681  "RTP: PT=%02x: bad cseq %04x expected=%04x\n",
682  payload_type, seq, ((s->seq + 1) & 0xffff));
683  return -1;
684  }
685 
686  if (buf[0] & 0x20) {
687  int padding = buf[len - 1];
688  if (len >= 12 + padding)
689  len -= padding;
690  }
691 
692  s->seq = seq;
693  len -= 12;
694  buf += 12;
695 
696  len -= 4 * csrc;
697  buf += 4 * csrc;
698  if (len < 0)
699  return AVERROR_INVALIDDATA;
700 
701  /* RFC 3550 Section 5.3.1 RTP Header Extension handling */
702  if (ext) {
703  if (len < 4)
704  return -1;
705  /* calculate the header extension length (stored as number
706  * of 32-bit words) */
707  ext = (AV_RB16(buf + 2) + 1) << 2;
708 
709  if (len < ext)
710  return -1;
711  // skip past RTP header extension
712  len -= ext;
713  buf += ext;
714  }
715 
716  if (s->handler && s->handler->parse_packet) {
717  rv = s->handler->parse_packet(s->ic, s->dynamic_protocol_context,
718  s->st, pkt, &timestamp, buf, len, seq,
719  flags);
720  } else if (st) {
721  if ((rv = av_new_packet(pkt, len)) < 0)
722  return rv;
723  memcpy(pkt->data, buf, len);
724  pkt->stream_index = st->index;
725  } else {
726  return AVERROR(EINVAL);
727  }
728 
729  // now perform timestamp things....
730  finalize_packet(s, pkt, timestamp);
731 
732  return rv;
733 }
734 
736 {
737  while (s->queue) {
738  RTPPacket *next = s->queue->next;
739  av_freep(&s->queue->buf);
740  av_freep(&s->queue);
741  s->queue = next;
742  }
743  s->seq = 0;
744  s->queue_len = 0;
745  s->prev_ret = 0;
746 }
747 
748 static int enqueue_packet(RTPDemuxContext *s, uint8_t *buf, int len)
749 {
750  uint16_t seq = AV_RB16(buf + 2);
751  RTPPacket **cur = &s->queue, *packet;
752 
753  /* Find the correct place in the queue to insert the packet */
754  while (*cur) {
755  int16_t diff = seq - (*cur)->seq;
756  if (diff < 0)
757  break;
758  cur = &(*cur)->next;
759  }
760 
761  packet = av_mallocz(sizeof(*packet));
762  if (!packet)
763  return AVERROR(ENOMEM);
764  packet->recvtime = av_gettime_relative();
765  packet->seq = seq;
766  packet->len = len;
767  packet->buf = buf;
768  packet->next = *cur;
769  *cur = packet;
770  s->queue_len++;
771 
772  return 0;
773 }
774 
776 {
777  return s->queue && s->queue->seq == (uint16_t) (s->seq + 1);
778 }
779 
781 {
782  return s->queue ? s->queue->recvtime : 0;
783 }
784 
786 {
787  int rv;
788  RTPPacket *next;
789 
790  if (s->queue_len <= 0)
791  return -1;
792 
793  if (!has_next_packet(s)) {
794  int pkt_missed = s->queue->seq - s->seq - 1;
795 
796  if (pkt_missed < 0)
797  pkt_missed += UINT16_MAX;
798  av_log(s->ic, AV_LOG_WARNING,
799  "RTP: missed %d packets\n", pkt_missed);
800  }
801 
802  /* Parse the first packet in the queue, and dequeue it */
803  rv = rtp_parse_packet_internal(s, pkt, s->queue->buf, s->queue->len);
804  next = s->queue->next;
805  av_freep(&s->queue->buf);
806  av_freep(&s->queue);
807  s->queue = next;
808  s->queue_len--;
809  return rv;
810 }
811 
813  uint8_t **bufptr, int len)
814 {
815  uint8_t *buf = bufptr ? *bufptr : NULL;
816  int flags = 0;
817  uint32_t timestamp;
818  int rv = 0;
819 
820  if (!buf) {
821  /* If parsing of the previous packet actually returned 0 or an error,
822  * there's nothing more to be parsed from that packet, but we may have
823  * indicated that we can return the next enqueued packet. */
824  if (s->prev_ret <= 0)
825  return rtp_parse_queued_packet(s, pkt);
826  /* return the next packets, if any */
827  if (s->handler && s->handler->parse_packet) {
828  /* timestamp should be overwritten by parse_packet, if not,
829  * the packet is left with pts == AV_NOPTS_VALUE */
830  timestamp = RTP_NOTS_VALUE;
831  rv = s->handler->parse_packet(s->ic, s->dynamic_protocol_context,
832  s->st, pkt, &timestamp, NULL, 0, 0,
833  flags);
834  finalize_packet(s, pkt, timestamp);
835  return rv;
836  }
837  }
838 
839  if (len < 12)
840  return -1;
841 
842  if ((buf[0] & 0xc0) != (RTP_VERSION << 6))
843  return -1;
844  if (RTP_PT_IS_RTCP(buf[1])) {
845  return rtcp_parse_packet(s, buf, len);
846  }
847 
848  if (s->st) {
849  int64_t received = av_gettime_relative();
850  uint32_t arrival_ts = av_rescale_q(received, AV_TIME_BASE_Q,
851  s->st->time_base);
852  timestamp = AV_RB32(buf + 4);
853  // Calculate the jitter immediately, before queueing the packet
854  // into the reordering queue.
855  rtcp_update_jitter(&s->statistics, timestamp, arrival_ts);
856  }
857 
858  if ((s->seq == 0 && !s->queue) || s->queue_size <= 1) {
859  /* First packet, or no reordering */
860  return rtp_parse_packet_internal(s, pkt, buf, len);
861  } else {
862  uint16_t seq = AV_RB16(buf + 2);
863  int16_t diff = seq - s->seq;
864  if (diff < 0) {
865  /* Packet older than the previously emitted one, drop */
866  av_log(s->ic, AV_LOG_WARNING,
867  "RTP: dropping old packet received too late\n");
868  return -1;
869  } else if (diff <= 1) {
870  /* Correct packet */
871  rv = rtp_parse_packet_internal(s, pkt, buf, len);
872  return rv;
873  } else {
874  /* Still missing some packet, enqueue this one. */
875  rv = enqueue_packet(s, buf, len);
876  if (rv < 0)
877  return rv;
878  *bufptr = NULL;
879  /* Return the first enqueued packet if the queue is full,
880  * even if we're missing something */
881  if (s->queue_len >= s->queue_size) {
882  av_log(s->ic, AV_LOG_WARNING, "jitter buffer full\n");
883  return rtp_parse_queued_packet(s, pkt);
884  }
885  return -1;
886  }
887  }
888 }
889 
890 /**
891  * Parse an RTP or RTCP packet directly sent as a buffer.
892  * @param s RTP parse context.
893  * @param pkt returned packet
894  * @param bufptr pointer to the input buffer or NULL to read the next packets
895  * @param len buffer len
896  * @return 0 if a packet is returned, 1 if a packet is returned and more can follow
897  * (use buf as NULL to read the next). -1 if no packet (error or no more packet).
898  */
900  uint8_t **bufptr, int len)
901 {
902  int rv;
903  if (s->srtp_enabled && bufptr && ff_srtp_decrypt(&s->srtp, *bufptr, &len) < 0)
904  return -1;
905  rv = rtp_parse_one_packet(s, pkt, bufptr, len);
906  s->prev_ret = rv;
907  while (rv < 0 && has_next_packet(s))
909  return rv ? rv : has_next_packet(s);
910 }
911 
913 {
915  ff_srtp_free(&s->srtp);
916  av_free(s);
917 }
918 
920  AVStream *stream, PayloadContext *data, const char *p,
921  int (*parse_fmtp)(AVFormatContext *s,
922  AVStream *stream,
924  const char *attr, const char *value))
925 {
926  char attr[256];
927  char *value;
928  int res;
929  int value_size = strlen(p) + 1;
930 
931  if (!(value = av_malloc(value_size))) {
932  av_log(s, AV_LOG_ERROR, "Failed to allocate data for FMTP.\n");
933  return AVERROR(ENOMEM);
934  }
935 
936  // remove protocol identifier
937  while (*p && *p == ' ')
938  p++; // strip spaces
939  while (*p && *p != ' ')
940  p++; // eat protocol identifier
941  while (*p && *p == ' ')
942  p++; // strip trailing spaces
943 
944  while (ff_rtsp_next_attr_and_value(&p,
945  attr, sizeof(attr),
946  value, value_size)) {
947  res = parse_fmtp(s, stream, data, attr, value);
948  if (res < 0 && res != AVERROR_PATCHWELCOME) {
949  av_free(value);
950  return res;
951  }
952  }
953  av_free(value);
954  return 0;
955 }
956 
957 int ff_rtp_finalize_packet(AVPacket *pkt, AVIOContext **dyn_buf, int stream_idx)
958 {
959  int ret;
961 
962  pkt->size = avio_close_dyn_buf(*dyn_buf, &pkt->data);
963  pkt->stream_index = stream_idx;
964  *dyn_buf = NULL;
965  if ((ret = av_packet_from_data(pkt, pkt->data, pkt->size)) < 0) {
966  av_freep(&pkt->data);
967  return ret;
968  }
969  return pkt->size;
970 }
flags
const SwsFlags flags[]
Definition: swscale.c:61
av_packet_unref
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition: packet.c:430
AVMEDIA_TYPE_SUBTITLE
@ AVMEDIA_TYPE_SUBTITLE
Definition: avutil.h:203
av_gettime_relative
int64_t av_gettime_relative(void)
Get the current time in microseconds since some unspecified starting point.
Definition: time.c:56
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:216
ff_h263_rfc2190_dynamic_handler
const RTPDynamicProtocolHandler ff_h263_rfc2190_dynamic_handler
Definition: rtpdec_h263_rfc2190.c:188
RTPStatistics
Definition: rtpdec.h:80
name
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default minimum maximum flags name is the option name
Definition: writing_filters.txt:88
ff_quicktime_rtp_aud_handler
const RTPDynamicProtocolHandler ff_quicktime_rtp_aud_handler
rtp_dynamic_protocol_handler_list
static const RTPDynamicProtocolHandler *const rtp_dynamic_protocol_handler_list[]
Definition: rtpdec.c:75
ff_amr_nb_dynamic_handler
const RTPDynamicProtocolHandler ff_amr_nb_dynamic_handler
Definition: rtpdec_amr.c:185
r
const char * r
Definition: vf_curves.c:127
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame 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. Frame references ownership and permissions
ff_h261_dynamic_handler
const RTPDynamicProtocolHandler ff_h261_dynamic_handler
Definition: rtpdec_h261.c:167
ff_rtp_send_rtcp_feedback
int ff_rtp_send_rtcp_feedback(RTPDemuxContext *s, URLContext *fd, AVIOContext *avio)
Definition: rtpdec.c:464
AVCodecParameters
This struct describes the properties of an encoded stream.
Definition: codec_par.h:47
RTP_VERSION
#define RTP_VERSION
Definition: rtp.h:80
parse_fmtp
static int parse_fmtp(AVFormatContext *s, AVStream *stream, PayloadContext *data, const char *attr, const char *value)
Definition: rtpdec_latm.c:133
rtpdec_formats.h
ff_parse_fmtp
int ff_parse_fmtp(AVFormatContext *s, AVStream *stream, PayloadContext *data, const char *p, int(*parse_fmtp)(AVFormatContext *s, AVStream *stream, PayloadContext *data, const char *attr, const char *value))
Definition: rtpdec.c:919
enqueue_packet
static int enqueue_packet(RTPDemuxContext *s, uint8_t *buf, int len)
Definition: rtpdec.c:748
AV_TIME_BASE_Q
#define AV_TIME_BASE_Q
Internal time base represented as fractional value.
Definition: avutil.h:263
int64_t
long long int64_t
Definition: coverity.c:34
ffurl_write
static int ffurl_write(URLContext *h, const uint8_t *buf, int size)
Write size bytes from buf to the resource accessed by h.
Definition: url.h:202
ff_hevc_dynamic_handler
const RTPDynamicProtocolHandler ff_hevc_dynamic_handler
Definition: rtpdec_hevc.c:342
l24_dynamic_handler
static const RTPDynamicProtocolHandler l24_dynamic_handler
Definition: rtpdec.c:40
av_strcasecmp
int av_strcasecmp(const char *a, const char *b)
Locale-independent case-insensitive compare.
Definition: avstring.c:207
av_unused
#define av_unused
Definition: attributes.h:131
AVProducerReferenceTime::wallclock
int64_t wallclock
A UTC timestamp, in microseconds, since Unix epoch (e.g, av_gettime()).
Definition: defs.h:332
RTP_FLAG_MARKER
#define RTP_FLAG_MARKER
RTP marker bit was set for this packet.
Definition: rtpdec.h:94
AVPacket::data
uint8_t * data
Definition: packet.h:535
ff_vp8_dynamic_handler
const RTPDynamicProtocolHandler ff_vp8_dynamic_handler
Definition: rtpdec_vp8.c:279
srtp.h
data
const char data[16]
Definition: mxf.c:149
ff_g726le_24_dynamic_handler
const RTPDynamicProtocolHandler ff_g726le_24_dynamic_handler
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:226
ff_parse_ntp_time
uint64_t ff_parse_ntp_time(uint64_t ntp_ts)
Parse the NTP time in micro seconds (since NTP epoch).
Definition: utils.c:277
AV_CODEC_ID_ADPCM_G722
@ AV_CODEC_ID_ADPCM_G722
Definition: codec_id.h:403
mathematics.h
ff_av1_dynamic_handler
const RTPDynamicProtocolHandler ff_av1_dynamic_handler
Definition: rtpdec_av1.c:451
AVChannelLayout::nb_channels
int nb_channels
Number of channels in this layout.
Definition: channel_layout.h:329
ff_rtp_check_and_send_back_rr
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't hear from them...
Definition: rtpdec.c:307
codec_type
enum AVMediaType codec_type
Definition: rtp.c:37
ff_h263_2000_dynamic_handler
const RTPDynamicProtocolHandler ff_h263_2000_dynamic_handler
Definition: rtpdec_h263.c:100
av_malloc
#define av_malloc(s)
Definition: tableprint_vlc.h:31
ff_rtp_finalize_packet
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:957
AV_CODEC_ID_MP3ADU
@ AV_CODEC_ID_MP3ADU
Definition: codec_id.h:462
ff_rtp_send_punch_packets
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:410
RTPDynamicProtocolHandler::enc_name
const char * enc_name
Definition: rtpdec.h:117
ff_opus_dynamic_handler
const RTPDynamicProtocolHandler ff_opus_dynamic_handler
Definition: rtpdec_opus.c:144
AV_CODEC_ID_SPEEX
@ AV_CODEC_ID_SPEEX
Definition: codec_id.h:484
ff_srtp_decrypt
int ff_srtp_decrypt(struct SRTPContext *s, uint8_t *buf, int *lenptr)
Definition: srtp.c:127
ff_rtp_parse_set_crypto
void ff_rtp_parse_set_crypto(RTPDemuxContext *s, const char *suite, const char *params)
Definition: rtpdec.c:582
av_get_bits_per_sample
int av_get_bits_per_sample(enum AVCodecID codec_id)
Return codec bits per sample.
Definition: utils.c:547
ff_vc2hq_dynamic_handler
const RTPDynamicProtocolHandler ff_vc2hq_dynamic_handler
Definition: rtpdec_vc2hq.c:219
avio_close_dyn_buf
int avio_close_dyn_buf(AVIOContext *s, uint8_t **pbuffer)
Return the written size and a pointer to the buffer.
Definition: aviobuf.c:1407
AV_LOG_TRACE
#define AV_LOG_TRACE
Extremely verbose debugging, useful for libav* development.
Definition: log.h:236
pkt
AVPacket * pkt
Definition: movenc.c:60
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
gsm_dynamic_handler
static const RTPDynamicProtocolHandler gsm_dynamic_handler
Definition: rtpdec.c:46
avio_open_dyn_buf
int avio_open_dyn_buf(AVIOContext **s)
Open a write only memory stream.
Definition: aviobuf.c:1362
t140_dynamic_handler
static const RTPDynamicProtocolHandler t140_dynamic_handler
Definition: rtpdec.c:64
intreadwrite.h
RTCP_TX_RATIO_NUM
#define RTCP_TX_RATIO_NUM
Definition: rtp.h:84
s
#define s(width, name)
Definition: cbs_vp9.c:198
RTPPacket::next
struct RTPPacket * next
Definition: rtpdec.h:145
av_new_packet
int av_new_packet(AVPacket *pkt, int size)
Allocate the payload of a packet and initialize its fields with default values.
Definition: packet.c:99
ff_rdt_live_video_handler
const RTPDynamicProtocolHandler ff_rdt_live_video_handler
ff_ilbc_dynamic_handler
const RTPDynamicProtocolHandler ff_ilbc_dynamic_handler
Definition: rtpdec_ilbc.c:69
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:201
ff_qdm2_dynamic_handler
const RTPDynamicProtocolHandler ff_qdm2_dynamic_handler
Definition: rtpdec_qdm2.c:302
RTCP_TX_RATIO_DEN
#define RTCP_TX_RATIO_DEN
Definition: rtp.h:85
RTP_NOTS_VALUE
#define RTP_NOTS_VALUE
Definition: rtpdec.h:41
finalize_packet
static void finalize_packet(RTPDemuxContext *s, AVPacket *pkt, uint32_t timestamp)
This was the second switch in rtp_parse packet.
Definition: rtpdec.c:611
ff_mp4v_es_dynamic_handler
const RTPDynamicProtocolHandler ff_mp4v_es_dynamic_handler
Definition: rtpdec_mpeg4.c:360
ff_rfc4175_rtp_handler
const RTPDynamicProtocolHandler ff_rfc4175_rtp_handler
Definition: rtpdec_rfc4175.c:320
ff_dv_dynamic_handler
const RTPDynamicProtocolHandler ff_dv_dynamic_handler
Definition: rtpdec_dv.c:132
rtp_init_statistics
static void rtp_init_statistics(RTPStatistics *s, uint16_t base_sequence)
Definition: rtpdec.c:218
ctx
AVFormatContext * ctx
Definition: movenc.c:49
has_next_packet
static int has_next_packet(RTPDemuxContext *s)
Definition: rtpdec.c:775
av_rescale_q
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
Definition: mathematics.c:142
AV_CODEC_ID_PCM_MULAW
@ AV_CODEC_ID_PCM_MULAW
Definition: codec_id.h:342
ff_mpeg_audio_robust_dynamic_handler
const RTPDynamicProtocolHandler ff_mpeg_audio_robust_dynamic_handler
Definition: rtpdec_mpa_robust.c:193
ff_rtp_handler_find_by_id
const RTPDynamicProtocolHandler * ff_rtp_handler_find_by_id(int id, enum AVMediaType codec_type)
Find a registered rtp dynamic protocol handler with a matching codec ID.
Definition: rtpdec.c:168
handler
static void handler(vbi_event *ev, void *user_data)
Definition: libzvbi-teletextdec.c:508
rtp_set_prft
static int rtp_set_prft(RTPDemuxContext *s, AVPacket *pkt, uint32_t timestamp)
Definition: rtpdec.c:589
FFABS
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
Definition: common.h:74
avio_flush
void avio_flush(AVIOContext *s)
Force flushing of buffered data.
Definition: aviobuf.c:223
rtp_valid_packet_in_sequence
static int rtp_valid_packet_in_sequence(RTPStatistics *s, uint16_t seq)
Definition: rtpdec.c:243
ff_qt_rtp_vid_handler
const RTPDynamicProtocolHandler ff_qt_rtp_vid_handler
AVFormatContext
Format I/O context.
Definition: avformat.h:1265
internal.h
AVStream::codecpar
AVCodecParameters * codecpar
Codec parameters associated with this stream.
Definition: avformat.h:768
MIN_FEEDBACK_INTERVAL
#define MIN_FEEDBACK_INTERVAL
Definition: rtpdec.c:38
result
and forward the result(frame or status change) to the corresponding input. If nothing is possible
find_missing_packets
static int find_missing_packets(RTPDemuxContext *s, uint16_t *first_missing, uint16_t *missing_mask)
Definition: rtpdec.c:434
ff_rtsp_next_attr_and_value
int ff_rtsp_next_attr_and_value(const char **p, char *attr, int attr_size, char *value, int value_size)
ff_mp4a_latm_dynamic_handler
const RTPDynamicProtocolHandler ff_mp4a_latm_dynamic_handler
Definition: rtpdec_latm.c:167
NULL
#define NULL
Definition: coverity.c:32
RTCP_SDES
@ RTCP_SDES
Definition: rtp.h:101
AVERROR_PATCHWELCOME
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition: error.h:64
ff_h264_dynamic_handler
const RTPDynamicProtocolHandler ff_h264_dynamic_handler
Definition: rtpdec_h264.c:412
ff_rtp_queued_packet_time
int64_t ff_rtp_queued_packet_time(RTPDemuxContext *s)
Definition: rtpdec.c:780
ff_qt_rtp_aud_handler
const RTPDynamicProtocolHandler ff_qt_rtp_aud_handler
time.h
avio_w8
void avio_w8(AVIOContext *s, int b)
Definition: aviobuf.c:179
RTCP_PSFB
@ RTCP_PSFB
Definition: rtp.h:105
AVProducerReferenceTime
This structure supplies correlation between a packet timestamp and a wall clock production time.
Definition: defs.h:328
AVCodecParameters::ch_layout
AVChannelLayout ch_layout
Audio only.
Definition: codec_par.h:180
ff_rdt_audio_handler
const RTPDynamicProtocolHandler ff_rdt_audio_handler
AVProducerReferenceTime::flags
int flags
Definition: defs.h:333
stats
static void stats(AVPacket *const *in, int n_in, unsigned *_max, unsigned *_sum)
Definition: vp9_superframe.c:34
RTP_MIN_PACKET_LENGTH
#define RTP_MIN_PACKET_LENGTH
Definition: rtpdec.h:36
AVCodecParameters::sample_rate
int sample_rate
Audio only.
Definition: codec_par.h:184
rtpdec.h
RTCP_RR
@ RTCP_RR
Definition: rtp.h:100
AV_CODEC_ID_GSM
@ AV_CODEC_ID_GSM
as in Berlin toast format
Definition: codec_id.h:467
ff_rdt_video_handler
const RTPDynamicProtocolHandler ff_rdt_video_handler
RTPPacket
Definition: rtpdec.h:140
ff_mpeg_audio_dynamic_handler
const RTPDynamicProtocolHandler ff_mpeg_audio_dynamic_handler
Definition: rtpdec_mpeg12.c:52
suite
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 DBG Preprocess x86 external assembler files to a dbg asm file in the object which then gets compiled Helps in developing those assembler files DESTDIR Destination directory for the install useful to prepare packages or install FFmpeg in cross environments GEN Set to ‘1’ to generate the missing or mismatched references Makefile builds all the libraries and the executables fate Run the fate test suite
Definition: build_system.txt:28
ff_rtp_parse_close
void ff_rtp_parse_close(RTPDemuxContext *s)
Definition: rtpdec.c:912
RTP_PT_IS_RTCP
#define RTP_PT_IS_RTCP(x)
Definition: rtp.h:112
realmedia_mp3_dynamic_handler
static const RTPDynamicProtocolHandler realmedia_mp3_dynamic_handler
Definition: rtpdec.c:52
ff_rtp_parse_open
RTPDemuxContext * ff_rtp_parse_open(AVFormatContext *s1, AVStream *st, int payload_type, int queue_size)
open a new RTP parse context for stream 'st'.
Definition: rtpdec.c:532
av_packet_from_data
int av_packet_from_data(AVPacket *pkt, uint8_t *data, int size)
Initialize a reference-counted packet from av_malloc()ed data.
Definition: packet.c:173
AVIOContext
Bytestream IO Context.
Definition: avio.h:160
AVMediaType
AVMediaType
Definition: avutil.h:198
AVPacket::size
int size
Definition: packet.h:536
ff_g726_16_dynamic_handler
const RTPDynamicProtocolHandler ff_g726_16_dynamic_handler
AV_NOPTS_VALUE
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:247
NTP_OFFSET_US
#define NTP_OFFSET_US
Definition: internal.h:404
AV_RB32
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_RB32
Definition: bytestream.h:96
ff_ac3_dynamic_handler
const RTPDynamicProtocolHandler ff_ac3_dynamic_handler
Definition: rtpdec_ac3.c:125
diff
static av_always_inline int diff(const struct color_info *a, const struct color_info *b, const int trans_thresh)
Definition: vf_paletteuse.c:166
ff_g726le_16_dynamic_handler
const RTPDynamicProtocolHandler ff_g726le_16_dynamic_handler
AVPacket::dts
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed.
Definition: packet.h:534
avio_write
void avio_write(AVIOContext *s, const unsigned char *buf, int size)
Definition: aviobuf.c:201
avio_wb32
void avio_wb32(AVIOContext *s, unsigned int val)
Definition: aviobuf.c:365
ff_srtp_free
void ff_srtp_free(struct SRTPContext *s)
Definition: srtp.c:32
ff_rtp_handler_find_by_name
const RTPDynamicProtocolHandler * ff_rtp_handler_find_by_name(const char *name, enum AVMediaType codec_type)
Find a registered rtp dynamic protocol handler with the specified name.
Definition: rtpdec.c:154
AV_PKT_DATA_PRFT
@ AV_PKT_DATA_PRFT
Producer Reference Time data corresponding to the AVProducerReferenceTime struct, usually exported by...
Definition: packet.h:265
speex_dynamic_handler
static const RTPDynamicProtocolHandler speex_dynamic_handler
Definition: rtpdec.c:58
rtp_parse_packet_internal
static int rtp_parse_packet_internal(RTPDemuxContext *s, AVPacket *pkt, const uint8_t *buf, int len)
Definition: rtpdec.c:652
ff_g726_40_dynamic_handler
const RTPDynamicProtocolHandler ff_g726_40_dynamic_handler
rtp_handler_iterate
static const RTPDynamicProtocolHandler * rtp_handler_iterate(void **opaque)
Iterate over all registered rtp dynamic protocol handlers.
Definition: rtpdec.c:143
URLContext
Definition: url.h:35
rtcp_parse_packet
static int rtcp_parse_packet(RTPDemuxContext *s, const unsigned char *buf, int len)
Definition: rtpdec.c:181
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
AVPacket::pts
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
Definition: packet.h:528
ff_vorbis_dynamic_handler
const RTPDynamicProtocolHandler ff_vorbis_dynamic_handler
Definition: rtpdec_xiph.c:380
AV_TIME_BASE
#define AV_TIME_BASE
Internal time base represented as integer.
Definition: avutil.h:253
ff_rtp_parse_packet
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:899
AVCodecParameters::block_align
int block_align
Audio only.
Definition: codec_par.h:191
ff_mpeg_video_dynamic_handler
const RTPDynamicProtocolHandler ff_mpeg_video_dynamic_handler
Definition: rtpdec_mpeg12.c:60
RTCP_BYE
@ RTCP_BYE
Definition: rtp.h:102
value
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default value
Definition: writing_filters.txt:86
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
url.h
av_mallocz
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:256
len
int len
Definition: vorbis_enc_data.h:426
ff_srtp_set_crypto
int ff_srtp_set_crypto(struct SRTPContext *s, const char *suite, const char *params)
Definition: srtp.c:66
av_rescale
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:129
RTPDemuxContext
Definition: rtpdec.h:148
ret
ret
Definition: filter_design.txt:187
AVStream
Stream structure.
Definition: avformat.h:745
ff_g726_32_dynamic_handler
const RTPDynamicProtocolHandler ff_g726_32_dynamic_handler
ff_amr_wb_dynamic_handler
const RTPDynamicProtocolHandler ff_amr_wb_dynamic_handler
Definition: rtpdec_amr.c:195
avformat.h
RTCP_RTPFB
@ RTCP_RTPFB
Definition: rtp.h:104
AV_CODEC_ID_TEXT
@ AV_CODEC_ID_TEXT
raw UTF-8 text
Definition: codec_id.h:561
network.h
ff_quicktime_rtp_vid_handler
const RTPDynamicProtocolHandler ff_quicktime_rtp_vid_handler
ff_mpeg4_generic_dynamic_handler
const RTPDynamicProtocolHandler ff_mpeg4_generic_dynamic_handler
Definition: rtpdec_mpeg4.c:369
AVStream::index
int index
stream index in AVFormatContext
Definition: avformat.h:751
rtp_parse_one_packet
static int rtp_parse_one_packet(RTPDemuxContext *s, AVPacket *pkt, uint8_t **bufptr, int len)
Definition: rtpdec.c:812
av_packet_new_side_data
uint8_t * av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type, size_t size)
Allocate new information of a packet.
Definition: packet.c:232
rtcp_update_jitter
static void rtcp_update_jitter(RTPStatistics *s, uint32_t sent_timestamp, uint32_t arrival_timestamp)
Definition: rtpdec.c:289
RTCP_SR
@ RTCP_SR
Definition: rtp.h:99
ff_vp9_dynamic_handler
const RTPDynamicProtocolHandler ff_vp9_dynamic_handler
Definition: rtpdec_vp9.c:333
ff_svq3_dynamic_handler
const RTPDynamicProtocolHandler ff_svq3_dynamic_handler
Definition: rtpdec_svq3.c:109
AVPacket::stream_index
int stream_index
Definition: packet.h:537
ff_g726le_40_dynamic_handler
const RTPDynamicProtocolHandler ff_g726le_40_dynamic_handler
ff_rdt_live_audio_handler
const RTPDynamicProtocolHandler ff_rdt_live_audio_handler
ff_mpegts_dynamic_handler
const RTPDynamicProtocolHandler ff_mpegts_dynamic_handler
Definition: rtpdec_mpegts.c:92
rtp_init_sequence
static void rtp_init_sequence(RTPStatistics *s, uint16_t seq)
Definition: rtpdec.c:229
AVCodecParameters::bits_per_coded_sample
int bits_per_coded_sample
The number of bits per sample in the codedwords.
Definition: codec_par.h:110
mem.h
ff_ms_rtp_asf_pfv_handler
const RTPDynamicProtocolHandler ff_ms_rtp_asf_pfv_handler
ff_g726le_32_dynamic_handler
const RTPDynamicProtocolHandler ff_g726le_32_dynamic_handler
RTP_SEQ_MOD
#define RTP_SEQ_MOD
Definition: rtpdec.c:216
av_free
#define av_free(p)
Definition: tableprint_vlc.h:34
AVCodecParameters::codec_id
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
Definition: codec_par.h:55
ff_rtp_parse_set_dynamic_protocol
void ff_rtp_parse_set_dynamic_protocol(RTPDemuxContext *s, PayloadContext *ctx, const RTPDynamicProtocolHandler *handler)
Definition: rtpdec.c:575
AVPacket
This structure stores compressed data.
Definition: packet.h:512
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
ff_jpeg_dynamic_handler
const RTPDynamicProtocolHandler ff_jpeg_dynamic_handler
Definition: rtpdec_jpeg.c:382
ff_rtp_reset_packet_queue
void ff_rtp_reset_packet_queue(RTPDemuxContext *s)
Definition: rtpdec.c:735
int32_t
int32_t
Definition: audioconvert.c:56
bytestream.h
avio_wb16
void avio_wb16(AVIOContext *s, unsigned int val)
Definition: aviobuf.c:443
AVCodecParameters::bit_rate
int64_t bit_rate
The average bitrate of the encoded data (in bits per second).
Definition: codec_par.h:97
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
ff_g726_24_dynamic_handler
const RTPDynamicProtocolHandler ff_g726_24_dynamic_handler
ff_qcelp_dynamic_handler
const RTPDynamicProtocolHandler ff_qcelp_dynamic_handler
Definition: rtpdec_qcelp.c:212
avstring.h
ff_h263_1998_dynamic_handler
const RTPDynamicProtocolHandler ff_h263_1998_dynamic_handler
Definition: rtpdec_h263.c:92
PayloadContext
RTP/AV1 specific private data.
Definition: rdt.c:85
rtp_parse_queued_packet
static int rtp_parse_queued_packet(RTPDemuxContext *s, AVPacket *pkt)
Definition: rtpdec.c:785
ff_theora_dynamic_handler
const RTPDynamicProtocolHandler ff_theora_dynamic_handler
Definition: rtpdec_xiph.c:370
AV_CODEC_ID_PCM_S24BE
@ AV_CODEC_ID_PCM_S24BE
Definition: codec_id.h:349
ff_ms_rtp_asf_pfa_handler
const RTPDynamicProtocolHandler ff_ms_rtp_asf_pfa_handler
AV_RB64
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_RB64
Definition: bytestream.h:95
RTPDynamicProtocolHandler
Definition: rtpdec.h:116
AV_RB16
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_WB32 unsigned int_TMPL AV_WB24 unsigned int_TMPL AV_RB16
Definition: bytestream.h:98