Fixed RTCP packet lost calculation (#3653)

This commit is contained in:
sauwming 2023-08-31 08:13:36 +08:00 committed by GitHub
parent 013c30304d
commit ee5879bda9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 29 additions and 17 deletions

View File

@ -369,26 +369,36 @@ PJ_DEF(void) pjmedia_rtcp_rx_rtp2(pjmedia_rtcp_session *sess,
return;
}
/* Only mark "good" packets */
++sess->received;
/* Only mark "good" packets. Do this after we're no longer in probation. */
if (!seq_st.status.flag.probation)
++sess->received;
/* Calculate loss periods. */
if (seq_st.diff > 1) {
unsigned count = seq_st.diff - 1;
unsigned period;
/* Calculate packet lost and loss periods. */
if (!seq_st.status.flag.probation && !seq_st.status.flag.outorder) {
unsigned count = 0, loss = 0;
pj_uint32_t last_seq, expected;
period = count * sess->dec_pkt_size * 1000 / sess->clock_rate;
period *= 1000;
last_seq = sess->seq_ctrl.max_seq +
(sess->seq_ctrl.cycles & 0xFFFF0000L);
expected = last_seq - sess->seq_ctrl.base_seq;
/* Update packet lost.
* The packet lost number will also be updated when we're sending
* outbound RTCP RR.
*/
sess->stat.rx.loss += (seq_st.diff - 1);
TRACE_((sess->name, "%d packet(s) lost", seq_st.diff - 1));
if (expected > sess->received)
loss = expected - sess->received;
if (loss > sess->stat.rx.loss)
count = loss - sess->stat.rx.loss;
sess->stat.rx.loss = loss;
/* Update loss period stat */
pj_math_stat_update(&sess->stat.rx.loss_period, period);
if (count > 0) {
unsigned period;
TRACE_((sess->name, "%d packet(s) lost", count));
period = count * sess->dec_pkt_size * 1000 / sess->clock_rate;
period *= 1000;
pj_math_stat_update(&sess->stat.rx.loss_period, period);
}
}

View File

@ -315,6 +315,7 @@ void pjmedia_rtp_seq_update( pjmedia_rtp_seq_session *sess,
/* Init status */
st.status.value = 0;
st.status.flag.probation = 0;
st.diff = 0;
/*
@ -325,13 +326,14 @@ void pjmedia_rtp_seq_update( pjmedia_rtp_seq_session *sess,
st.status.flag.probation = -1;
if (seq == sess->max_seq+ 1) {
if (seq == (pj_uint16_t)(sess->max_seq + 1)) {
/* packet is in sequence */
st.diff = 1;
sess->probation--;
sess->max_seq = seq;
if (sess->probation == 0) {
st.status.flag.probation = 0;
/* Init base seq, as per the RFC 3550. */
sess->base_seq = seq;
}
} else {