aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPhilipp Maier <pmaier@sysmocom.de>2017-06-02 13:49:16 +0200
committerNeels Hofmeyr <nhofmeyr@sysmocom.de>2017-06-21 23:19:19 +0200
commitb25c20cf2af50676728fba25a5ac1c8392ff2edd (patch)
tree42ba572ec49a75e325bbd7322dcfb81671abd5c9
parentb6d96ea64a00937ab7d018b5d8294546e95637c3 (diff)
gsm0808: add function to extrapolate speech codecneels/aoip
The contents of the speech codec element (struct gsm0808_speech_codec), that is also used in the speech codec list element (struct gsm0808_speech_codec_list) can be extrapolated directly from the permitted speech parameter in the channel type field (struct gsm0808_channel_type) when full AoIP with compressed speech via RTP/UDP/IP is assumed and when the codec configuration on the air interface exactly matches the codec configuration on the IP backhaul. This patch adds a function that can be used as a helper to fill out spech codec fields by only giving a permitted speech parameter as input. Change-Id: I257c972e9fdf0dfe940a8d483447085bd62e50a2
-rw-r--r--include/osmocom/gsm/gsm0808_utils.h4
-rw-r--r--src/gsm/gsm0808_utils.c51
-rw-r--r--src/gsm/libosmogsm.map1
3 files changed, 56 insertions, 0 deletions
diff --git a/include/osmocom/gsm/gsm0808_utils.h b/include/osmocom/gsm/gsm0808_utils.h
index 59f64ca7..2a535081 100644
--- a/include/osmocom/gsm/gsm0808_utils.h
+++ b/include/osmocom/gsm/gsm0808_utils.h
@@ -76,3 +76,7 @@ int gsm0808_dec_cell_id_list(struct gsm0808_cell_id_list *cil,
* that is used in struct gsm0808_channel_type to the speech codec
* representation we use in struct gsm0808_speech_codec */
int gsm0808_convert_to_speech_codec_type(uint8_t perm_spch);
+
+/* Extrapolate a speech codec field from a given permitted speech parameter */
+int gsm0808_extrapolate_speech_codec(struct gsm0808_speech_codec *sc,
+ uint8_t perm_spch);
diff --git a/src/gsm/gsm0808_utils.c b/src/gsm/gsm0808_utils.c
index 7dc82e4f..05c67e72 100644
--- a/src/gsm/gsm0808_utils.c
+++ b/src/gsm/gsm0808_utils.c
@@ -750,4 +750,55 @@ int gsm0808_convert_to_speech_codec_type(uint8_t perm_spch)
return -EINVAL;
}
+/* Extrapolate a speech codec field from a given permitted speech parameter */
+int gsm0808_extrapolate_speech_codec(struct gsm0808_speech_codec *sc,
+ uint8_t perm_spch)
+{
+ /* Note: This function accepts the permitted speech configuration
+ * from the channel type information and computes an AoIP speech
+ * codec that field that consistantly matches the channel type
+ * configuration. This will basically reflect a non-transcoding-
+ * situation. (In transcoding scenarios, the codec used in the RTP
+ * stream may be differ from the codec used on the air interface) */
+
+ int rc;
+
+ memset(sc, 0, sizeof(*sc));
+
+ /* Determine codec type */
+ rc = gsm0808_convert_to_speech_codec_type(perm_spch);
+ if (rc < 0)
+ return -EINVAL;
+ sc->type = (uint8_t) rc;
+
+ /* Depending on the, pick a default codc configuration, that
+ * exactly matches the configuration on the air interface. */
+ switch (sc->type) {
+ case GSM0808_SCT_FR3:
+ sc->cfg = GSM0808_SC_CFG_DEFAULT_FR_AMR;
+ break;
+ case GSM0808_SCT_FR4:
+ sc->cfg = GSM0808_SC_CFG_DEFAULT_OFR_AMR_WB;
+ break;
+ case GSM0808_SCT_FR5:
+ sc->cfg = GSM0808_SC_CFG_DEFAULT_FR_AMR_WB;
+ break;
+ case GSM0808_SCT_HR3:
+ sc->cfg = GSM0808_SC_CFG_DEFAULT_HR_AMR;
+ break;
+ case GSM0808_SCT_HR4:
+ sc->cfg = GSM0808_SC_CFG_DEFAULT_OHR_AMR_WB;
+ break;
+ case GSM0808_SCT_HR6:
+ sc->cfg = GSM0808_SC_CFG_DEFAULT_OHR_AMR;
+ break;
+ }
+
+ /* Tag all codecs as "Full IP"
+ * (see als 3GPP TS 48.008 3.2.2.103) */
+ sc->fi = true;
+
+ return 0;
+}
+
/*! @} */
diff --git a/src/gsm/libosmogsm.map b/src/gsm/libosmogsm.map
index ccc5b9a4..36cba391 100644
--- a/src/gsm/libosmogsm.map
+++ b/src/gsm/libosmogsm.map
@@ -163,6 +163,7 @@ gsm0808_dec_encrypt_info;
gsm0808_enc_cell_id_list;
gsm0808_dec_cell_id_list;
gsm0808_convert_to_speech_codec_type;
+gsm0808_extrapolate_speech_codec;
gsm0858_rsl_ul_meas_enc;