|
|
|
@@ -228,6 +228,24 @@ static int rtp_valid_packet_in_sequence(RTPStatistics *s, uint16_t seq) |
|
|
|
return 1; |
|
|
|
} |
|
|
|
|
|
|
|
static void rtcp_update_jitter(RTPStatistics *s, uint32_t sent_timestamp, |
|
|
|
uint32_t arrival_timestamp) |
|
|
|
{ |
|
|
|
// Most of this is pretty straight from RFC 3550 appendix A.8 |
|
|
|
uint32_t transit = arrival_timestamp - sent_timestamp; |
|
|
|
uint32_t prev_transit = s->transit; |
|
|
|
int32_t d = transit - prev_transit; |
|
|
|
// Doing the FFABS() call directly on the "transit - prev_transit" |
|
|
|
// expression doesn't work, since it's an unsigned expression. Doing the |
|
|
|
// transit calculation in unsigned is desired though, since it most |
|
|
|
// probably will need to wrap around. |
|
|
|
d = FFABS(d); |
|
|
|
s->transit = transit; |
|
|
|
if (!prev_transit) |
|
|
|
return; |
|
|
|
s->jitter += d - (int32_t) ((s->jitter + 8) >> 4); |
|
|
|
} |
|
|
|
|
|
|
|
int ff_rtp_check_and_send_back_rr(RTPDemuxContext *s, URLContext *fd, |
|
|
|
AVIOContext *avio, int count) |
|
|
|
{ |
|
|
|
@@ -812,6 +830,16 @@ static int rtp_parse_one_packet(RTPDemuxContext *s, AVPacket *pkt, |
|
|
|
return rtcp_parse_packet(s, buf, len); |
|
|
|
} |
|
|
|
|
|
|
|
if (s->st) { |
|
|
|
int64_t received = av_gettime(); |
|
|
|
uint32_t arrival_ts = av_rescale_q(received, AV_TIME_BASE_Q, |
|
|
|
s->st->time_base); |
|
|
|
timestamp = AV_RB32(buf + 4); |
|
|
|
// Calculate the jitter immediately, before queueing the packet |
|
|
|
// into the reordering queue. |
|
|
|
rtcp_update_jitter(&s->statistics, timestamp, arrival_ts); |
|
|
|
} |
|
|
|
|
|
|
|
if ((s->seq == 0 && !s->queue) || s->queue_size <= 1) { |
|
|
|
/* First packet, or no reordering */ |
|
|
|
return rtp_parse_packet_internal(s, pkt, buf, len); |
|
|
|
|