33 #define MIN_FEEDBACK_INTERVAL 200000
58 rtp_first_dynamic_payload_handler = handler;
102 for (handler = rtp_first_dynamic_payload_handler;
103 handler; handler = handler->
next)
114 for (handler = rtp_first_dynamic_payload_handler;
115 handler; handler = handler->
next)
131 if (payload_len < 20) {
133 "Invalid length for RTCP SR packet\n");
158 #define RTP_SEQ_MOD (1 << 16)
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;
207 }
else if (udelta < MAX_DROPOUT) {
209 if (seq < s->max_seq) {
232 uint32_t arrival_timestamp)
235 uint32_t transit = arrival_timestamp - sent_timestamp;
236 uint32_t prev_transit = s->
transit;
237 int32_t d = transit - prev_transit;
258 uint32_t extended_max;
259 uint32_t expected_interval;
260 uint32_t received_interval;
265 if ((!fd && !avio) || (count < 1))
293 expected = extended_max - stats->
base_seq;
295 lost =
FFMIN(lost, 0xffffff);
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;
335 for (len = (7 + len) % 4; len % 4; len++)
342 if ((len > 0) && buf) {
344 av_dlog(s->
ic,
"sending %d bytes of RR\n", len);
346 av_dlog(s->
ic,
"result from ffurl_write: %d\n", result);
370 if ((len > 0) && buf)
385 if ((len > 0) && buf)
391 uint16_t *missing_mask)
394 uint16_t next_seq = s->
seq + 1;
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;
423 int len, need_keyframe, missing_packets;
427 uint16_t first_missing = 0, missing_mask = 0;
436 if (!need_keyframe && !missing_packets)
462 if (missing_packets) {
477 if (len > 0 && buf) {
489 int payload_type,
int queue_size)
577 int payload_type, seq,
flags = 0;
583 csrc = buf[0] & 0x0f;
585 payload_type = buf[1] & 0x7f;
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)
628 ext = (
AV_RB16(buf + 2) + 1) << 2;
639 s->
st, pkt, ×tamp, buf, len, seq,
644 memcpy(pkt->
data, buf, len);
671 uint16_t seq =
AV_RB16(buf + 2);
676 int16_t diff = seq - (*cur)->
seq;
714 "RTP: missed %d packets\n", s->
queue->
seq - s->
seq - 1);
746 s->
st, pkt, ×tamp,
NULL, 0, 0,
776 uint16_t seq =
AV_RB16(buf + 2);
777 int16_t diff = seq - s->
seq;
781 "RTP: dropping old packet received too late\n");
783 }
else if (diff <= 1) {
834 char *attr,
char *value))
839 int value_size = strlen(p) + 1;
847 while (*p && *p ==
' ')
849 while (*p && *p !=
' ')
851 while (*p && *p ==
' ')
856 value, value_size)) {
857 res =
parse_fmtp(s, stream, data, attr, value);
int queue_size
The size of queue, or 0 if reordering is disabled.
void ff_rtp_parse_set_crypto(RTPDemuxContext *s, const char *suite, const char *params)
void * av_malloc(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
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...
int avio_close_dyn_buf(AVIOContext *s, uint8_t **pbuffer)
Return the written size and a pointer to the buffer.
int ff_parse_fmtp(AVFormatContext *s, AVStream *stream, PayloadContext *data, const char *p, int(*parse_fmtp)(AVFormatContext *s, AVStream *stream, PayloadContext *data, char *attr, char *value))
#define AV_LOG_WARNING
Something somehow does not look correct.
static void rtcp_update_jitter(RTPStatistics *s, uint32_t sent_timestamp, uint32_t arrival_timestamp)
int ffurl_write(URLContext *h, const unsigned char *buf, int size)
Write size bytes from buf to the resource accessed by h.
int64_t range_start_offset
int prev_ret
Fields for packet reordering.
RTP/JPEG specific private data.
int64_t last_feedback_time
unsigned int last_octet_count
static int rtp_parse_packet_internal(RTPDemuxContext *s, AVPacket *pkt, const uint8_t *buf, int len)
RTPPacket * queue
A sorted queue of buffered packets not yet returned.
int index
stream index in AVFormatContext
#define RTCP_TX_RATIO_NUM
const RTPDynamicProtocolHandler * handler
enum AVMediaType codec_type
static int rtcp_parse_packet(RTPDemuxContext *s, const unsigned char *buf, int len)
av_dlog(ac->avr,"%d samples - audio_convert: %s to %s (%s)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt), use_generic?ac->func_descr_generic:ac->func_descr)
RTPDynamicProtocolHandler ff_amr_wb_dynamic_handler
uint32_t cycles
shifted count of sequence number cycles
#define RTCP_TX_RATIO_DEN
static RTPDynamicProtocolHandler speex_dynamic_handler
int avio_open_dyn_buf(AVIOContext **s)
Open a write only memory stream.
static int find_missing_packets(RTPDemuxContext *s, uint16_t *first_missing, uint16_t *missing_mask)
enum AVMediaType codec_type
RTPDemuxContext * ff_rtp_parse_open(AVFormatContext *s1, AVStream *st, int payload_type, int queue_size)
open a new RTP parse context for stream 'st'.
void av_freep(void *arg)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc() and set the pointer ...
PayloadContext * dynamic_protocol_context
uint32_t base_seq
base sequence number
void ff_srtp_free(struct SRTPContext *s)
void ff_rtp_reset_packet_queue(RTPDemuxContext *s)
int av_packet_from_data(AVPacket *pkt, uint8_t *data, int size)
Initialize a reference-counted packet from av_malloc()ed data.
int ff_rtsp_next_attr_and_value(const char **p, char *attr, int attr_size, char *value, int value_size)
void ff_register_rtp_dynamic_payload_handlers(void)
static int rtp_parse_queued_packet(RTPDemuxContext *s, AVPacket *pkt)
bitstream reader API header.
void avio_write(AVIOContext *s, const unsigned char *buf, int size)
uint32_t expected_prior
packets expected in last interval
static int parse_fmtp(AVFormatContext *s, AVStream *stream, PayloadContext *data, char *attr, char *value)
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
int av_new_packet(AVPacket *pkt, int size)
Allocate the payload of a packet and initialize its fields with default values.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
void av_free(void *ptr)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc(). ...
#define RTP_FLAG_MARKER
RTP marker bit was set for this packet.
int probation
sequence packets till source is valid
static void rtp_init_sequence(RTPStatistics *s, uint16_t seq)
void av_log(void *avcl, int level, const char *fmt,...)
DynamicPayloadPacketHandlerProc parse_packet
Parse handler for this dynamic packet.
RTPDynamicProtocolHandler * ff_rtp_handler_find_by_id(int id, enum AVMediaType codec_type)
AVCodecContext * codec
Codec context associated with this stream.
uint32_t transit
relative transit time for previous packet
uint32_t jitter
estimated jitter.
int queue_len
The number of packets in queue.
unsigned int nb_streams
Number of elements in AVFormatContext.streams.
int void avio_flush(AVIOContext *s)
int ff_srtp_decrypt(struct SRTPContext *s, uint8_t *buf, int *lenptr)
int64_t av_rescale(int64_t a, int64_t b, int64_t c)
Rescale a 64-bit integer with rounding to nearest.
int64_t first_rtcp_ntp_time
#define AV_TIME_BASE
Internal time base represented as integer.
int av_strcasecmp(const char *a, const char *b)
static RTPDynamicProtocolHandler * rtp_first_dynamic_payload_handler
int64_t last_rtcp_ntp_time
void ff_rtp_parse_set_dynamic_protocol(RTPDemuxContext *s, PayloadContext *ctx, RTPDynamicProtocolHandler *handler)
int64_t av_gettime(void)
Get the current time in microseconds.
int ff_rtp_send_rtcp_feedback(RTPDemuxContext *s, URLContext *fd, AVIOContext *avio)
uint32_t received
packets received
#define AVERROR_PATCHWELCOME
Not yet implemented in Libav, patches welcome.
int64_t last_rtcp_reception_time
#define AV_TIME_BASE_Q
Internal time base represented as fractional value.
int sample_rate
samples per second
static int rtp_parse_one_packet(RTPDemuxContext *s, AVPacket *pkt, uint8_t **bufptr, int len)
int64_t unwrapped_timestamp
uint32_t last_rtcp_timestamp
static int has_next_packet(RTPDemuxContext *s)
void ff_register_dynamic_payload_handler(RTPDynamicProtocolHandler *handler)
void avio_w8(AVIOContext *s, int b)
RTPStatistics statistics
Statistics for this stream (used by RTCP receiver reports)
uint32_t received_prior
packets received in last interval
uint32_t bad_seq
last bad sequence number + 1
int64_t ff_rtp_queued_packet_time(RTPDemuxContext *s)
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...
static void finalize_packet(RTPDemuxContext *s, AVPacket *pkt, uint32_t timestamp)
This was the second switch in rtp_parse packet.
uint16_t max_seq
highest sequence number seen
#define RTP_PT_IS_RTCP(x)
void avio_wb16(AVIOContext *s, unsigned int val)
static RTPDynamicProtocolHandler realmedia_mp3_dynamic_handler
RTPDynamicProtocolHandler * ff_rtp_handler_find_by_name(const char *name, enum AVMediaType codec_type)
void av_init_packet(AVPacket *pkt)
Initialize optional fields of a packet with default values.
int ff_rtp_finalize_packet(AVPacket *pkt, AVIOContext **dyn_buf, int stream_idx)
Close the dynamic buffer and make a packet from it.
int ff_srtp_set_crypto(struct SRTPContext *s, const char *suite, const char *params)
void ff_rtp_parse_close(RTPDemuxContext *s)
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed...
void avio_wb32(AVIOContext *s, unsigned int val)
unbuffered private I/O API
static void rtp_init_statistics(RTPStatistics *s, uint16_t base_sequence)
int(* need_keyframe)(PayloadContext *context)
static RTPDynamicProtocolHandler opus_dynamic_handler
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented...
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.
RTPDynamicProtocolHandler ff_amr_nb_dynamic_handler
This structure stores compressed data.
void * av_mallocz(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
static int rtp_valid_packet_in_sequence(RTPStatistics *s, uint16_t seq)
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
#define AV_NOPTS_VALUE
Undefined timestamp value.
#define MIN_FEEDBACK_INTERVAL
struct RTPDynamicProtocolHandler * next
static void enqueue_packet(RTPDemuxContext *s, uint8_t *buf, int len)