MT call: init codecs filter with BSS codec list and SDP
Related: SYS#5066
Change-Id: I530409a64d11da48518a3dc60aa3a4e47c384663
diff --git a/src/libmsc/gsm_04_08_cc.c b/src/libmsc/gsm_04_08_cc.c
index 7c1da06..d94c59c 100644
--- a/src/libmsc/gsm_04_08_cc.c
+++ b/src/libmsc/gsm_04_08_cc.c
@@ -674,6 +674,33 @@
gsm48_start_cc_timer(trans, 0x303, GSM48_T303);
+ /* MT call leg is starting. Gather all codecs information so far known.
+ * (Usually) paging has succeeded, and now we're processing the MNCC Setup from the remote MO call leg.
+ * Initialize the codecs filter with this side's BSS' codec list, received at Complete Layer 3.
+ * We must not pass bearer_cap to codec_filter_init(), because we haven't received the MT MS's Bearer
+ * Capabilities yet; the Bearer Capabilities handled here are actually the remote call leg's Bearer
+ * Capabilities. */
+ codec_filter_init(&trans->cc.codecs);
+ codec_filter_set_ran(&trans->cc.codecs, trans->msc_a->c.ran->type);
+ codec_filter_set_bss(&trans->cc.codecs, &trans->msc_a->cc.compl_l3_codec_list_bss_supported);
+ /* sdp.remote: if SDP is included in the MNCC, take that as definitive list of remote audio codecs. */
+ if (setup->sdp[0]) {
+ rc = sdp_msg_from_sdp_str(&trans->cc.codecs.remote, setup->sdp);
+ if (rc)
+ LOG_TRANS(trans, LOGL_ERROR, "Failed to parse remote call leg SDP: %d\n", rc);
+ }
+ /* sdp.remote: if there is no SDP information or we failed to parse it, try using the Bearer Capability from
+ * MNCC, if any. */
+ if (!trans->cc.codecs.remote.audio_codecs.count && (setup->fields & MNCC_F_BEARER_CAP)) {
+ trans->cc.codecs.remote = (struct sdp_msg){};
+ sdp_audio_codecs_from_bearer_cap(&trans->cc.codecs.remote.audio_codecs,
+ &setup->bearer_cap);
+ }
+ LOG_TRANS(trans, LOGL_DEBUG, "codecs: %s\n", codec_filter_to_str(&trans->cc.codecs));
+ if (!trans->cc.codecs.remote.audio_codecs.count)
+ LOG_TRANS(trans, LOGL_ERROR,
+ "Got no information of remote audio codecs: neither SDP nor Bearer Capability. Trying anyway.\n");
+
/* bearer capability */
if (setup->fields & MNCC_F_BEARER_CAP) {
/* Create a copy of the bearer capability in the transaction struct, so we