3 * Copyright (c) 2002 Fabrice Bellard
5 * This file is part of Libav.
7 * Libav 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.
12 * Libav 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.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with Libav; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 #include "libavutil/mathematics.h"
23 #include "libavutil/avstring.h"
24 #include "libavutil/time.h"
25 #include "libavcodec/get_bits.h"
31 #include "rtpdec_formats.h"
33 #define MIN_FEEDBACK_INTERVAL 200000 /* 200 ms in us */
35 static RTPDynamicProtocolHandler realmedia_mp3_dynamic_handler
= {
36 .enc_name
= "X-MP3-draft-00",
37 .codec_type
= AVMEDIA_TYPE_AUDIO
,
38 .codec_id
= AV_CODEC_ID_MP3ADU
,
41 static RTPDynamicProtocolHandler speex_dynamic_handler
= {
43 .codec_type
= AVMEDIA_TYPE_AUDIO
,
44 .codec_id
= AV_CODEC_ID_SPEEX
,
47 static RTPDynamicProtocolHandler opus_dynamic_handler
= {
49 .codec_type
= AVMEDIA_TYPE_AUDIO
,
50 .codec_id
= AV_CODEC_ID_OPUS
,
53 static RTPDynamicProtocolHandler
*rtp_first_dynamic_payload_handler
= NULL
;
55 void ff_register_dynamic_payload_handler(RTPDynamicProtocolHandler
*handler
)
57 handler
->next
= rtp_first_dynamic_payload_handler
;
58 rtp_first_dynamic_payload_handler
= handler
;
61 void av_register_rtp_dynamic_payload_handlers(void)
63 ff_register_dynamic_payload_handler(&ff_amr_nb_dynamic_handler
);
64 ff_register_dynamic_payload_handler(&ff_amr_wb_dynamic_handler
);
65 ff_register_dynamic_payload_handler(&ff_g726_16_dynamic_handler
);
66 ff_register_dynamic_payload_handler(&ff_g726_24_dynamic_handler
);
67 ff_register_dynamic_payload_handler(&ff_g726_32_dynamic_handler
);
68 ff_register_dynamic_payload_handler(&ff_g726_40_dynamic_handler
);
69 ff_register_dynamic_payload_handler(&ff_h263_1998_dynamic_handler
);
70 ff_register_dynamic_payload_handler(&ff_h263_2000_dynamic_handler
);
71 ff_register_dynamic_payload_handler(&ff_h263_rfc2190_dynamic_handler
);
72 ff_register_dynamic_payload_handler(&ff_h264_dynamic_handler
);
73 ff_register_dynamic_payload_handler(&ff_ilbc_dynamic_handler
);
74 ff_register_dynamic_payload_handler(&ff_jpeg_dynamic_handler
);
75 ff_register_dynamic_payload_handler(&ff_mp4a_latm_dynamic_handler
);
76 ff_register_dynamic_payload_handler(&ff_mp4v_es_dynamic_handler
);
77 ff_register_dynamic_payload_handler(&ff_mpeg_audio_dynamic_handler
);
78 ff_register_dynamic_payload_handler(&ff_mpeg_video_dynamic_handler
);
79 ff_register_dynamic_payload_handler(&ff_mpeg4_generic_dynamic_handler
);
80 ff_register_dynamic_payload_handler(&ff_mpegts_dynamic_handler
);
81 ff_register_dynamic_payload_handler(&ff_ms_rtp_asf_pfv_handler
);
82 ff_register_dynamic_payload_handler(&ff_ms_rtp_asf_pfa_handler
);
83 ff_register_dynamic_payload_handler(&ff_qcelp_dynamic_handler
);
84 ff_register_dynamic_payload_handler(&ff_qdm2_dynamic_handler
);
85 ff_register_dynamic_payload_handler(&ff_qt_rtp_aud_handler
);
86 ff_register_dynamic_payload_handler(&ff_qt_rtp_vid_handler
);
87 ff_register_dynamic_payload_handler(&ff_quicktime_rtp_aud_handler
);
88 ff_register_dynamic_payload_handler(&ff_quicktime_rtp_vid_handler
);
89 ff_register_dynamic_payload_handler(&ff_svq3_dynamic_handler
);
90 ff_register_dynamic_payload_handler(&ff_theora_dynamic_handler
);
91 ff_register_dynamic_payload_handler(&ff_vorbis_dynamic_handler
);
92 ff_register_dynamic_payload_handler(&ff_vp8_dynamic_handler
);
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
);
98 RTPDynamicProtocolHandler
*ff_rtp_handler_find_by_name(const char *name
,
99 enum AVMediaType codec_type
)
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
)
110 RTPDynamicProtocolHandler
*ff_rtp_handler_find_by_id(int id
,
111 enum AVMediaType codec_type
)
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
)
122 static int rtcp_parse_packet(RTPDemuxContext
*s
, const unsigned char *buf
,
127 payload_len
= FFMIN(len
, (AV_RB16(buf
+ 2) + 1) * 4);
131 if (payload_len
< 20) {
132 av_log(NULL
, AV_LOG_ERROR
,
133 "Invalid length for RTCP SR packet\n");
134 return AVERROR_INVALIDDATA
;
137 s
->last_rtcp_reception_time
= av_gettime();
138 s
->last_rtcp_ntp_time
= AV_RB64(buf
+ 8);
139 s
->last_rtcp_timestamp
= AV_RB32(buf
+ 16);
140 if (s
->first_rtcp_ntp_time
== AV_NOPTS_VALUE
) {
141 s
->first_rtcp_ntp_time
= s
->last_rtcp_ntp_time
;
142 if (!s
->base_timestamp
)
143 s
->base_timestamp
= s
->last_rtcp_timestamp
;
144 s
->rtcp_ts_offset
= s
->last_rtcp_timestamp
- s
->base_timestamp
;
158 #define RTP_SEQ_MOD (1 << 16)
160 static void rtp_init_statistics(RTPStatistics
*s
, uint16_t base_sequence
)
162 memset(s
, 0, sizeof(RTPStatistics
));
163 s
->max_seq
= base_sequence
;
168 * Called whenever there is a large jump in sequence numbers,
169 * or when they get out of probation...
171 static void rtp_init_sequence(RTPStatistics
*s
, uint16_t seq
)
175 s
->base_seq
= seq
- 1;
176 s
->bad_seq
= RTP_SEQ_MOD
+ 1;
178 s
->expected_prior
= 0;
179 s
->received_prior
= 0;
184 /* Returns 1 if we should handle this packet. */
185 static int rtp_valid_packet_in_sequence(RTPStatistics
*s
, uint16_t seq
)
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;
192 /* source not valid until MIN_SEQUENTIAL packets with sequence
193 * seq. numbers have been received */
195 if (seq
== s
->max_seq
+ 1) {
198 if (s
->probation
== 0) {
199 rtp_init_sequence(s
, seq
);
204 s
->probation
= MIN_SEQUENTIAL
- 1;
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
;
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
);
221 s
->bad_seq
= (seq
+ 1) & (RTP_SEQ_MOD
- 1);
225 // duplicate or reordered packet...
231 static void rtcp_update_jitter(RTPStatistics
*s
, uint32_t sent_timestamp
,
232 uint32_t arrival_timestamp
)
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.
243 s
->transit
= transit
;
246 s
->jitter
+= d
- (int32_t) ((s
->jitter
+ 8) >> 4);
249 int ff_rtp_check_and_send_back_rr(RTPDemuxContext
*s
, URLContext
*fd
,
250 AVIOContext
*avio
, int count
)
256 RTPStatistics
*stats
= &s
->statistics
;
258 uint32_t extended_max
;
259 uint32_t expected_interval
;
260 uint32_t received_interval
;
261 int32_t lost_interval
;
265 if ((!fd
&& !avio
) || (count
< 1))
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 !?
276 s
->last_octet_count
= s
->octet_count
;
280 else if (avio_open_dyn_buf(&pb
) < 0)
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...
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)
304 fraction
= (lost_interval
<< 8) / expected_interval
;
306 fraction
= (fraction
<< 24) | lost
;
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 */
312 if (s
->last_rtcp_ntp_time
== AV_NOPTS_VALUE
) {
313 avio_wb32(pb
, 0); /* last SR timestamp */
314 avio_wb32(pb
, 0); /* delay since last SR */
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
);
320 avio_wb32(pb
, middle_32_bits
); /* last SR timestamp */
321 avio_wb32(pb
, delay_since_last
); /* delay since last SR */
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);
332 avio_write(pb
, s
->hostname
, len
);
333 avio_w8(pb
, 0); /* END */
335 for (len
= (7 + len
) % 4; len
% 4; len
++)
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
);
352 void ff_rtp_send_punch_packets(URLContext
*rtp_handle
)
358 /* Send a small RTP packet */
359 if (avio_open_dyn_buf(&pb
) < 0)
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 */
369 len
= avio_close_dyn_buf(pb
, &buf
);
370 if ((len
> 0) && buf
)
371 ffurl_write(rtp_handle
, buf
, len
);
374 /* Send a minimal RTCP RR */
375 if (avio_open_dyn_buf(&pb
) < 0)
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 */
384 len
= avio_close_dyn_buf(pb
, &buf
);
385 if ((len
> 0) && buf
)
386 ffurl_write(rtp_handle
, buf
, len
);
390 static int find_missing_packets(RTPDemuxContext
*s
, uint16_t *first_missing
,
391 uint16_t *missing_mask
)
394 uint16_t next_seq
= s
->seq
+ 1;
395 RTPPacket
*pkt
= s
->queue
;
397 if (!pkt
|| pkt
->seq
== next_seq
)
401 for (i
= 1; i
<= 16; i
++) {
402 uint16_t missing_seq
= next_seq
+ i
;
404 int16_t diff
= pkt
->seq
- missing_seq
;
411 if (pkt
->seq
== missing_seq
)
413 *missing_mask
|= 1 << (i
- 1);
416 *first_missing
= next_seq
;
420 int ff_rtp_send_rtcp_feedback(RTPDemuxContext
*s
, URLContext
*fd
,
423 int len
, need_keyframe
, missing_packets
;
427 uint16_t first_missing
= 0, missing_mask
= 0;
432 need_keyframe
= s
->handler
&& s
->handler
->need_keyframe
&&
433 s
->handler
->need_keyframe(s
->dynamic_protocol_context
);
434 missing_packets
= find_missing_packets(s
, &first_missing
, &missing_mask
);
436 if (!need_keyframe
&& !missing_packets
)
439 /* Send new feedback if enough time has elapsed since the last
440 * feedback packet. */
443 if (s
->last_feedback_time
&&
444 (now
- s
->last_feedback_time
) < MIN_FEEDBACK_INTERVAL
)
446 s
->last_feedback_time
= now
;
450 else if (avio_open_dyn_buf(&pb
) < 0)
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
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
469 avio_wb16(pb
, first_missing
);
470 avio_wb16(pb
, missing_mask
);
476 len
= avio_close_dyn_buf(pb
, &buf
);
477 if (len
> 0 && buf
) {
478 ffurl_write(fd
, buf
, len
);
485 * open a new RTP parse context for stream 'st'. 'st' can be NULL for
488 RTPDemuxContext
*ff_rtp_parse_open(AVFormatContext
*s1
, AVStream
*st
,
489 int payload_type
, int queue_size
)
493 s
= av_mallocz(sizeof(RTPDemuxContext
));
496 s
->payload_type
= payload_type
;
497 s
->last_rtcp_ntp_time
= AV_NOPTS_VALUE
;
498 s
->first_rtcp_ntp_time
= AV_NOPTS_VALUE
;
501 s
->queue_size
= queue_size
;
502 rtp_init_statistics(&s
->statistics
, 0);
504 switch (st
->codec
->codec_id
) {
505 case AV_CODEC_ID_ADPCM_G722
:
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;
515 // needed to send back RTCP RR in RTSP sessions
516 gethostname(s
->hostname
, sizeof(s
->hostname
));
520 void ff_rtp_parse_set_dynamic_protocol(RTPDemuxContext
*s
, PayloadContext
*ctx
,
521 RTPDynamicProtocolHandler
*handler
)
523 s
->dynamic_protocol_context
= ctx
;
524 s
->handler
= handler
;
527 void ff_rtp_parse_set_crypto(RTPDemuxContext
*s
, const char *suite
,
530 if (!ff_srtp_set_crypto(&s
->srtp
, suite
, params
))
535 * This was the second switch in rtp_parse packet.
536 * Normalizes time, if required, sets stream_index, etc.
538 static void finalize_packet(RTPDemuxContext
*s
, AVPacket
*pkt
, uint32_t timestamp
)
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
)
545 if (s
->last_rtcp_ntp_time
!= AV_NOPTS_VALUE
&& s
->ic
->nb_streams
> 1) {
549 /* compute pts from timestamp with received ntp_time */
550 delta_timestamp
= timestamp
- s
->last_rtcp_timestamp
;
551 /* convert to the PTS timebase */
552 addend
= av_rescale(s
->last_rtcp_ntp_time
- s
->first_rtcp_ntp_time
,
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
+
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 */
565 s
->unwrapped_timestamp
+= timestamp
;
567 s
->unwrapped_timestamp
+= (int32_t)(timestamp
- s
->timestamp
);
568 s
->timestamp
= timestamp
;
569 pkt
->pts
= s
->unwrapped_timestamp
+ s
->range_start_offset
-
573 static int rtp_parse_packet_internal(RTPDemuxContext
*s
, AVPacket
*pkt
,
574 const uint8_t *buf
, int len
)
577 int payload_type
, seq
, flags
= 0;
583 csrc
= buf
[0] & 0x0f;
585 payload_type
= buf
[1] & 0x7f;
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 */
594 /* NOTE: we can handle only one payload type */
595 if (s
->payload_type
!= payload_type
)
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));
608 int padding
= buf
[len
- 1];
609 if (len
>= 12 + padding
)
620 return AVERROR_INVALIDDATA
;
622 /* RFC 3550 Section 5.3.1 RTP Header Extension handling */
626 /* calculate the header extension length (stored as number
627 * of 32-bit words) */
628 ext
= (AV_RB16(buf
+ 2) + 1) << 2;
632 // skip past RTP header extension
637 if (s
->handler
&& s
->handler
->parse_packet
) {
638 rv
= s
->handler
->parse_packet(s
->ic
, s
->dynamic_protocol_context
,
639 s
->st
, pkt
, ×tamp
, buf
, len
, seq
,
642 if ((rv
= av_new_packet(pkt
, len
)) < 0)
644 memcpy(pkt
->data
, buf
, len
);
645 pkt
->stream_index
= st
->index
;
647 return AVERROR(EINVAL
);
650 // now perform timestamp things....
651 finalize_packet(s
, pkt
, timestamp
);
656 void ff_rtp_reset_packet_queue(RTPDemuxContext
*s
)
659 RTPPacket
*next
= s
->queue
->next
;
660 av_free(s
->queue
->buf
);
669 static void enqueue_packet(RTPDemuxContext
*s
, uint8_t *buf
, int len
)
671 uint16_t seq
= AV_RB16(buf
+ 2);
672 RTPPacket
**cur
= &s
->queue
, *packet
;
674 /* Find the correct place in the queue to insert the packet */
676 int16_t diff
= seq
- (*cur
)->seq
;
682 packet
= av_mallocz(sizeof(*packet
));
685 packet
->recvtime
= av_gettime();
694 static int has_next_packet(RTPDemuxContext
*s
)
696 return s
->queue
&& s
->queue
->seq
== (uint16_t) (s
->seq
+ 1);
699 int64_t ff_rtp_queued_packet_time(RTPDemuxContext
*s
)
701 return s
->queue
? s
->queue
->recvtime
: 0;
704 static int rtp_parse_queued_packet(RTPDemuxContext
*s
, AVPacket
*pkt
)
709 if (s
->queue_len
<= 0)
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);
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
);
726 static int rtp_parse_one_packet(RTPDemuxContext
*s
, AVPacket
*pkt
,
727 uint8_t **bufptr
, int len
)
729 uint8_t *buf
= bufptr
? *bufptr
: NULL
;
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
;
745 rv
= s
->handler
->parse_packet(s
->ic
, s
->dynamic_protocol_context
,
746 s
->st
, pkt
, ×tamp
, NULL
, 0, 0,
748 finalize_packet(s
, pkt
, timestamp
);
756 if ((buf
[0] & 0xc0) != (RTP_VERSION
<< 6))
758 if (RTP_PT_IS_RTCP(buf
[1])) {
759 return rtcp_parse_packet(s
, buf
, len
);
763 int64_t received
= av_gettime();
764 uint32_t arrival_ts
= av_rescale_q(received
, AV_TIME_BASE_Q
,
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
);
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
);
776 uint16_t seq
= AV_RB16(buf
+ 2);
777 int16_t diff
= seq
- s
->seq
;
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");
783 } else if (diff
<= 1) {
785 rv
= rtp_parse_packet_internal(s
, pkt
, buf
, len
);
788 /* Still missing some packet, enqueue this one. */
789 enqueue_packet(s
, buf
, len
);
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
);
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).
809 int ff_rtp_parse_packet(RTPDemuxContext
*s
, AVPacket
*pkt
,
810 uint8_t **bufptr
, int len
)
813 if (s
->srtp_enabled
&& bufptr
&& ff_srtp_decrypt(&s
->srtp
, *bufptr
, &len
) < 0)
815 rv
= rtp_parse_one_packet(s
, pkt
, bufptr
, len
);
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
);
822 void ff_rtp_parse_close(RTPDemuxContext
*s
)
824 ff_rtp_reset_packet_queue(s
);
825 ff_srtp_free(&s
->srtp
);
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
))
837 int value_size
= strlen(p
) + 1;
839 if (!(value
= av_malloc(value_size
))) {
840 av_log(NULL
, AV_LOG_ERROR
, "Failed to allocate data for FMTP.");
841 return AVERROR(ENOMEM
);
844 // remove protocol identifier
845 while (*p
&& *p
== ' ')
847 while (*p
&& *p
!= ' ')
848 p
++; // eat protocol identifier
849 while (*p
&& *p
== ' ')
850 p
++; // strip trailing spaces
852 while (ff_rtsp_next_attr_and_value(&p
,
854 value
, value_size
)) {
855 res
= parse_fmtp(stream
, data
, attr
, value
);
856 if (res
< 0 && res
!= AVERROR_PATCHWELCOME
) {
865 int ff_rtp_finalize_packet(AVPacket
*pkt
, AVIOContext
**dyn_buf
, int stream_idx
)
870 pkt
->size
= avio_close_dyn_buf(*dyn_buf
, &pkt
->data
);
871 pkt
->stream_index
= stream_idx
;
873 if ((ret
= av_packet_from_data(pkt
, pkt
->data
, pkt
->size
)) < 0) {
874 av_freep(&pkt
->data
);