[PATCH] osmo-bts[master]: Use libosmocodec for AMR RTP

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
Thu Jun 9 15:54:38 UTC 2016


Hello Neels Hofmeyr, Harald Welte, Jenkins Builder,

I'd like you to reexamine a change.  Please visit

    https://gerrit.osmocom.org/204

to look at the new patch set (#4).

Use libosmocodec for AMR RTP

Use libosmocodec function to parse RTP with AMR payload in sysmoBTS and
LC15. This replaces "manual" parsing of AMR frame with function covered
by test suite and makes adding DTXd support easier.

Related: OS#1563
Change-Id: I1464f9a12e3f92926d03d5dd5d18e8f0f7206dd9
---
M src/osmo-bts-litecell15/Makefile.am
M src/osmo-bts-litecell15/tch.c
M src/osmo-bts-sysmo/Makefile.am
M src/osmo-bts-sysmo/tch.c
M tests/sysmobts/Makefile.am
5 files changed, 27 insertions(+), 36 deletions(-)


  git pull ssh://gerrit.osmocom.org:29418/osmo-bts refs/changes/04/204/4

diff --git a/src/osmo-bts-litecell15/Makefile.am b/src/osmo-bts-litecell15/Makefile.am
index 5b63001..768e29d 100644
--- a/src/osmo-bts-litecell15/Makefile.am
+++ b/src/osmo-bts-litecell15/Makefile.am
@@ -1,8 +1,8 @@
 AUTOMAKE_OPTIONS = subdir-objects 
 
 AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/include -I$(OPENBSC_INCDIR) -I$(LITECELL15_INCDIR)
-AM_CFLAGS = -Wall $(LIBOSMOCORE_CFLAGS) $(LIBOSMOGSM_CFLAGS) $(LIBOSMOVTY_CFLAGS) $(LIBOSMOTRAU_CFLAGS) $(LIBOSMOABIS_CFLAGS) $(LIBOSMOCTRL_CFLAGS) $(LIBOSMOABIS_CFLAGS) $(LIBGPS_CFLAGS)
-COMMON_LDADD = $(LIBOSMOCORE_LIBS) $(LIBOSMOGSM_LIBS) $(LIBOSMOVTY_LIBS) $(LIBOSMOTRAU_LIBS) $(LIBOSMOABIS_LIBS) $(LIBOSMOCTRL_LIBS) -lortp
+AM_CFLAGS = -Wall $(LIBOSMOCORE_CFLAGS) $(LIBOSMOCODEC_CFLAGS) $(LIBOSMOGSM_CFLAGS) $(LIBOSMOVTY_CFLAGS) $(LIBOSMOTRAU_CFLAGS) $(LIBOSMOABIS_CFLAGS) $(LIBOSMOCTRL_CFLAGS) $(LIBOSMOABIS_CFLAGS) $(LIBGPS_CFLAGS) $(ORTP_CFLAGS)
+COMMON_LDADD = $(LIBOSMOCORE_LIBS) $(LIBOSMOCODEC_LIBS) $(LIBOSMOGSM_LIBS) $(LIBOSMOVTY_LIBS) $(LIBOSMOTRAU_LIBS) $(LIBOSMOABIS_LIBS) $(LIBOSMOCTRL_LIBS) $(ORTP_LIBS)
 
 EXTRA_DIST = misc/lc15bts_mgr.h misc/lc15bts_misc.h misc/lc15bts_par.h \
 	misc/lc15bts_temp.h misc/lc15bts_power.h misc/lc15bts_clock.h \
diff --git a/src/osmo-bts-litecell15/tch.c b/src/osmo-bts-litecell15/tch.c
index a11911c..15ad456 100644
--- a/src/osmo-bts-litecell15/tch.c
+++ b/src/osmo-bts-litecell15/tch.c
@@ -35,6 +35,7 @@
 #include <osmocom/core/select.h>
 #include <osmocom/core/timer.h>
 #include <osmocom/core/bits.h>
+#include <osmocom/codec/codec.h>
 #include <osmocom/gsm/gsm_utils.h>
 #include <osmocom/trau/osmo_ortp.h>
 
@@ -222,10 +223,6 @@
 	return msg;
 }
 
