|
|
|
@ -321,7 +321,7 @@ struct rtpengine_target {
|
|
|
|
|
unsigned int last_pt; // index into pt_input[] and pt_output[]
|
|
|
|
|
|
|
|
|
|
spinlock_t ssrc_stats_lock;
|
|
|
|
|
struct rtpengine_ssrc_stats ssrc_stats[RTPE_NUM_SSRC_TRACKING];
|
|
|
|
|
struct ssrc_stats ssrc_stats[RTPE_NUM_SSRC_TRACKING];
|
|
|
|
|
|
|
|
|
|
struct re_crypto_context decrypt_rtp;
|
|
|
|
|
struct re_crypto_context decrypt_rtcp;
|
|
|
|
@ -1864,9 +1864,9 @@ static void target_retrieve_stats(struct rtpengine_target *g, struct rtpengine_s
|
|
|
|
|
i->ssrc[u] = g->target.ssrc[u];
|
|
|
|
|
i->ssrc_stats[u] = g->ssrc_stats[u];
|
|
|
|
|
|
|
|
|
|
g->ssrc_stats[u].packets = 0;
|
|
|
|
|
g->ssrc_stats[u].bytes = 0;
|
|
|
|
|
g->ssrc_stats[u].total_lost = 0;
|
|
|
|
|
atomic64_set(&g->ssrc_stats[u].packets, 0);
|
|
|
|
|
atomic64_set(&g->ssrc_stats[u].bytes, 0);
|
|
|
|
|
atomic_set(&g->ssrc_stats[u].total_lost, 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (u = 0; u < g->target.num_destinations; u++) {
|
|
|
|
@ -5212,7 +5212,7 @@ static void rtp_stats(struct rtpengine_target *g, struct rtp_parsed *rtp, s64 ar
|
|
|
|
|
int ssrc_idx)
|
|
|
|
|
{
|
|
|
|
|
unsigned long flags;
|
|
|
|
|
struct rtpengine_ssrc_stats *s = &g->ssrc_stats[ssrc_idx];
|
|
|
|
|
struct ssrc_stats *s = &g->ssrc_stats[ssrc_idx];
|
|
|
|
|
uint16_t old_seq_trunc;
|
|
|
|
|
uint32_t last_seq;
|
|
|
|
|
uint16_t seq_diff;
|
|
|
|
@ -5224,15 +5224,15 @@ static void rtp_stats(struct rtpengine_target *g, struct rtp_parsed *rtp, s64 ar
|
|
|
|
|
uint16_t seq = ntohs(rtp->rtp_header->seq_num);
|
|
|
|
|
uint32_t ts = ntohl(rtp->rtp_header->timestamp);
|
|
|
|
|
|
|
|
|
|
spin_lock_irqsave(&g->ssrc_stats_lock, flags);
|
|
|
|
|
atomic64_inc(&s->packets);
|
|
|
|
|
atomic64_add(rtp->payload_len, &s->bytes);
|
|
|
|
|
atomic_set(&s->timestamp, ts);
|
|
|
|
|
|
|
|
|
|
s->packets++;
|
|
|
|
|
s->bytes += rtp->payload_len;
|
|
|
|
|
s->timestamp = ts;
|
|
|
|
|
spin_lock_irqsave(&g->ssrc_stats_lock, flags);
|
|
|
|
|
|
|
|
|
|
// track sequence numbers and lost frames
|
|
|
|
|
|
|
|
|
|
last_seq = s->ext_seq;
|
|
|
|
|
last_seq = atomic_read(&s->ext_seq);
|
|
|
|
|
new_seq = last_seq;
|
|
|
|
|
|
|
|
|
|
// old seq or seq reset?
|
|
|
|
@ -5243,7 +5243,7 @@ static void rtp_stats(struct rtpengine_target *g, struct rtp_parsed *rtp, s64 ar
|
|
|
|
|
else if (seq_diff > 0x100) {
|
|
|
|
|
// reset seq and loss tracker
|
|
|
|
|
new_seq = seq;
|
|
|
|
|
s->ext_seq = seq;
|
|
|
|
|
atomic_set(&s->ext_seq, seq);
|
|
|
|
|
s->lost_bits = -1;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
@ -5255,19 +5255,19 @@ static void rtp_stats(struct rtpengine_target *g, struct rtp_parsed *rtp, s64 ar
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
seq_diff = new_seq - last_seq;
|
|
|
|
|
s->ext_seq = new_seq;
|
|
|
|
|
atomic_set(&s->ext_seq, new_seq);
|
|
|
|
|
|
|
|
|
|
// shift loss tracker bit field and count losses
|
|
|
|
|
if (seq_diff >= (sizeof(s->lost_bits) * 8)) {
|
|
|
|
|
// complete loss
|
|
|
|
|
s->total_lost += sizeof(s->lost_bits) * 8;
|
|
|
|
|
atomic_add(sizeof(s->lost_bits) * 8, &s->total_lost);
|
|
|
|
|
s->lost_bits = -1;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
while (seq_diff) {
|
|
|
|
|
// shift out one bit and see if we lost it
|
|
|
|
|
if ((s->lost_bits & 0x80000000) == 0)
|
|
|
|
|
s->total_lost++;
|
|
|
|
|
atomic_inc(&s->total_lost);
|
|
|
|
|
s->lost_bits <<= 1;
|
|
|
|
|
seq_diff--;
|
|
|
|
|
}
|
|
|
|
@ -5283,15 +5283,15 @@ static void rtp_stats(struct rtpengine_target *g, struct rtp_parsed *rtp, s64 ar
|
|
|
|
|
// RFC 3550 A.8
|
|
|
|
|
clockrate = g->target.pt_stats[pt_idx]->clock_rate;
|
|
|
|
|
transit = ((uint32_t) (div64_s64(arrival_time, 1000) * clockrate) / 1000) - ts;
|
|
|
|
|
d = 0;
|
|
|
|
|
if (s->transit)
|
|
|
|
|
d = transit - s->transit;
|
|
|
|
|
s->transit = transit;
|
|
|
|
|
d = atomic_read(&s->transit);
|
|
|
|
|
if (d)
|
|
|
|
|
d = transit - d;
|
|
|
|
|
atomic_set(&s->transit, transit);
|
|
|
|
|
if (d < 0)
|
|
|
|
|
d = -d;
|
|
|
|
|
// ignore implausibly large values
|
|
|
|
|
if (d < 100000)
|
|
|
|
|
s->jitter += d - ((s->jitter + 8) >> 4);
|
|
|
|
|
atomic_add(d - ((atomic_read(&s->jitter) + 8) >> 4), &s->jitter);
|
|
|
|
|
|
|
|
|
|
spin_unlock_irqrestore(&g->ssrc_stats_lock, flags);
|
|
|
|
|
}
|
|
|
|
|