[PATCH 06/10] mgcp/rtp: Compute default packet duration at state initialisiation

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 Dec 5 16:44:21 UTC 2013


This patch adds a packet_duration field to mgcp_rtp_state which
contains the RTP packet's duration in RTP timestamp units or 0, when
the duration is unknown or not fixed.

Sponsored-by: On-Waves ehf
---
 openbsc/include/openbsc/mgcp_internal.h |    1 +
 openbsc/src/libmgcp/mgcp_network.c      |   23 +++++++++++++----------
 2 files changed, 14 insertions(+), 10 deletions(-)

diff --git a/openbsc/include/openbsc/mgcp_internal.h b/openbsc/include/openbsc/mgcp_internal.h
index 02e193d..b16bd49 100644
--- a/openbsc/include/openbsc/mgcp_internal.h
+++ b/openbsc/include/openbsc/mgcp_internal.h
@@ -59,6 +59,7 @@ struct mgcp_rtp_state {
 	int cycles;
 
 	int32_t  timestamp_offset;
+	uint32_t packet_duration;
 	uint32_t jitter;
 	int32_t transit;
 
diff --git a/openbsc/src/libmgcp/mgcp_network.c b/openbsc/src/libmgcp/mgcp_network.c
index c14b913..f177339 100644
--- a/openbsc/src/libmgcp/mgcp_network.c
+++ b/openbsc/src/libmgcp/mgcp_network.c
@@ -236,15 +236,19 @@ void mgcp_patch_and_count(struct mgcp_endpoint *endp, struct mgcp_rtp_state *sta
 		state->initialized = 1;
 		state->jitter = 0;
 		state->transit = arrival_time - timestamp;
+		state->packet_duration =
+			rtp_end->rate * rtp_end->frames_per_packet *
+			rtp_end->frame_duration_num /
+			rtp_end->frame_duration_den;
 		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",
+			"pkt-duration: %d, from %s:%d in %d\n",
 			ENDPOINT_NUMBER(endp), state->in_stream.ssrc,
-			state->seq_offset,
+			state->seq_offset, state->packet_duration,
 			inet_ntoa(addr->sin_addr), ntohs(addr->sin_port),
 			endp->conn_mode);
 	} else if (state->in_stream.ssrc != rtp_hdr->ssrc) {
@@ -260,15 +264,14 @@ void mgcp_patch_and_count(struct mgcp_endpoint *endp, struct mgcp_rtp_state *sta
 		if (rtp_end->force_constant_ssrc) {
 			int32_t tsdelta = state->out_stream.last_tsdelta;
 			if (tsdelta == 0) {
-				tsdelta = rtp_end->rate * rtp_end->frames_per_packet *
-					rtp_end->frame_duration_num /
-					rtp_end->frame_duration_den;
+				tsdelta = state->packet_duration;
 				LOGP(DMGCP, LOGL_NOTICE,
-				     "Computed timestamp delta %d based on "
-				     "rate %d, num frames %d, frame duration %d/%d\n",
-				     tsdelta, rtp_end->rate, rtp_end->frames_per_packet,
-				     rtp_end->frame_duration_num,
-				     rtp_end->frame_duration_den);
+				     "Timestamp delta is not available on 0x%x, "
+				     "using packet duration instead: %d "
+				     "from %s:%d in %d\n",
+				     ENDPOINT_NUMBER(endp), tsdelta,
+				     inet_ntoa(addr->sin_addr), ntohs(addr->sin_port),
+				     endp->conn_mode);
 			}
 			state->seq_offset =
 				(state->out_stream.last_seq + 1) - seq;
-- 
1.7.9.5





More information about the OpenBSC mailing list