-enum amr_frame_type {
-	AMR_FT_SID_AMR	= 8,
-};
-
 int get_amr_mode_idx(const struct amr_multirate_conf *amr_mrc, uint8_t cmi)
 {
 	unsigned int i;
@@ -247,13 +244,15 @@
 				struct gsm_lchan *lchan)
 {
 	struct amr_multirate_conf *amr_mrc = &lchan->tch.amr_mr;
-	uint8_t ft = (rtp_payload[1] >> 3) & 0xf;
-	uint8_t cmr = rtp_payload[0] >> 4;
-	uint8_t cmi, sti;
+	enum osmo_amr_type ft;
+	enum osmo_amr_quality bfi;
+	uint8_t cmr;
+	int8_t sti, cmi;
 	uint8_t *l1_cmi_idx = l1_payload;
 	uint8_t *l1_cmr_idx = l1_payload+1;
 	int rc;
 
+	osmo_amr_rtp_dec(rtp_payload, payload_len, &cmr, &cmi, &ft, &bfi, &sti);
 	memcpy(l1_payload+2, rtp_payload, payload_len);
 
 	/* CMI in downlink tells the L1 encoder which encoding function
@@ -264,11 +263,7 @@
 		cmi = ft;
 		LOGP(DRTP, LOGL_DEBUG, "SPEECH frame with CMI %u\n", cmi);
 		break;
-	case AMR_FT_SID_AMR:
-		/* extract the mode indiciation from last bits of
-		 * 39 bit SID frame (Table 6 / 26.101) */
-		cmi = (rtp_payload[2+4] >> 1) & 0x7;
-		sti = rtp_payload[2+4] & 0x10;
+	case AMR_SID:
 		LOGP(DRTP, LOGL_DEBUG, "SID %s frame with CMI %u\n",
 		     sti ? "UPDATE" : "FIRST", cmi);
 		break;
@@ -302,12 +297,12 @@
 	}
 #if 0
 	/* check for bad quality indication */
