[PATCH 6/6] mgcp: Fix RTP timestamps if enabled

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/OpenBSC@lists.osmocom.org/.

Jacob Erlbeck jerlbeck at sysmocom.de
Tue Dec 3 16:17:09 UTC 2013


This forces the output timing to fulfill
   dTS = dSegNo * fixedPacketDuration
where dSegNo = seqNo - lastSeqNo.

If timestamp patching is enabled, the output timestamp will be set
to lastTimestamp + dTS. This kind of relative updating is used to
handle seqNo- and timestamp-wraparounds properly.

Ticket: OW#1065
Sponsored-by: On-Waves ehf
---
 openbsc/src/libmgcp/mgcp_network.c |   21 ++++++++++++++++
 openbsc/tests/mgcp/mgcp_test.ok    |   48 ++++++++++++++++++------------------
 2 files changed, 45 insertions(+), 24 deletions(-)

diff --git a/openbsc/src/libmgcp/mgcp_network.c b/openbsc/src/libmgcp/mgcp_network.c
index b9bfc5e..a68c43c 100644
--- a/openbsc/src/libmgcp/mgcp_network.c
+++ b/openbsc/src/libmgcp/mgcp_network.c
@@ -308,6 +308,27 @@ void mgcp_patch_and_count(struct mgcp_endpoint *endp, struct mgcp_rtp_state *sta
 	state->in_stream.last_timestamp = timestamp;
 	state->in_stream.last_seq = seq;
 
+	if (rtp_end->force_constant_timing &&
+	    state->out_stream.ssrc == ssrc && state->packet_duration) {
+		int delta_seq = seq + state->seq_offset - state->out_stream.last_seq;
+		int timestamp_offset =
+			state->out_stream.last_timestamp - timestamp +
+			delta_seq * state->packet_duration;
+		if (state->timestamp_offset != timestamp_offset) {
+			state->timestamp_offset = timestamp_offset;
+			state->patch = 1;
+
+			LOGP(DMGCP, LOGL_NOTICE,
+			     "Timestamp patching enabled on 0x%x SSRC: %u "
+			     "SeqNo delta: %d, TS offset: %d, "
+			     "from %s:%d in %d\n",
+			     ENDPOINT_NUMBER(endp), state->in_stream.ssrc,
+			     delta_seq, state->timestamp_offset,
+			     inet_ntoa(addr->sin_addr), ntohs(addr->sin_port),
+			     endp->conn_mode);
+		}
+	}
+
 	/* apply the offset and store it back to the packet */
 	if (state->patch) {
 		seq += state->seq_offset;
diff --git a/openbsc/tests/mgcp/mgcp_test.ok b/openbsc/tests/mgcp/mgcp_test.ok
index 71293ad..c018fb2 100644
--- a/openbsc/tests/mgcp/mgcp_test.ok
+++ b/openbsc/tests/mgcp/mgcp_test.ok
@@ -78,32 +78,32 @@ Testing packet error detection, patch timestamps.
 TS: 0, dTS: 0, TS Errs: in 0, out 0
 TS: 160, dTS: 160, TS Errs: in 0, out 0
 TS: 320, dTS: 160, TS Errs: in 0, out 0
-TS: 320, dTS: 160, TS Errs: in 1, out 1
-TS: 480, dTS: 160, TS Errs: in 1, out 1
-TS: 640, dTS: 160, TS Errs: in 1, out 1
-TS: 960, dTS: 320, TS Errs: in 2, out 2
-TS: 1120, dTS: 160, TS Errs: in 3, out 3
-TS: 1280, dTS: 160, TS Errs: in 3, out 3
-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
-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: 480, dTS: 160, TS Errs: in 1, out 0
+TS: 640, dTS: 160, TS Errs: in 1, out 0
+TS: 800, dTS: 160, TS Errs: in 1, out 0
+TS: 960, dTS: 160, TS Errs: in 2, out 0
+TS: 1120, dTS: 160, TS Errs: in 3, out 0
+TS: 1280, dTS: 160, TS Errs: in 3, out 0
+TS: 1440, dTS: 160, TS Errs: in 4, out 0
+TS: 1600, dTS: 160, TS Errs: in 5, out 0
+TS: 1760, dTS: 160, TS Errs: in 5, out 0
+TS: 34728, dTS: 160, TS Errs: in 5, out 0
+TS: 34888, dTS: 160, TS Errs: in 5, out 0
+TS: 35048, dTS: 160, TS Errs: in 5, out 0
 Testing packet error detection, patch SSRC, patch timestamps.
 TS: 0, dTS: 0, TS Errs: in 0, out 0
 TS: 160, dTS: 160, TS Errs: in 0, out 0
 TS: 320, dTS: 160, TS Errs: in 0, out 0
-TS: 320, dTS: 160, TS Errs: in 1, out 1
-TS: 480, dTS: 160, TS Errs: in 1, out 1
-TS: 640, dTS: 160, TS Errs: in 1, out 1
-TS: 960, dTS: 320, TS Errs: in 2, out 2
-TS: 1120, dTS: 160, TS Errs: in 3, out 3
-TS: 1280, dTS: 160, TS Errs: in 3, out 3
-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
-TS: 1880, dTS: 160, TS Errs: in 5, out 5
-TS: 2040, dTS: 160, TS Errs: in 5, out 5
-TS: 2200, dTS: 160, TS Errs: in 5, out 5
+TS: 480, dTS: 160, TS Errs: in 1, out 0
+TS: 640, dTS: 160, TS Errs: in 1, out 0
+TS: 800, dTS: 160, TS Errs: in 1, out 0
+TS: 960, dTS: 160, TS Errs: in 2, out 0
+TS: 1120, dTS: 160, TS Errs: in 3, out 0
+TS: 1280, dTS: 160, TS Errs: in 3, out 0
+TS: 1440, dTS: 160, TS Errs: in 4, out 0
+TS: 1600, dTS: 160, TS Errs: in 5, out 0
+TS: 1760, dTS: 160, TS Errs: in 5, out 0
+TS: 1920, dTS: 160, TS Errs: in 5, out 0
+TS: 2080, dTS: 160, TS Errs: in 5, out 0
+TS: 2240, dTS: 160, TS Errs: in 5, out 0
 Done
-- 
1.7.9.5





More information about the OpenBSC mailing list