[PATCH 4/5] mgcp/rtp: Compute delta timestamp based on wallclock

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
Thu Jan 30 20:01:35 UTC 2014


Currently, when the SSRC changes within a stream and SSRC fixing is
enabled, the RTP timestamp between the last packet the has been
received with the old SSRC and the first packet of the new SSRC
is always incremented by one packet duration.
This can lead to audio muting (at least with the nanoBTS) when the
wallclock interval between these packets is too large (> 1s).

This patch change the implementation to base the RTP timestamp offset
on the wallclock interval that has passed between these two packets.

Ticket: OW#466
Sponsored-by: On-Waves ehf
---
 openbsc/include/openbsc/mgcp_internal.h |    1 +
 openbsc/src/libmgcp/mgcp_network.c      |   12 ++++++++++--
 openbsc/tests/mgcp/mgcp_test.ok         |   16 ++++++++--------
 3 files changed, 19 insertions(+), 10 deletions(-)

diff --git a/openbsc/include/openbsc/mgcp_internal.h b/openbsc/include/openbsc/mgcp_internal.h
index 28ea678..9b97165 100644
--- a/openbsc/include/openbsc/mgcp_internal.h
+++ b/openbsc/include/openbsc/mgcp_internal.h
@@ -46,6 +46,7 @@ struct mgcp_rtp_stream_state {
 	uint32_t last_timestamp;
 	uint32_t err_ts_counter;
 	int32_t last_tsdelta;
+	uint32_t last_arrival_time;
 };
 
 struct mgcp_rtp_state {
diff --git a/openbsc/src/libmgcp/mgcp_network.c b/openbsc/src/libmgcp/mgcp_network.c
index 39d5807..5363fb8 100644
--- a/openbsc/src/libmgcp/mgcp_network.c
+++ b/openbsc/src/libmgcp/mgcp_network.c
@@ -415,10 +415,17 @@ void mgcp_patch_and_count(struct mgcp_endpoint *endp, struct mgcp_rtp_state *sta
 
 		state->in_stream.ssrc = ssrc;
 		if (rtp_end->force_constant_ssrc) {
-			const int16_t delta_seq = 1;
+			int16_t delta_seq;
 
+			/* Always increment seqno by 1 */
 			state->seq_offset =
-				(state->out_stream.last_seq + delta_seq) - seq;
+				(state->out_stream.last_seq + 1) - seq;
+
+			/* Estimate number of packets that would have been sent */
+			delta_seq =
+				(arrival_time - state->in_stream.last_arrival_time
+				 + state->packet_duration/2) /
+				state->packet_duration;
 
 			adjust_rtp_timestamp_offset(endp, state, rtp_end, addr,
 						    delta_seq, timestamp);
@@ -452,6 +459,7 @@ void mgcp_patch_and_count(struct mgcp_endpoint *endp, struct mgcp_rtp_state *sta
 	/* Save before patching */
 	state->in_stream.last_timestamp = timestamp;
 	state->in_stream.last_seq = seq;
+	state->in_stream.last_arrival_time = arrival_time;
 
 	if (rtp_end->force_aligned_timing &&
 	    state->out_stream.ssrc == ssrc && state->packet_duration)
diff --git a/openbsc/tests/mgcp/mgcp_test.ok b/openbsc/tests/mgcp/mgcp_test.ok
index 7883574..e383fb5 100644
--- a/openbsc/tests/mgcp/mgcp_test.ok
+++ b/openbsc/tests/mgcp/mgcp_test.ok
@@ -167,14 +167,14 @@ In TS: 36888, dTS: 160, Seq: 25
 Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
 Stats: Jitter = 27, Transit = 4294967216
 In TS: 160000, dTS: 0, Seq: 1000
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 765, Transit = 11760
+Out TS change: 12000, dTS: 12000, Seq change: 1, TS Err change: in +0, out +0
+Stats: Jitter = 25, Transit = 4294967216
 In TS: 160160, dTS: 160, Seq: 1001
 Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 718, Transit = 11759
+Stats: Jitter = 24, Transit = 4294967215
 In TS: 160320, dTS: 160, Seq: 1002
 Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 673, Transit = 11759
+Stats: Jitter = 22, Transit = 4294967215
 Testing packet error detection.
 Output SSRC changed to 11223344
 In TS: 0, dTS: 0, Seq: 0
@@ -447,12 +447,12 @@ In TS: 36888, dTS: 160, Seq: 25
 Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
 Stats: Jitter = 25, Transit = 4294967136
 In TS: 160000, dTS: 0, Seq: 1000
-Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 763, Transit = 11680
+Out TS change: 12000, dTS: 12000, Seq change: 1, TS Err change: in +0, out +0
+Stats: Jitter = 23, Transit = 4294967136
 In TS: 160160, dTS: 160, Seq: 1001
 Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 716, Transit = 11679
+Stats: Jitter = 22, Transit = 4294967135
 In TS: 160320, dTS: 160, Seq: 1002
 Out TS change: 160, dTS: 160, Seq change: 1, TS Err change: in +0, out +0
-Stats: Jitter = 671, Transit = 11679
+Stats: Jitter = 21, Transit = 4294967135
 Done
-- 
1.7.9.5





More information about the OpenBSC mailing list