-	if (rtp_payload[1] & AMR_TOC_QBIT) {
+	if (bfi == AMR_GOOD) {
 		/* obtain frame type from AMR FT */
 		l1_payload[2] = ft;
 	} else {
 		/* bad quality, we should indicate that... */
-		if (ft == AMR_FT_SID_AMR) {
+		if (ft == AMR_SID) {
 			/* FIXME: Should we do GsmL1_TchPlType_Amr_SidBad? */
 			l1_payload[2] = ft;
 		} else {
@@ -316,7 +311,7 @@
 	}
 #endif
 
-	if (ft == AMR_FT_SID_AMR) {
+	if (ft == AMR_SID) {
 		/* store the last SID frame in lchan context */
 		unsigned int copy_len;
 		copy_len = OSMO_MIN(payload_len+1,
diff --git a/src/osmo-bts-sysmo/Makefile.am b/src/osmo-bts-sysmo/Makefile.am
index 9ed89dc..34f4bb0 100644
--- a/src/osmo-bts-sysmo/Makefile.am
+++ b/src/osmo-bts-sysmo/Makefile.am
@@ -1,6 +1,6 @@
 AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/include -I$(OPENBSC_INCDIR)
-AM_CFLAGS = -Wall $(LIBOSMOCORE_CFLAGS) $(LIBOSMOGSM_CFLAGS) $(LIBOSMOVTY_CFLAGS) $(LIBOSMOTRAU_CFLAGS) $(LIBOSMOABIS_CFLAGS) $(LIBOSMOCTRL_CFLAGS) $(LIBOSMOABIS_CFLAGS) $(LIBGPS_CFLAGS) $(ORTP_CFLAGS)
-COMMON_LDADD = $(LIBOSMOCORE_LIBS) $(LIBOSMOGSM_LIBS) $(LIBOSMOVTY_LIBS) $(LIBOSMOTRAU_LIBS) $(LIBOSMOABIS_LIBS) $(LIBOSMOCTRL_LIBS) $(ORTP_LIBS)
+AM_CFLAGS = -Wall $(LIBOSMOCORE_CFLAGS) $(LIBOSMOCODEC_CFLAGS) $(LIBOSMOGSM_CFLAGS) $(LIBOSMOVTY_CFLAGS) $(LIBOSMOTRAU_CFLAGS) $(LIBOSMOABIS_CFLAGS) $(LIBOSMOCTRL_CFLAGS) $(LIBOSMOABIS_CFLAGS) $(LIBGPS_CFLAGS) $(ORTP_CFLAGS)
+COMMON_LDADD = $(LIBOSMOCORE_LIBS) $(LIBOSMOCODEC_LIBS) $(LIBOSMOGSM_LIBS) $(LIBOSMOVTY_LIBS) $(LIBOSMOTRAU_LIBS) $(LIBOSMOABIS_LIBS) $(LIBOSMOCTRL_LIBS) $(ORTP_LIBS)
 
 EXTRA_DIST = misc/sysmobts_mgr.h misc/sysmobts_misc.h misc/sysmobts_par.h \
 	misc/sysmobts_eeprom.h misc/sysmobts_nl.h femtobts.h hw_misc.h \
diff --git a/src/osmo-bts-sysmo/tch.c b/src/osmo-bts-sysmo/tch.c
index e08d8a6..63d90af 100644
--- a/src/osmo-bts-sysmo/tch.c
+++ b/src/osmo-bts-sysmo/tch.c
@@ -32,6 +32,7 @@
 #include <osmocom/core/select.h>
 #include <osmocom/core/timer.h>
 #include <osmocom/core/bits.h>
+#include <osmocom/codec/codec.h>
 #include <osmocom/gsm/gsm_utils.h>
 #include <osmocom/trau/osmo_ortp.h>
 
@@ -298,10 +299,6 @@
 	return msg;
 }
 
-enum amr_frame_type {
-	AMR_FT_SID_AMR	= 8,
-};
-
 int get_amr_mode_idx(const struct amr_multirate_conf *amr_mrc, uint8_t cmi)
 {
 	unsigned int i;
@@ -323,12 +320,15 @@
 				struct gsm_lchan *lchan)
 {
 	struct amr_multirate_conf *amr_mrc = &lchan->tch.amr_mr;
-	uint8_t ft = (rtp_payload[1] >> 3) & 0xf;
-	uint8_t cmr = rtp_payload[0] >> 4;
-	uint8_t cmi, sti;
+	enum osmo_amr_type ft;
+	enum osmo_amr_quality bfi;
+	uint8_t cmr;
+	int8_t sti, cmi;
 	uint8_t *l1_cmi_idx = l1_payload;
 	uint8_t *l1_cmr_idx = l1_payload+1;
 	int rc;
+
+	osmo_amr_rtp_dec(rtp_payload, payload_len, &cmr, &cmi, &ft, &bfi, &sti);
 
 #ifdef USE_L1_RTP_MODE
 	memcpy(l1_payload+2, rtp_payload, payload_len);
@@ -353,11 +353,7 @@
 		cmi = ft;
 		LOGP(DRTP, LOGL_DEBUG, "SPEECH frame with CMI %u\n", cmi);
 		break;
-	case AMR_FT_SID_AMR:
-		/* extract the mode indiciation from last bits of
-		 * 39 bit SID frame (Table 6 / 26.101) */
-		cmi = (rtp_payload[2+4] >> 1) & 0x7;
-		sti = rtp_payload[2+4] & 0x10;
+	case AMR_SID:
 		LOGP(DRTP, LOGL_DEBUG, "SID %s frame with CMI %u\n",
 		     sti ? "UPDATE" : "FIRST", cmi);
 		break;
@@ -391,12 +387,12 @@
 	}
 #if 0
 	/* check for bad quality indication */
-	if (rtp_payload[1] & AMR_TOC_QBIT) {
+	if (bfi == AMR_GOOD) {
 		/* obtain frame type from AMR FT */
 		l1_payload[2] = ft;
 	} else {
 		/* bad quality, we should indicate that... */
-		if (ft == AMR_FT_SID_AMR) {
+		if (ft == AMR_SID) {
 			/* FIXME: Should we do GsmL1_TchPlType_Amr_SidBad? */
 			l1_payload[2] = ft;
 		} else {
@@ -405,7 +401,7 @@
 	}
 #endif
 
-	if (ft == AMR_FT_SID_AMR) {
+	if (ft == AMR_SID) {
 		/* store the last SID frame in lchan context */
 		unsigned int copy_len;
 		copy_len = OSMO_MIN(payload_len+1,
diff --git a/tests/sysmobts/Makefile.am b/tests/sysmobts/Makefile.am
index a00e7c2..2f267f3 100644
--- a/tests/sysmobts/Makefile.am
+++ b/tests/sysmobts/Makefile.am
@@ -1,6 +1,6 @@
 AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/include -I$(OPENBSC_INCDIR) -I$(top_srcdir)/src/osmo-bts-sysmo
-AM_CFLAGS = -Wall $(LIBOSMOCORE_CFLAGS) $(LIBOSMOGSM_CFLAGS) $(LIBOSMOVTY_CFLAGS) $(LIBOSMOTRAU_CFLAGS) $(ORTP_CFLAGS)
-LDADD = $(LIBOSMOCORE_LIBS) $(LIBOSMOGSM_LIBS) $(LIBOSMOVTY_LIBS) $(LIBOSMOTRAU_LIBS) $(ORTP_LIBS)
+AM_CFLAGS = -Wall $(LIBOSMOCORE_CFLAGS) $(LIBOSMOCODEC_CFLAGS) $(LIBOSMOGSM_CFLAGS) $(LIBOSMOVTY_CFLAGS) $(LIBOSMOTRAU_CFLAGS) $(ORTP_CFLAGS)
+LDADD = $(LIBOSMOCORE_LIBS) $(LIBOSMOCODEC_LIBS) $(LIBOSMOGSM_LIBS) $(LIBOSMOVTY_LIBS) $(LIBOSMOTRAU_LIBS) $(ORTP_LIBS)
 
 noinst_PROGRAMS = sysmobts_test
 EXTRA_DIST = sysmobts_test.ok

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

Gerrit-MessageType: newpatchset
Gerrit-Change-Id: I1464f9a12e3f92926d03d5dd5d18e8f0f7206dd9
Gerrit-PatchSet: 4
Gerrit-Project: osmo-bts
Gerrit-Branch: master
Gerrit-Owner: Max <msuraev at sysmocom.de>
Gerrit-Reviewer: Harald Welte <laforge at gnumonks.org>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: Max <msuraev at sysmocom.de>
Gerrit-Reviewer: Neels Hofmeyr <nhofmeyr at sysmocom.de>



More information about the gerrit-log mailing list