[PATCH] osmo-bts[master]: Fix DTX DL AMR SIDscheduling logic

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/gerrit-log@lists.osmocom.org/.

Max gerrit-no-reply at lists.osmocom.org
Fri Oct 21 14:35:09 UTC 2016


Review at  https://gerrit.osmocom.org/1144

Fix DTX DL AMR SIDscheduling logic

Previously SID UPDATE was sometimes scheduled incorrectly. Fix this by:
* avoid rounding error when computing scheduling time difference from FN
* properly saving and updating cached SID type and FN

Change-Id: I7acffae4792e7bddc2ae19a2f04ee921dc194c36
Related: OS#1801
---
M src/common/msg_utils.c
1 file changed, 14 insertions(+), 9 deletions(-)


  git pull ssh://gerrit.osmocom.org:29418/osmo-bts refs/changes/44/1144/1

diff --git a/src/common/msg_utils.c b/src/common/msg_utils.c
index f00a71a..8769060 100644
--- a/src/common/msg_utils.c
+++ b/src/common/msg_utils.c
@@ -116,8 +116,11 @@
 				ARRAY_SIZE(lchan->tch.dtx.cache) - amr);
 
 	lchan->tch.dtx.len = copy_len + amr;
-	lchan->tch.dtx.fn = fn;
-	lchan->tch.dtx.is_update = update;
+	/* SID FIRST is special because it's both sent and cached: */
+	if (update == 0) {
+		lchan->tch.dtx.fn = fn;
+		lchan->tch.dtx.is_update = false; /* Mark SID FIRST explicitly */
+	}
 
 	memcpy(lchan->tch.dtx.cache + amr, l1_payload, copy_len);
 }
@@ -128,6 +131,7 @@
  *  \param[in] rtp_pl_len length of rtp_pl
  *  \param[in] fn Frame Number for which we check scheduling
  *  \param[in] l1_payload buffer where CMR and CMI prefix should be added
+ *  \param[in] marker RTP Marker bit
  *  \param[out] len Length of expected L1 payload
  *  \param[out] ft_out Frame Type to be populated after decoding
  *  \returns 0 in case of success; negative on error
@@ -219,18 +223,18 @@
 static inline bool dtx_amr_sid_optional(const struct gsm_lchan *lchan,
 					uint32_t fn)
 {
-	/* Compute approx. time delta based on Fn duration */
-	uint32_t delta = GSM_FN_TO_MS(fn - lchan->tch.dtx.fn);
+	/* Compute approx. time delta x26 based on Fn duration */
+	uint32_t dx26 = 120 * (fn - lchan->tch.dtx.fn);
 
-	/* according to 3GPP TS 26.093 A.5.1.1: */
-	if (lchan->tch.dtx.is_update) {
-		/* SID UPDATE should be repeated every 8th RTP frame */
-		if (delta < GSM_RTP_FRAME_DURATION_MS * 8)
+	/* according to 3GPP TS 26.093 A.5.1.1:
+	   (*26) to avoid float math, add 1 FN tolerance (-120) */
+	if (lchan->tch.dtx.is_update) { /* SID UPDATE: every 8th RTP frame */
+		if (dx26 < GSM_RTP_FRAME_DURATION_MS * 8 * 26 - 120)
 			return true;
 		return false;
 	}
 	/* 3rd frame after SID FIRST should be SID UPDATE */
-	if (delta < GSM_RTP_FRAME_DURATION_MS * 3)
+	if (dx26 < GSM_RTP_FRAME_DURATION_MS * 3 * 26 - 120)
 		return true;
 	return false;
 }
@@ -288,6 +292,7 @@
 	if (lchan->tch.dtx.len) {
 		memcpy(dst, lchan->tch.dtx.cache, lchan->tch.dtx.len);
 		lchan->tch.dtx.fn = fn;
+		lchan->tch.dtx.is_update = true; /* SID UPDATE sent */
 		return lchan->tch.dtx.len + 1;
 	}
 

-- 
To view, visit https://gerrit.osmocom.org/1144
To unsubscribe, visit https://gerrit.osmocom.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I7acffae4792e7bddc2ae19a2f04ee921dc194c36
Gerrit-PatchSet: 1
Gerrit-Project: osmo-bts
Gerrit-Branch: master
Gerrit-Owner: Max <msuraev at sysmocom.de>



More information about the gerrit-log mailing list