FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavformat/rtpdec.c
Date: 2025-03-08 20:38:41
Exec Total Coverage
Lines: 0 496 0.0%
Functions: 0 29 0.0%
Branches: 0 272 0.0%

Line Branch Exec Source
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
40 static const RTPDynamicProtocolHandler l24_dynamic_handler = {
41 .enc_name = "L24",
42 .codec_type = AVMEDIA_TYPE_AUDIO,
43 .codec_id = AV_CODEC_ID_PCM_S24BE,
44 };
45
46 static const RTPDynamicProtocolHandler gsm_dynamic_handler = {
47 .enc_name = "GSM",
48 .codec_type = AVMEDIA_TYPE_AUDIO,
49 .codec_id = AV_CODEC_ID_GSM,
50 };
51
52 static const RTPDynamicProtocolHandler realmedia_mp3_dynamic_handler = {
53 .enc_name = "X-MP3-draft-00",
54 .codec_type = AVMEDIA_TYPE_AUDIO,
55 .codec_id = AV_CODEC_ID_MP3ADU,
56 };
57
58 static const RTPDynamicProtocolHandler speex_dynamic_handler = {
59 .enc_name = "speex",
60 .codec_type = AVMEDIA_TYPE_AUDIO,
61 .codec_id = AV_CODEC_ID_SPEEX,
62 };
63
64 static const RTPDynamicProtocolHandler opus_dynamic_handler = {
65 .enc_name = "opus",
66 .codec_type = AVMEDIA_TYPE_AUDIO,
67 .codec_id = AV_CODEC_ID_OPUS,
68 };
69
70 static const RTPDynamicProtocolHandler t140_dynamic_handler = { /* RFC 4103 */
71 .enc_name = "t140",
72 .codec_type = AVMEDIA_TYPE_SUBTITLE,
73 .codec_id = AV_CODEC_ID_TEXT,
74 };
75
76 extern const RTPDynamicProtocolHandler ff_rdt_video_handler;
77 extern const RTPDynamicProtocolHandler ff_rdt_audio_handler;
78 extern const RTPDynamicProtocolHandler ff_rdt_live_video_handler;
79 extern const RTPDynamicProtocolHandler ff_rdt_live_audio_handler;
80
81 static const RTPDynamicProtocolHandler *const rtp_dynamic_protocol_handler_list[] = {
82 /* rtp */
83 &ff_ac3_dynamic_handler,
84 &ff_amr_nb_dynamic_handler,
85 &ff_amr_wb_dynamic_handler,
86 &ff_av1_dynamic_handler,
87 &ff_dv_dynamic_handler,
88 &ff_g726_16_dynamic_handler,
89 &ff_g726_24_dynamic_handler,
90 &ff_g726_32_dynamic_handler,
91 &ff_g726_40_dynamic_handler,
92 &ff_g726le_16_dynamic_handler,
93 &ff_g726le_24_dynamic_handler,
94 &ff_g726le_32_dynamic_handler,
95 &ff_g726le_40_dynamic_handler,
96 &ff_h261_dynamic_handler,
97 &ff_h263_1998_dynamic_handler,
98 &ff_h263_2000_dynamic_handler,
99 &ff_h263_rfc2190_dynamic_handler,
100 &ff_h264_dynamic_handler,
101 &ff_hevc_dynamic_handler,
102 &ff_ilbc_dynamic_handler,
103 &ff_jpeg_dynamic_handler,
104 &ff_mp4a_latm_dynamic_handler,
105 &ff_mp4v_es_dynamic_handler,
106 &ff_mpeg_audio_dynamic_handler,
107 &ff_mpeg_audio_robust_dynamic_handler,
108 &ff_mpeg_video_dynamic_handler,
109 &ff_mpeg4_generic_dynamic_handler,
110 &ff_mpegts_dynamic_handler,
111 &ff_ms_rtp_asf_pfa_handler,
112 &ff_ms_rtp_asf_pfv_handler,
113 &ff_qcelp_dynamic_handler,
114 &ff_qdm2_dynamic_handler,
115 &ff_qt_rtp_aud_handler,
116 &ff_qt_rtp_vid_handler,
117 &ff_quicktime_rtp_aud_handler,
118 &ff_quicktime_rtp_vid_handler,
119 &ff_rfc4175_rtp_handler,
120 &ff_svq3_dynamic_handler,
121 &ff_theora_dynamic_handler,
122 &ff_vc2hq_dynamic_handler,
123 &ff_vorbis_dynamic_handler,
124 &ff_vp8_dynamic_handler,
125 &ff_vp9_dynamic_handler,
126 &gsm_dynamic_handler,
127 &l24_dynamic_handler,
128 &opus_dynamic_handler,
129 &realmedia_mp3_dynamic_handler,
130 &speex_dynamic_handler,
131 &t140_dynamic_handler,
132 /* rdt */
133 &ff_rdt_video_handler,
134 &ff_rdt_audio_handler,
135 &ff_rdt_live_video_handler,
136 &ff_rdt_live_audio_handler,
137 NULL,
138 };
139
140 /**
141 * Iterate over all registered rtp dynamic protocol handlers.
142 *
143 * @param opaque a pointer where libavformat will store the iteration state.
144 * Must point to NULL to start the iteration.
145 *
146 * @return the next registered rtp dynamic protocol handler
147 * or NULL when the iteration is finished
148 */
149 static const RTPDynamicProtocolHandler *rtp_handler_iterate(void **opaque)
150 {
151 uintptr_t i = (uintptr_t)*opaque;
152 const RTPDynamicProtocolHandler *r = rtp_dynamic_protocol_handler_list[i];
153
154 if (r)
155 *opaque = (void*)(i + 1);
156
157 return r;
158 }
159
160 const RTPDynamicProtocolHandler *ff_rtp_handler_find_by_name(const char *name,
161 enum AVMediaType codec_type)
162 {
163 void *i = 0;
164 const RTPDynamicProtocolHandler *handler;
165 while (handler = rtp_handler_iterate(&i)) {
166 if (handler->enc_name &&
167 !av_strcasecmp(name, handler->enc_name) &&
168 codec_type == handler->codec_type)
169 return handler;
170 }
171 return NULL;
172 }
173
174 const RTPDynamicProtocolHandler *ff_rtp_handler_find_by_id(int id,
175 enum AVMediaType codec_type)
176 {
177 void *i = 0;
178 const RTPDynamicProtocolHandler *handler;
179 while (handler = rtp_handler_iterate(&i)) {
180 if (handler->static_payload_id && handler->static_payload_id == id &&
181 codec_type == handler->codec_type)
182 return handler;
183 }
184 return NULL;
185 }
186
187 static int rtcp_parse_packet(RTPDemuxContext *s, const unsigned char *buf,
188 int len)
189 {
190 int payload_len;
191 while (len >= 4) {
192 payload_len = FFMIN(len, (AV_RB16(buf + 2) + 1) * 4);
193
194 switch (buf[1]) {
195 case RTCP_SR:
196 if (payload_len < 20) {
197 av_log(s->ic, AV_LOG_ERROR, "Invalid RTCP SR packet length\n");
198 return AVERROR_INVALIDDATA;
199 }
200
201 s->last_rtcp_reception_time = av_gettime_relative();
202 s->last_rtcp_ntp_time = AV_RB64(buf + 8);
203 s->last_rtcp_timestamp = AV_RB32(buf + 16);
204 if (s->first_rtcp_ntp_time == AV_NOPTS_VALUE) {
205 s->first_rtcp_ntp_time = s->last_rtcp_ntp_time;
206 if (!s->base_timestamp)
207 s->base_timestamp = s->last_rtcp_timestamp;
208 s->rtcp_ts_offset = (int32_t)(s->last_rtcp_timestamp - s->base_timestamp);
209 }
210
211 break;
212 case RTCP_BYE:
213 return -RTCP_BYE;
214 }
215
216 buf += payload_len;
217 len -= payload_len;
218 }
219 return -1;
220 }
221
222 #define RTP_SEQ_MOD (1 << 16)
223
224 static void rtp_init_statistics(RTPStatistics *s, uint16_t base_sequence)
225 {
226 memset(s, 0, sizeof(RTPStatistics));
227 s->max_seq = base_sequence;
228 s->probation = 1;
229 }
230
231 /*
232 * Called whenever there is a large jump in sequence numbers,
233 * or when they get out of probation...
234 */
235 static void rtp_init_sequence(RTPStatistics *s, uint16_t seq)
236 {
237 s->max_seq = seq;
238 s->cycles = 0;
239 s->base_seq = seq - 1;
240 s->bad_seq = RTP_SEQ_MOD + 1;
241 s->received = 0;
242 s->expected_prior = 0;
243 s->received_prior = 0;
244 s->jitter = 0;
245 s->transit = 0;
246 }
247
248 /* Returns 1 if we should handle this packet. */
249 static int rtp_valid_packet_in_sequence(RTPStatistics *s, uint16_t seq)
250 {
251 uint16_t udelta = seq - s->max_seq;
252 const int MAX_DROPOUT = 3000;
253 const int MAX_MISORDER = 100;
254 const int MIN_SEQUENTIAL = 2;
255
256 /* source not valid until MIN_SEQUENTIAL packets with sequence
257 * seq. numbers have been received */
258 if (s->probation) {
259 if (seq == s->max_seq + 1) {
260 s->probation--;
261 s->max_seq = seq;
262 if (s->probation == 0) {
263 rtp_init_sequence(s, seq);
264 s->received++;
265 return 1;
266 }
267 } else {
268 s->probation = MIN_SEQUENTIAL - 1;
269 s->max_seq = seq;
270 }
271 } else if (udelta < MAX_DROPOUT) {
272 // in order, with permissible gap
273 if (seq < s->max_seq) {
274 // sequence number wrapped; count another 64k cycles
275 s->cycles += RTP_SEQ_MOD;
276 }
277 s->max_seq = seq;
278 } else if (udelta <= RTP_SEQ_MOD - MAX_MISORDER) {
279 // sequence made a large jump...
280 if (seq == s->bad_seq) {
281 /* two sequential packets -- assume that the other side
282 * restarted without telling us; just resync. */
283 rtp_init_sequence(s, seq);
284 } else {
285 s->bad_seq = (seq + 1) & (RTP_SEQ_MOD - 1);
286 return 0;
287 }
288 } else {
289 // duplicate or reordered packet...
290 }
291 s->received++;
292 return 1;
293 }
294
295 static void rtcp_update_jitter(RTPStatistics *s, uint32_t sent_timestamp,
296 uint32_t arrival_timestamp)
297 {
298 // Most of this is pretty straight from RFC 3550 appendix A.8
299 uint32_t transit = arrival_timestamp - sent_timestamp;
300 uint32_t prev_transit = s->transit;
301 int32_t d = transit - prev_transit;
302 // Doing the FFABS() call directly on the "transit - prev_transit"
303 // expression doesn't work, since it's an unsigned expression. Doing the
304 // transit calculation in unsigned is desired though, since it most
305 // probably will need to wrap around.
306 d = FFABS(d);
307 s->transit = transit;
308 if (!prev_transit)
309 return;
310 s->jitter += d - (int32_t) ((s->jitter + 8) >> 4);
311 }
312
313 int ff_rtp_check_and_send_back_rr(RTPDemuxContext *s, URLContext *fd,
314 AVIOContext *avio, int count)
315 {
316 AVIOContext *pb;
317 uint8_t *buf;
318 int len;
319 int rtcp_bytes;
320 RTPStatistics *stats = &s->statistics;
321 uint32_t lost;
322 uint32_t extended_max;
323 uint32_t expected_interval;
324 uint32_t received_interval;
325 int32_t lost_interval;
326 uint32_t expected;
327 uint32_t fraction;
328
329 if ((!fd && !avio) || (count < 1))
330 return -1;
331
332 /* TODO: I think this is way too often; RFC 1889 has algorithm for this */
333 /* XXX: MPEG pts hardcoded. RTCP send every 0.5 seconds */
334 s->octet_count += count;
335 rtcp_bytes = ((s->octet_count - s->last_octet_count) * RTCP_TX_RATIO_NUM) /
336 RTCP_TX_RATIO_DEN;
337 rtcp_bytes /= 50; // mmu_man: that's enough for me... VLC sends much less btw !?
338 if (rtcp_bytes < 28)
339 return -1;
340 s->last_octet_count = s->octet_count;
341
342 if (!fd)
343 pb = avio;
344 else if (avio_open_dyn_buf(&pb) < 0)
345 return -1;
346
347 // Receiver Report
348 avio_w8(pb, (RTP_VERSION << 6) + 1); /* 1 report block */
349 avio_w8(pb, RTCP_RR);
350 avio_wb16(pb, 7); /* length in words - 1 */
351 // our own SSRC: we use the server's SSRC + 1 to avoid conflicts
352 avio_wb32(pb, s->ssrc + 1);
353 avio_wb32(pb, s->ssrc); // server SSRC
354 // some placeholders we should really fill...
355 // RFC 1889/p64
356 extended_max = stats->cycles + stats->max_seq;
357 expected = extended_max - stats->base_seq;
358 lost = expected - stats->received;
359 lost = FFMIN(lost, 0xffffff); // clamp it since it's only 24 bits...
360 expected_interval = expected - stats->expected_prior;
361 stats->expected_prior = expected;
362 received_interval = stats->received - stats->received_prior;
363 stats->received_prior = stats->received;
364 lost_interval = expected_interval - received_interval;
365 if (expected_interval == 0 || lost_interval <= 0)
366 fraction = 0;
367 else
368 fraction = (lost_interval << 8) / expected_interval;
369
370 fraction = (fraction << 24) | lost;
371
372 avio_wb32(pb, fraction); /* 8 bits of fraction, 24 bits of total packets lost */
373 avio_wb32(pb, extended_max); /* max sequence received */
374 avio_wb32(pb, stats->jitter >> 4); /* jitter */
375
376 if (s->last_rtcp_ntp_time == AV_NOPTS_VALUE) {
377 avio_wb32(pb, 0); /* last SR timestamp */
378 avio_wb32(pb, 0); /* delay since last SR */
379 } else {
380 uint32_t middle_32_bits = s->last_rtcp_ntp_time >> 16; // this is valid, right? do we need to handle 64 bit values special?
381 uint32_t delay_since_last = av_rescale(av_gettime_relative() - s->last_rtcp_reception_time,
382 65536, AV_TIME_BASE);
383
384 avio_wb32(pb, middle_32_bits); /* last SR timestamp */
385 avio_wb32(pb, delay_since_last); /* delay since last SR */
386 }
387
388 // CNAME
389 avio_w8(pb, (RTP_VERSION << 6) + 1); /* 1 report block */
390 avio_w8(pb, RTCP_SDES);
391 len = strlen(s->hostname);
392 avio_wb16(pb, (7 + len + 3) / 4); /* length in words - 1 */
393 avio_wb32(pb, s->ssrc + 1);
394 avio_w8(pb, 0x01);
395 avio_w8(pb, len);
396 avio_write(pb, s->hostname, len);
397 avio_w8(pb, 0); /* END */
398 // padding
399 for (len = (7 + len) % 4; len % 4; len++)
400 avio_w8(pb, 0);
401
402 avio_flush(pb);
403 if (!fd)
404 return 0;
405 len = avio_close_dyn_buf(pb, &buf);
406 if ((len > 0) && buf) {
407 int av_unused result;
408 av_log(s->ic, AV_LOG_TRACE, "sending %d bytes of RR\n", len);
409 result = ffurl_write(fd, buf, len);
410 av_log(s->ic, AV_LOG_TRACE, "result from ffurl_write: %d\n", result);
411 av_free(buf);
412 }
413 return 0;
414 }
415
416 void ff_rtp_send_punch_packets(URLContext *rtp_handle)
417 {
418 uint8_t buf[RTP_MIN_PACKET_LENGTH], *ptr = buf;
419
420 /* Send a small RTP packet */
421
422 bytestream_put_byte(&ptr, (RTP_VERSION << 6));
423 bytestream_put_byte(&ptr, 0); /* Payload type */
424 bytestream_put_be16(&ptr, 0); /* Seq */
425 bytestream_put_be32(&ptr, 0); /* Timestamp */
426 bytestream_put_be32(&ptr, 0); /* SSRC */
427
428 ffurl_write(rtp_handle, buf, ptr - buf);
429
430 /* Send a minimal RTCP RR */
431 ptr = buf;
432 bytestream_put_byte(&ptr, (RTP_VERSION << 6));
433 bytestream_put_byte(&ptr, RTCP_RR); /* receiver report */
434 bytestream_put_be16(&ptr, 1); /* length in words - 1 */
435 bytestream_put_be32(&ptr, 0); /* our own SSRC */
436
437 ffurl_write(rtp_handle, buf, ptr - buf);
438 }
439
440 static int find_missing_packets(RTPDemuxContext *s, uint16_t *first_missing,
441 uint16_t *missing_mask)
442 {
443 int i;
444 uint16_t next_seq = s->seq + 1;
445 RTPPacket *pkt = s->queue;
446
447 if (!pkt || pkt->seq == next_seq)
448 return 0;
449
450 *missing_mask = 0;
451 for (i = 1; i <= 16; i++) {
452 uint16_t missing_seq = next_seq + i;
453 while (pkt) {
454 int16_t diff = pkt->seq - missing_seq;
455 if (diff >= 0)
456 break;
457 pkt = pkt->next;
458 }
459 if (!pkt)
460 break;
461 if (pkt->seq == missing_seq)
462 continue;
463 *missing_mask |= 1 << (i - 1);
464 }
465
466 *first_missing = next_seq;
467 return 1;
468 }
469
470 int ff_rtp_send_rtcp_feedback(RTPDemuxContext *s, URLContext *fd,
471 AVIOContext *avio)
472 {
473 int len, need_keyframe, missing_packets;
474 AVIOContext *pb;
475 uint8_t *buf;
476 int64_t now;
477 uint16_t first_missing = 0, missing_mask = 0;
478
479 if (!fd && !avio)
480 return -1;
481
482 need_keyframe = s->handler && s->handler->need_keyframe &&
483 s->handler->need_keyframe(s->dynamic_protocol_context);
484 missing_packets = find_missing_packets(s, &first_missing, &missing_mask);
485
486 if (!need_keyframe && !missing_packets)
487 return 0;
488
489 /* Send new feedback if enough time has elapsed since the last
490 * feedback packet. */
491
492 now = av_gettime_relative();
493 if (s->last_feedback_time &&
494 (now - s->last_feedback_time) < MIN_FEEDBACK_INTERVAL)
495 return 0;
496 s->last_feedback_time = now;
497
498 if (!fd)
499 pb = avio;
500 else if (avio_open_dyn_buf(&pb) < 0)
501 return -1;
502
503 if (need_keyframe) {
504 avio_w8(pb, (RTP_VERSION << 6) | 1); /* PLI */
505 avio_w8(pb, RTCP_PSFB);
506 avio_wb16(pb, 2); /* length in words - 1 */
507 // our own SSRC: we use the server's SSRC + 1 to avoid conflicts
508 avio_wb32(pb, s->ssrc + 1);
509 avio_wb32(pb, s->ssrc); // server SSRC
510 }
511
512 if (missing_packets) {
513 avio_w8(pb, (RTP_VERSION << 6) | 1); /* NACK */
514 avio_w8(pb, RTCP_RTPFB);
515 avio_wb16(pb, 3); /* length in words - 1 */
516 avio_wb32(pb, s->ssrc + 1);
517 avio_wb32(pb, s->ssrc); // server SSRC
518
519 avio_wb16(pb, first_missing);
520 avio_wb16(pb, missing_mask);
521 }
522
523 avio_flush(pb);
524 if (!fd)
525 return 0;
526 len = avio_close_dyn_buf(pb, &buf);
527 if (len > 0 && buf) {
528 ffurl_write(fd, buf, len);
529 av_free(buf);
530 }
531 return 0;
532 }
533
534 static int opus_write_extradata(AVCodecParameters *codecpar)
535 {
536 uint8_t *bs;
537 int ret;
538
539 /* This function writes an extradata with a channel mapping family of 0.
540 * This mapping family only supports mono and stereo layouts. And RFC7587
541 * specifies that the number of channels in the SDP must be 2.
542 */
543 if (codecpar->ch_layout.nb_channels > 2) {
544 return AVERROR_INVALIDDATA;
545 }
546
547 ret = ff_alloc_extradata(codecpar, 19);
548 if (ret < 0)
549 return ret;
550
551 bs = (uint8_t *)codecpar->extradata;
552
553 /* Opus magic */
554 bytestream_put_buffer(&bs, "OpusHead", 8);
555 /* Version */
556 bytestream_put_byte (&bs, 0x1);
557 /* Channel count */
558 bytestream_put_byte (&bs, codecpar->ch_layout.nb_channels);
559 /* Pre skip */
560 bytestream_put_le16 (&bs, 0);
561 /* Input sample rate */
562 bytestream_put_le32 (&bs, 48000);
563 /* Output gain */
564 bytestream_put_le16 (&bs, 0x0);
565 /* Mapping family */
566 bytestream_put_byte (&bs, 0x0);
567
568 return 0;
569 }
570
571 /**
572 * open a new RTP parse context for stream 'st'. 'st' can be NULL for
573 * MPEG-2 TS streams.
574 */
575 RTPDemuxContext *ff_rtp_parse_open(AVFormatContext *s1, AVStream *st,
576 int payload_type, int queue_size)
577 {
578 RTPDemuxContext *s;
579 int ret;
580
581 s = av_mallocz(sizeof(RTPDemuxContext));
582 if (!s)
583 return NULL;
584 s->payload_type = payload_type;
585 s->last_rtcp_ntp_time = AV_NOPTS_VALUE;
586 s->first_rtcp_ntp_time = AV_NOPTS_VALUE;
587 s->ic = s1;
588 s->st = st;
589 s->queue_size = queue_size;
590
591 av_log(s->ic, AV_LOG_VERBOSE, "setting jitter buffer size to %d\n",
592 s->queue_size);
593
594 rtp_init_statistics(&s->statistics, 0);
595 if (st) {
596 switch (st->codecpar->codec_id) {
597 case AV_CODEC_ID_ADPCM_G722:
598 /* According to RFC 3551, the stream clock rate is 8000
599 * even if the sample rate is 16000. */
600 if (st->codecpar->sample_rate == 8000)
601 st->codecpar->sample_rate = 16000;
602 break;
603 case AV_CODEC_ID_OPUS:
604 ret = opus_write_extradata(st->codecpar);
605 if (ret < 0) {
606 av_log(s1, AV_LOG_ERROR,
607 "Error creating opus extradata: %s\n",
608 av_err2str(ret));
609 av_free(s);
610 return NULL;
611 }
612 break;
613 default:
614 break;
615 }
616 }
617 // needed to send back RTCP RR in RTSP sessions
618 gethostname(s->hostname, sizeof(s->hostname));
619 return s;
620 }
621
622 void ff_rtp_parse_set_dynamic_protocol(RTPDemuxContext *s, PayloadContext *ctx,
623 const RTPDynamicProtocolHandler *handler)
624 {
625 s->dynamic_protocol_context = ctx;
626 s->handler = handler;
627 }
628
629 void ff_rtp_parse_set_crypto(RTPDemuxContext *s, const char *suite,
630 const char *params)
631 {
632 if (!ff_srtp_set_crypto(&s->srtp, suite, params))
633 s->srtp_enabled = 1;
634 }
635
636 static int rtp_set_prft(RTPDemuxContext *s, AVPacket *pkt, uint32_t timestamp) {
637 int64_t rtcp_time, delta_timestamp, delta_time;
638
639 AVProducerReferenceTime *prft =
640 (AVProducerReferenceTime *) av_packet_new_side_data(
641 pkt, AV_PKT_DATA_PRFT, sizeof(AVProducerReferenceTime));
642 if (!prft)
643 return AVERROR(ENOMEM);
644
645 rtcp_time = ff_parse_ntp_time(s->last_rtcp_ntp_time) - NTP_OFFSET_US;
646 delta_timestamp = (int64_t)timestamp - (int64_t)s->last_rtcp_timestamp;
647 delta_time = av_rescale_q(delta_timestamp, s->st->time_base, AV_TIME_BASE_Q);
648
649 prft->wallclock = rtcp_time + delta_time;
650 prft->flags = 24;
651 return 0;
652 }
653
654 /**
655 * This was the second switch in rtp_parse packet.
656 * Normalizes time, if required, sets stream_index, etc.
657 */
658 static void finalize_packet(RTPDemuxContext *s, AVPacket *pkt, uint32_t timestamp)
659 {
660 if (pkt->pts != AV_NOPTS_VALUE || pkt->dts != AV_NOPTS_VALUE)
661 return; /* Timestamp already set by depacketizer */
662 if (timestamp == RTP_NOTS_VALUE)
663 return;
664
665 if (s->last_rtcp_ntp_time != AV_NOPTS_VALUE) {
666 if (rtp_set_prft(s, pkt, timestamp) < 0) {
667 av_log(s->ic, AV_LOG_WARNING, "rtpdec: failed to set prft");
668 }
669 }
670
671 if (s->last_rtcp_ntp_time != AV_NOPTS_VALUE && s->ic->nb_streams > 1) {
672 int64_t addend;
673 int delta_timestamp;
674
675 /* compute pts from timestamp with received ntp_time */
676 delta_timestamp = timestamp - s->last_rtcp_timestamp;
677 /* convert to the PTS timebase */
678 addend = av_rescale(s->last_rtcp_ntp_time - s->first_rtcp_ntp_time,
679 s->st->time_base.den,
680 (uint64_t) s->st->time_base.num << 32);
681 pkt->pts = s->range_start_offset + s->rtcp_ts_offset + addend +
682 delta_timestamp;
683 return;
684 }
685
686 if (!s->base_timestamp)
687 s->base_timestamp = timestamp;
688 /* assume that the difference is INT32_MIN < x < INT32_MAX,
689 * but allow the first timestamp to exceed INT32_MAX */
690 if (!s->timestamp)
691 s->unwrapped_timestamp += timestamp;
692 else
693 s->unwrapped_timestamp += (int32_t)(timestamp - s->timestamp);
694 s->timestamp = timestamp;
695 pkt->pts = s->unwrapped_timestamp + s->range_start_offset -
696 s->base_timestamp;
697 }
698
699 static int rtp_parse_packet_internal(RTPDemuxContext *s, AVPacket *pkt,
700 const uint8_t *buf, int len)
701 {
702 unsigned int ssrc;
703 int payload_type, seq, flags = 0;
704 int ext, csrc;
705 AVStream *st;
706 uint32_t timestamp;
707 int rv = 0;
708
709 csrc = buf[0] & 0x0f;
710 ext = buf[0] & 0x10;
711 payload_type = buf[1] & 0x7f;
712 if (buf[1] & 0x80)
713 flags |= RTP_FLAG_MARKER;
714 seq = AV_RB16(buf + 2);
715 timestamp = AV_RB32(buf + 4);
716 ssrc = AV_RB32(buf + 8);
717 /* store the ssrc in the RTPDemuxContext */
718 s->ssrc = ssrc;
719
720 /* NOTE: we can handle only one payload type */
721 if (s->payload_type != payload_type)
722 return -1;
723
724 st = s->st;
725 // only do something with this if all the rtp checks pass...
726 if (!rtp_valid_packet_in_sequence(&s->statistics, seq)) {
727 av_log(s->ic, AV_LOG_ERROR,
728 "RTP: PT=%02x: bad cseq %04x expected=%04x\n",
729 payload_type, seq, ((s->seq + 1) & 0xffff));
730 return -1;
731 }
732
733 if (buf[0] & 0x20) {
734 int padding = buf[len - 1];
735 if (len >= 12 + padding)
736 len -= padding;
737 }
738
739 s->seq = seq;
740 len -= 12;
741 buf += 12;
742
743 len -= 4 * csrc;
744 buf += 4 * csrc;
745 if (len < 0)
746 return AVERROR_INVALIDDATA;
747
748 /* RFC 3550 Section 5.3.1 RTP Header Extension handling */
749 if (ext) {
750 if (len < 4)
751 return -1;
752 /* calculate the header extension length (stored as number
753 * of 32-bit words) */
754 ext = (AV_RB16(buf + 2) + 1) << 2;
755
756 if (len < ext)
757 return -1;
758 // skip past RTP header extension
759 len -= ext;
760 buf += ext;
761 }
762
763 if (s->handler && s->handler->parse_packet) {
764 rv = s->handler->parse_packet(s->ic, s->dynamic_protocol_context,
765 s->st, pkt, &timestamp, buf, len, seq,
766 flags);
767 } else if (st) {
768 if ((rv = av_new_packet(pkt, len)) < 0)
769 return rv;
770 memcpy(pkt->data, buf, len);
771 pkt->stream_index = st->index;
772 } else {
773 return AVERROR(EINVAL);
774 }
775
776 // now perform timestamp things....
777 finalize_packet(s, pkt, timestamp);
778
779 return rv;
780 }
781
782 void ff_rtp_reset_packet_queue(RTPDemuxContext *s)
783 {
784 while (s->queue) {
785 RTPPacket *next = s->queue->next;
786 av_freep(&s->queue->buf);
787 av_freep(&s->queue);
788 s->queue = next;
789 }
790 s->seq = 0;
791 s->queue_len = 0;
792 s->prev_ret = 0;
793 }
794
795 static int enqueue_packet(RTPDemuxContext *s, uint8_t *buf, int len)
796 {
797 uint16_t seq = AV_RB16(buf + 2);
798 RTPPacket **cur = &s->queue, *packet;
799
800 /* Find the correct place in the queue to insert the packet */
801 while (*cur) {
802 int16_t diff = seq - (*cur)->seq;
803 if (diff < 0)
804 break;
805 cur = &(*cur)->next;
806 }
807
808 packet = av_mallocz(sizeof(*packet));
809 if (!packet)
810 return AVERROR(ENOMEM);
811 packet->recvtime = av_gettime_relative();
812 packet->seq = seq;
813 packet->len = len;
814 packet->buf = buf;
815 packet->next = *cur;
816 *cur = packet;
817 s->queue_len++;
818
819 return 0;
820 }
821
822 static int has_next_packet(RTPDemuxContext *s)
823 {
824 return s->queue && s->queue->seq == (uint16_t) (s->seq + 1);
825 }
826
827 int64_t ff_rtp_queued_packet_time(RTPDemuxContext *s)
828 {
829 return s->queue ? s->queue->recvtime : 0;
830 }
831
832 static int rtp_parse_queued_packet(RTPDemuxContext *s, AVPacket *pkt)
833 {
834 int rv;
835 RTPPacket *next;
836
837 if (s->queue_len <= 0)
838 return -1;
839
840 if (!has_next_packet(s)) {
841 int pkt_missed = s->queue->seq - s->seq - 1;
842
843 if (pkt_missed < 0)
844 pkt_missed += UINT16_MAX;
845 av_log(s->ic, AV_LOG_WARNING,
846 "RTP: missed %d packets\n", pkt_missed);
847 }
848
849 /* Parse the first packet in the queue, and dequeue it */
850 rv = rtp_parse_packet_internal(s, pkt, s->queue->buf, s->queue->len);
851 next = s->queue->next;
852 av_freep(&s->queue->buf);
853 av_freep(&s->queue);
854 s->queue = next;
855 s->queue_len--;
856 return rv;
857 }
858
859 static int rtp_parse_one_packet(RTPDemuxContext *s, AVPacket *pkt,
860 uint8_t **bufptr, int len)
861 {
862 uint8_t *buf = bufptr ? *bufptr : NULL;
863 int flags = 0;
864 uint32_t timestamp;
865 int rv = 0;
866
867 if (!buf) {
868 /* If parsing of the previous packet actually returned 0 or an error,
869 * there's nothing more to be parsed from that packet, but we may have
870 * indicated that we can return the next enqueued packet. */
871 if (s->prev_ret <= 0)
872 return rtp_parse_queued_packet(s, pkt);
873 /* return the next packets, if any */
874 if (s->handler && s->handler->parse_packet) {
875 /* timestamp should be overwritten by parse_packet, if not,
876 * the packet is left with pts == AV_NOPTS_VALUE */
877 timestamp = RTP_NOTS_VALUE;
878 rv = s->handler->parse_packet(s->ic, s->dynamic_protocol_context,
879 s->st, pkt, &timestamp, NULL, 0, 0,
880 flags);
881 finalize_packet(s, pkt, timestamp);
882 return rv;
883 }
884 }
885
886 if (len < 12)
887 return -1;
888
889 if ((buf[0] & 0xc0) != (RTP_VERSION << 6))
890 return -1;
891 if (RTP_PT_IS_RTCP(buf[1])) {
892 return rtcp_parse_packet(s, buf, len);
893 }
894
895 if (s->st) {
896 int64_t received = av_gettime_relative();
897 uint32_t arrival_ts = av_rescale_q(received, AV_TIME_BASE_Q,
898 s->st->time_base);
899 timestamp = AV_RB32(buf + 4);
900 // Calculate the jitter immediately, before queueing the packet
901 // into the reordering queue.
902 rtcp_update_jitter(&s->statistics, timestamp, arrival_ts);
903 }
904
905 if ((s->seq == 0 && !s->queue) || s->queue_size <= 1) {
906 /* First packet, or no reordering */
907 return rtp_parse_packet_internal(s, pkt, buf, len);
908 } else {
909 uint16_t seq = AV_RB16(buf + 2);
910 int16_t diff = seq - s->seq;
911 if (diff < 0) {
912 /* Packet older than the previously emitted one, drop */
913 av_log(s->ic, AV_LOG_WARNING,
914 "RTP: dropping old packet received too late\n");
915 return -1;
916 } else if (diff <= 1) {
917 /* Correct packet */
918 rv = rtp_parse_packet_internal(s, pkt, buf, len);
919 return rv;
920 } else {
921 /* Still missing some packet, enqueue this one. */
922 rv = enqueue_packet(s, buf, len);
923 if (rv < 0)
924 return rv;
925 *bufptr = NULL;
926 /* Return the first enqueued packet if the queue is full,
927 * even if we're missing something */
928 if (s->queue_len >= s->queue_size) {
929 av_log(s->ic, AV_LOG_WARNING, "jitter buffer full\n");
930 return rtp_parse_queued_packet(s, pkt);
931 }
932 return -1;
933 }
934 }
935 }
936
937 /**
938 * Parse an RTP or RTCP packet directly sent as a buffer.
939 * @param s RTP parse context.
940 * @param pkt returned packet
941 * @param bufptr pointer to the input buffer or NULL to read the next packets
942 * @param len buffer len
943 * @return 0 if a packet is returned, 1 if a packet is returned and more can follow
944 * (use buf as NULL to read the next). -1 if no packet (error or no more packet).
945 */
946 int ff_rtp_parse_packet(RTPDemuxContext *s, AVPacket *pkt,
947 uint8_t **bufptr, int len)
948 {
949 int rv;
950 if (s->srtp_enabled && bufptr && ff_srtp_decrypt(&s->srtp, *bufptr, &len) < 0)
951 return -1;
952 rv = rtp_parse_one_packet(s, pkt, bufptr, len);
953 s->prev_ret = rv;
954 while (rv < 0 && has_next_packet(s))
955 rv = rtp_parse_queued_packet(s, pkt);
956 return rv ? rv : has_next_packet(s);
957 }
958
959 void ff_rtp_parse_close(RTPDemuxContext *s)
960 {
961 ff_rtp_reset_packet_queue(s);
962 ff_srtp_free(&s->srtp);
963 av_free(s);
964 }
965
966 int ff_parse_fmtp(AVFormatContext *s,
967 AVStream *stream, PayloadContext *data, const char *p,
968 int (*parse_fmtp)(AVFormatContext *s,
969 AVStream *stream,
970 PayloadContext *data,
971 const char *attr, const char *value))
972 {
973 char attr[256];
974 char *value;
975 int res;
976 int value_size = strlen(p) + 1;
977
978 if (!(value = av_malloc(value_size))) {
979 av_log(s, AV_LOG_ERROR, "Failed to allocate data for FMTP.\n");
980 return AVERROR(ENOMEM);
981 }
982
983 // remove protocol identifier
984 while (*p && *p == ' ')
985 p++; // strip spaces
986 while (*p && *p != ' ')
987 p++; // eat protocol identifier
988 while (*p && *p == ' ')
989 p++; // strip trailing spaces
990
991 while (ff_rtsp_next_attr_and_value(&p,
992 attr, sizeof(attr),
993 value, value_size)) {
994 res = parse_fmtp(s, stream, data, attr, value);
995 if (res < 0 && res != AVERROR_PATCHWELCOME) {
996 av_free(value);
997 return res;
998 }
999 }
1000 av_free(value);
1001 return 0;
1002 }
1003
1004 int ff_rtp_finalize_packet(AVPacket *pkt, AVIOContext **dyn_buf, int stream_idx)
1005 {
1006 int ret;
1007 av_packet_unref(pkt);
1008
1009 pkt->size = avio_close_dyn_buf(*dyn_buf, &pkt->data);
1010 pkt->stream_index = stream_idx;
1011 *dyn_buf = NULL;
1012 if ((ret = av_packet_from_data(pkt, pkt->data, pkt->size)) < 0) {
1013 av_freep(&pkt->data);
1014 return ret;
1015 }
1016 return pkt->size;
1017 }
1018