mgcp/rtp: Fix output timing error counter

The tsdelta computation and error detection didn't handle the
intialisation phase properly.

This patches fixes this by skipping the output timing validation
when the SSRCs don't match.

Sponsored-by: On-Waves ehf
This commit is contained in:
Jacob Erlbeck 2013-11-29 11:16:07 +01:00
parent 83c0523739
commit 55ba140da1
2 changed files with 32 additions and 21 deletions

View File

@ -237,6 +237,16 @@ void mgcp_patch_and_count(struct mgcp_endpoint *endp, struct mgcp_rtp_state *sta
state->jitter = 0;
state->transit = arrival_time - timestamp;
state->out_stream = state->in_stream;
state->out_stream.last_timestamp = timestamp;
/* force output SSRC change */
state->out_stream.ssrc = rtp_hdr->ssrc - 1;
LOGP(DMGCP, LOGL_INFO,
"Initializing stream on 0x%x SSRC: %u timestamp: %u "
"from %s:%d in %d\n",
ENDPOINT_NUMBER(endp), state->in_stream.ssrc,
state->seq_offset,
inet_ntoa(addr->sin_addr), ntohs(addr->sin_port),
endp->conn_mode);
} else if (state->in_stream.ssrc != rtp_hdr->ssrc) {
int32_t tsdelta = state->out_stream.last_tsdelta;
if (tsdelta == 0) {
@ -286,9 +296,10 @@ void mgcp_patch_and_count(struct mgcp_endpoint *endp, struct mgcp_rtp_state *sta
}
/* Check again, whether the timestamps are still valid */
check_rtp_timestamp(endp, &state->out_stream, rtp_end, addr,
seq, timestamp, "output",
&state->out_stream.last_tsdelta);
if (state->out_stream.ssrc == rtp_hdr->ssrc)
check_rtp_timestamp(endp, &state->out_stream, rtp_end, addr,
seq, timestamp, "output",
&state->out_stream.last_tsdelta);
/*
* The below takes the shape of the validation from Appendix A. Check

View File

@ -80,15 +80,15 @@ TS: 1400, dTS: 120, TS Errs: in 4, out 4
TS: 1560, dTS: 160, TS Errs: in 5, out 5
TS: 1720, dTS: 160, TS Errs: in 5, out 5
Output SSRC changed to 10203040
TS: 34688, dTS: 32968, TS Errs: in 5, out 6
TS: 34848, dTS: 160, TS Errs: in 5, out 7
TS: 35008, dTS: 160, TS Errs: in 5, out 7
TS: 35128, dTS: 120, TS Errs: in 6, out 8
TS: 35288, dTS: 160, TS Errs: in 7, out 9
TS: 35448, dTS: 160, TS Errs: in 7, out 9
TS: 35768, dTS: 160, TS Errs: in 7, out 9
TS: 35928, dTS: 160, TS Errs: in 7, out 9
TS: 36088, dTS: 160, TS Errs: in 8, out 10
TS: 34688, dTS: 160, TS Errs: in 5, out 5
TS: 34848, dTS: 160, TS Errs: in 5, out 5
TS: 35008, dTS: 160, TS Errs: in 5, out 5
TS: 35128, dTS: 120, TS Errs: in 6, out 6
TS: 35288, dTS: 160, TS Errs: in 7, out 7
TS: 35448, dTS: 160, TS Errs: in 7, out 7
TS: 35768, dTS: 160, TS Errs: in 7, out 7
TS: 35928, dTS: 160, TS Errs: in 7, out 7
TS: 36088, dTS: 160, TS Errs: in 8, out 8
Testing packet error detection, patch timestamps.
Output SSRC changed to 11223344
TS: 0, dTS: 0, TS Errs: in 0, out 0
@ -104,15 +104,15 @@ TS: 1400, dTS: 120, TS Errs: in 4, out 4
TS: 1560, dTS: 160, TS Errs: in 5, out 5
TS: 1720, dTS: 160, TS Errs: in 5, out 5
Output SSRC changed to 10203040
TS: 34688, dTS: 32968, TS Errs: in 5, out 6
TS: 34848, dTS: 160, TS Errs: in 5, out 7
TS: 35008, dTS: 160, TS Errs: in 5, out 7
TS: 35128, dTS: 120, TS Errs: in 6, out 8
TS: 35288, dTS: 160, TS Errs: in 7, out 9
TS: 35448, dTS: 160, TS Errs: in 7, out 9
TS: 35768, dTS: 160, TS Errs: in 7, out 9
TS: 35928, dTS: 160, TS Errs: in 7, out 9
TS: 36088, dTS: 160, TS Errs: in 8, out 10
TS: 34688, dTS: 160, TS Errs: in 5, out 5
TS: 34848, dTS: 160, TS Errs: in 5, out 5
TS: 35008, dTS: 160, TS Errs: in 5, out 5
TS: 35128, dTS: 120, TS Errs: in 6, out 6
TS: 35288, dTS: 160, TS Errs: in 7, out 7
TS: 35448, dTS: 160, TS Errs: in 7, out 7
TS: 35768, dTS: 160, TS Errs: in 7, out 7
TS: 35928, dTS: 160, TS Errs: in 7, out 7
TS: 36088, dTS: 160, TS Errs: in 8, out 8
Testing packet error detection, patch SSRC, patch timestamps.
Output SSRC changed to 11223344
TS: 0, dTS: 0, TS Errs: in 0, out 0