mgcp/rtp: Fix transit computation units
Currently micro-secs and RTP rate get mixed when the transit value is
computed in mgcp_patch_and_count().
This patch changes get_current_ts() to accept the desired rate as
argument and to use it for the time conversion instead of always
converting to microseconds. If microseconds are needed,
get_current_ts(1000) can be used.
The arrival_time is now measured in 1/rtp_end->rate seconds so that
it can be directly compared to RTP timestamps as required by RFC3550
(section 6.4.1, see definition of 'interarrival jitter').
Sponsored-by: On-Waves ehf
diff --git a/openbsc/src/libmgcp/mgcp_network.c b/openbsc/src/libmgcp/mgcp_network.c
index b55ac04..39d5807 100644
--- a/openbsc/src/libmgcp/mgcp_network.c
+++ b/openbsc/src/libmgcp/mgcp_network.c
@@ -95,22 +95,25 @@
/**
* This does not need to be a precision timestamp and
* is allowed to wrap quite fast. The returned value is
- * milli seconds now.
+ * 1/unit seconds.
*/
-uint32_t get_current_ts(void)
+static uint32_t get_current_ts(unsigned unit)
{
struct timespec tp;
uint64_t ret;
+ if (!unit)
+ return 0;
+
memset(&tp, 0, sizeof(tp));
if (clock_gettime(CLOCK_MONOTONIC, &tp) != 0)
LOGP(DMGCP, LOGL_NOTICE,
"Getting the clock failed.\n");
- /* convert it to useconds */
+ /* convert it to 1/unit seconds */
ret = tp.tv_sec;
- ret *= 1000;
- ret += tp.tv_nsec / 1000 / 1000;
+ ret *= unit;
+ ret += (int64_t)tp.tv_nsec * unit / 1000 / 1000 / 1000;
return ret;
}
@@ -370,7 +373,7 @@
rtp_hdr = (struct rtp_hdr *) data;
seq = ntohs(rtp_hdr->sequence);
timestamp = ntohl(rtp_hdr->timestamp);
- arrival_time = get_current_ts();
+ arrival_time = get_current_ts(rtp_end->rate);
ssrc = ntohl(rtp_hdr->ssrc);
if (!state->initialized) {
@@ -491,9 +494,10 @@
}
/*
- * calculate the jitter between the two packages. The TS should be
+ * Calculate the jitter between the two packages. The TS should be
* taken closer to the read function. This was taken from the
- * Appendix A of RFC 3550. The local timestamp has a usec resolution.
+ * Appendix A of RFC 3550. Timestamp and arrival_time have a 1/rate
+ * resolution.
*/
transit = arrival_time - timestamp;
d = transit - state->transit;