|
|
|
@ -4257,6 +4257,7 @@ static void rtp_stats(struct rtpengine_target *g, struct rtp_parsed *rtp, s64 ar |
|
|
|
uint32_t clockrate; |
|
|
|
uint32_t transit; |
|
|
|
int32_t d; |
|
|
|
uint32_t new_seq; |
|
|
|
|
|
|
|
uint16_t seq = ntohs(rtp->header->seq_num); |
|
|
|
uint32_t ts = ntohl(rtp->header->timestamp); |
|
|
|
@ -4270,6 +4271,7 @@ static void rtp_stats(struct rtpengine_target *g, struct rtp_parsed *rtp, s64 ar |
|
|
|
// track sequence numbers and lost frames |
|
|
|
|
|
|
|
last_seq = s->ext_seq; |
|
|
|
new_seq = last_seq; |
|
|
|
|
|
|
|
// old seq or seq reset? |
|
|
|
old_seq_trunc = last_seq & 0xffff; |
|
|
|
@ -4278,18 +4280,19 @@ 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; |
|
|
|
s->lost_bits = -1; |
|
|
|
} |
|
|
|
else { |
|
|
|
// seq wrap? |
|
|
|
uint32_t new_seq = (last_seq & 0xffff0000) | seq; |
|
|
|
new_seq = (last_seq & 0xffff0000) | seq; |
|
|
|
while (new_seq < last_seq) { |
|
|
|
new_seq += 0x10000; |
|
|
|
if ((new_seq & 0xffff0000) == 0) // ext seq wrapped |
|
|
|
break; |
|
|
|
} |
|
|
|
seq_diff = new_seq - s->ext_seq; |
|
|
|
seq_diff = new_seq - last_seq; |
|
|
|
s->ext_seq = new_seq; |
|
|
|
|
|
|
|
// shift loss tracker bit field and count losses |
|
|
|
@ -4310,7 +4313,7 @@ static void rtp_stats(struct rtpengine_target *g, struct rtp_parsed *rtp, s64 ar |
|
|
|
} |
|
|
|
|
|
|
|
// track this frame as being seen |
|
|
|
seq_diff = (s->ext_seq & 0xffff) - seq; |
|
|
|
seq_diff = (new_seq & 0xffff) - seq; |
|
|
|
if (seq_diff < (sizeof(s->lost_bits) * 8)) |
|
|
|
s->lost_bits |= (1 << seq_diff); |
|
|
|
|
|
|
|
|