aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeels Hofmeyr <nhofmeyr@sysmocom.de>2023-11-17 04:11:19 +0100
committerneels <nhofmeyr@sysmocom.de>2023-12-13 01:52:22 +0000
commitcefe594c72330d70a3efaf05172dd15af36b94f8 (patch)
tree192981d096b690ad1a798bd5a958d8592c4cd7e5
parentcbabe1e32d920b7c81b611d2bc62a46220925341 (diff)
add sdp_audio_codec_to_speech_codec_list()
Used by I8760feaa8598047369ef8c3ab2673013bac8ac8a to add just a single codec to a speech codec list, instead of a list. Change-Id: I6ac23c54bc26939e048ff2df06eb987421cfb1c5
-rw-r--r--include/osmocom/msc/codec_mapping.h1
-rw-r--r--src/libmsc/codec_mapping.c29
2 files changed, 21 insertions, 9 deletions
diff --git a/include/osmocom/msc/codec_mapping.h b/include/osmocom/msc/codec_mapping.h
index 1232d2d8a..3b502a913 100644
--- a/include/osmocom/msc/codec_mapping.h
+++ b/include/osmocom/msc/codec_mapping.h
@@ -56,6 +56,7 @@ struct sdp_audio_codec *sdp_audio_codecs_add_speech_ver(struct sdp_audio_codecs
struct sdp_audio_codec *sdp_audio_codecs_add_mgcp_codec(struct sdp_audio_codecs *ac, enum mgcp_codecs mgcp_codec);
void sdp_audio_codecs_from_bearer_cap(struct sdp_audio_codecs *ac, const struct gsm_mncc_bearer_cap *bc);
+int sdp_audio_codec_to_speech_codec_list(struct gsm0808_speech_codec_list *scl, const struct sdp_audio_codec *codec);
void sdp_audio_codecs_to_speech_codec_list(struct gsm0808_speech_codec_list *cl, const struct sdp_audio_codecs *ac);
void sdp_audio_codecs_from_speech_codec_list(struct sdp_audio_codecs *ac, const struct gsm0808_speech_codec_list *cl);
diff --git a/src/libmsc/codec_mapping.c b/src/libmsc/codec_mapping.c
index 114abaad5..4063514ec 100644
--- a/src/libmsc/codec_mapping.c
+++ b/src/libmsc/codec_mapping.c
@@ -414,6 +414,24 @@ void sdp_audio_codecs_from_bearer_cap(struct sdp_audio_codecs *ac, const struct
}
}
+/* Append an entry for the given sdp_audio_codec to the gsm0808_speech_codec_list.
+ * Return 0 if an entry was added, -ENOENT when there is no mapping to gsm0808_speech_codec for the given
+ * sdp_audio_codec, and -ENOSPC when scl is full and nothing could be added. */
+int sdp_audio_codec_to_speech_codec_list(struct gsm0808_speech_codec_list *scl, const struct sdp_audio_codec *codec)
+{
+ const struct codec_mapping *m = codec_mapping_by_subtype_name(codec->subtype_name);
+ if (!m)
+ return -ENOENT;
+ if (!m->has_gsm0808_speech_codec)
+ return -ENOENT;
+ if (scl->len >= ARRAY_SIZE(scl->codec))
+ return -ENOSPC;
+ scl->codec[scl->len] = m->gsm0808_speech_codec;
+ /* FIXME: apply AMR configuration according to codec->fmtp */
+ scl->len++;
+ return 0;
+}
+
void sdp_audio_codecs_to_speech_codec_list(struct gsm0808_speech_codec_list *scl, const struct sdp_audio_codecs *ac)
{
const struct sdp_audio_codec *codec;
@@ -421,16 +439,9 @@ void sdp_audio_codecs_to_speech_codec_list(struct gsm0808_speech_codec_list *scl
*scl = (struct gsm0808_speech_codec_list){};
foreach_sdp_audio_codec(codec, ac) {
- const struct codec_mapping *m = codec_mapping_by_subtype_name(codec->subtype_name);
- if (!m)
- continue;
- if (!m->has_gsm0808_speech_codec)
- continue;
- if (scl->len >= ARRAY_SIZE(scl->codec))
+ int rc = sdp_audio_codec_to_speech_codec_list(scl, codec);
+ if (rc == -ENOSPC)
break;
- scl->codec[scl->len] = m->gsm0808_speech_codec;
- /* FIXME: apply AMR configuration according to codec->fmtp */
- scl->len++;
}
}