From c9a4f697d38b35680938f20928544a734739b185 Mon Sep 17 00:00:00 2001 From: Philipp Maier Date: Fri, 21 Sep 2018 14:21:50 +0200 Subject: codec_pref: handle S0-S15 in ASSIGNMENT REQUEST Opposed to all other codecs that are common in GSM, AMR requires a codec configuration that is expressed by a bitmask (S0 to S15) in the speech codec list in the ASSIGNMENT REQUEST. Also the BSC acknowledges those configuration in the ASSIGNMENT COMPLETE message. At the moment osmo-bsc ignores all incoming configuration bits. The bits in the ASSIGNMENT COMPLETE speech codec (choosen) field are hardcoded. - Store the configuration bits while parsing the ASSIGNMENT COMPLETE - Create an intersection with the configuration that is actually supported by the BSS - Return the resulting (chosen) configuration bits with the assignment complete message. - Use the (highest of the) agreed codec rates in RSL channel activation. Change-Id: I2d8ded51b3eb4c003fe2da6f2d6f48d001b73737 Related: OS#3529 --- include/osmocom/bsc/codec_pref.h | 6 +- include/osmocom/bsc/gsm_data.h | 1 + include/osmocom/bsc/lchan_fsm.h | 1 + src/osmo-bsc/assignment_fsm.c | 3 +- src/osmo-bsc/codec_pref.c | 121 ++++++++++++++++++++++++------------ src/osmo-bsc/handover_fsm.c | 5 +- src/osmo-bsc/lchan_fsm.c | 45 +++++++++++++- src/osmo-bsc/osmo_bsc_bssap.c | 7 ++- tests/codec_pref/codec_pref_test.c | 6 +- tests/codec_pref/codec_pref_test.ok | 96 ++++++++++++++-------------- 10 files changed, 190 insertions(+), 101 deletions(-) diff --git a/include/osmocom/bsc/codec_pref.h b/include/osmocom/bsc/codec_pref.h index 09aaa604b..3085ad4f9 100644 --- a/include/osmocom/bsc/codec_pref.h +++ b/include/osmocom/bsc/codec_pref.h @@ -12,11 +12,11 @@ struct gsm_bts; int match_codec_pref(enum gsm48_chan_mode *chan_mode, bool *full_rate, + uint16_t *s15_s0, const struct gsm0808_channel_type *ct, const struct gsm0808_speech_codec_list *scl, - struct gsm_audio_support * const *audio_support, - int audio_length, - const struct bts_codec_conf *bts_codec); + const struct bsc_msc_data *msc, + const struct gsm_bts *bts); void gen_bss_supported_codec_list(struct gsm0808_speech_codec_list *scl, const struct bsc_msc_data *msc, diff --git a/include/osmocom/bsc/gsm_data.h b/include/osmocom/bsc/gsm_data.h index 33a5a8dc6..7c91e5982 100644 --- a/include/osmocom/bsc/gsm_data.h +++ b/include/osmocom/bsc/gsm_data.h @@ -109,6 +109,7 @@ struct assignment_request { enum gsm48_chan_mode chan_mode; bool full_rate; + uint16_t s15_s0; }; struct assignment_fsm_data { diff --git a/include/osmocom/bsc/lchan_fsm.h b/include/osmocom/bsc/lchan_fsm.h index 9fbf9b3dc..d2e872446 100644 --- a/include/osmocom/bsc/lchan_fsm.h +++ b/include/osmocom/bsc/lchan_fsm.h @@ -58,6 +58,7 @@ struct lchan_activate_info { /* This always is for a specific lchan, so its lchan->type indicates full or half rate. * When a dyn TS was selected, the lchan->type has been set to the desired rate. */ enum gsm48_chan_mode chan_mode; + uint16_t s15_s0; bool requires_voice_stream; bool wait_before_switching_rtp; uint16_t msc_assigned_cic; diff --git a/src/osmo-bsc/assignment_fsm.c b/src/osmo-bsc/assignment_fsm.c index 2410adb43..3f553ff3c 100644 --- a/src/osmo-bsc/assignment_fsm.c +++ b/src/osmo-bsc/assignment_fsm.c @@ -169,8 +169,8 @@ static void send_assignment_complete(struct gsm_subscriber_connection *conn) * assignment complete message. */ if (gscon_is_aoip(conn)) { /* Extrapolate speech codec from speech mode */ - /* FIXME: AMR codec configuration must be derived from lchan1! */ gsm0808_speech_codec_from_chan_type(&sc, perm_spch); + sc.cfg = conn->assignment.req.s15_s0; sc_ptr = ≻ } } @@ -382,6 +382,7 @@ void assignment_fsm_start(struct gsm_subscriber_connection *conn, struct gsm_bts .activ_for = FOR_ASSIGNMENT, .for_conn = conn, .chan_mode = req->chan_mode, + .s15_s0 = req->s15_s0, .requires_voice_stream = conn->assignment.requires_voice_stream, .msc_assigned_cic = req->msc_assigned_cic, .old_lchan = conn->lchan, diff --git a/src/osmo-bsc/codec_pref.c b/src/osmo-bsc/codec_pref.c index c998e6007..afecaa3ad 100644 --- a/src/osmo-bsc/codec_pref.c +++ b/src/osmo-bsc/codec_pref.c @@ -94,14 +94,18 @@ static enum gsm0808_permitted_speech audio_support_to_gsm88(const struct gsm_aud * matches one of the permitted speech settings of the channel type element. * The matched permitted speech value is then also compared against the * speech codec list. (optional, only relevant for AoIP) */ -static bool test_codec_pref(const struct gsm0808_channel_type *ct, - const struct gsm0808_speech_codec_list *scl, uint8_t perm_spch) +static bool test_codec_pref(const struct gsm0808_speech_codec **sc_match, + const struct gsm0808_speech_codec_list *scl, + const struct gsm0808_channel_type *ct, + uint8_t perm_spch) { unsigned int i; bool match = false; struct gsm0808_speech_codec sc; int rc; + *sc_match = NULL; + /* Try to find the given permitted speech value in the * codec list of the channel type element */ for (i = 0; i < ct->perm_spch_len; i++) { @@ -129,8 +133,10 @@ static bool test_codec_pref(const struct gsm0808_channel_type *ct, /* Try to find extrapolated speech codec data in * the speech codec list */ for (i = 0; i < scl->len; i++) { - if (sc.type == scl->codec[i].type) + if (sc.type == scl->codec[i].type) { + *sc_match = &scl->codec[i]; return true; + } } return false; @@ -168,40 +174,74 @@ static bool test_codec_support_bts(const struct bts_codec_conf *bts_codec, uint8 return false; } +/* Generate the bss supported amr configuration bits (S0-S15) */ +static uint16_t gen_bss_supported_amr_s15_s0(const struct bsc_msc_data *msc, const struct gsm_bts *bts, bool hr) +{ + const struct gsm48_multi_rate_conf *amr_cfg_bts; + const struct gsm48_multi_rate_conf *amr_cfg_msc; + uint16_t amr_s15_s0_bts; + uint16_t amr_s15_s0_msc; + + /* Lookup the BTS specific AMR rate configuration. This config is set + * via the VTY for each BTS individually. In cases where no configuration + * is set we will assume a safe default */ + if (hr) { + amr_cfg_bts = (struct gsm48_multi_rate_conf *)&bts->mr_half.gsm48_ie; + amr_s15_s0_bts = gsm0808_sc_cfg_from_gsm48_mr_cfg(amr_cfg_bts, false); + } else { + amr_cfg_bts = (struct gsm48_multi_rate_conf *)&bts->mr_full.gsm48_ie; + amr_s15_s0_bts = gsm0808_sc_cfg_from_gsm48_mr_cfg(amr_cfg_bts, true); + } + + /* Lookup the AMR rate configuration that is set for the MSC */ + amr_cfg_msc = &msc->amr_conf; + amr_s15_s0_msc = gsm0808_sc_cfg_from_gsm48_mr_cfg(amr_cfg_msc, true); + + /* Calculate the intersection of the two configurations and update S0-S15 + * in the codec list. */ + return amr_s15_s0_bts & amr_s15_s0_msc; +} + /*! Match the codec preferences from local config with a received codec preferences IEs received from the * MSC and the BTS' codec configuration. * \param[out] chan_mode GSM 04.08 channel mode. * \param[out] full_rate true if full-rate. + * \param[out] s15_s0 codec configuration bits S15-S0 (AMR) * \param[in] ct GSM 08.08 channel type received from MSC. * \param[in] scl GSM 08.08 speech codec list received from MSC (optional). - * \param[in] audio_support List of allowed codecs as from local config. - * \param[in] audio_length Number of items in audio_support. - * \param[in] bts_codec BTS codec configuration. + * \param[in] msc associated msc (current codec settings). + * \param[in] bts associated bts (current codec settings). * \returns 0 on success, -1 in case no match was found */ int match_codec_pref(enum gsm48_chan_mode *chan_mode, bool *full_rate, + uint16_t *s15_s0, const struct gsm0808_channel_type *ct, const struct gsm0808_speech_codec_list *scl, - struct gsm_audio_support * const *audio_support, - int audio_length, - const struct bts_codec_conf *bts_codec) + const struct bsc_msc_data *msc, + const struct gsm_bts *bts) { unsigned int i; uint8_t perm_spch; bool match = false; + const struct gsm0808_speech_codec *sc_match = NULL; + uint16_t amr_s15_s0_supported; - for (i = 0; i < audio_length; i++) { + /* Note: Normally the MSC should never try to advertise a codec that + * we did not advertise as supported before. In order to ensure that + * no unsupported codec is accepted, we make sure that the codec is + * indeed available with the current BTS and MSC configuration */ + for (i = 0; i < msc->audio_length; i++) { /* Pick a permitted speech value from the global codec configuration list */ - perm_spch = audio_support_to_gsm88(audio_support[i]); + perm_spch = audio_support_to_gsm88(msc->audio_support[i]); /* Check this permitted speech value against the BTS specific parameters. * if the BTS does not support the codec, try the next one */ - if (!test_codec_support_bts(bts_codec, perm_spch)) + if (!test_codec_support_bts(&bts->codec, perm_spch)) continue; /* Match the permitted speech value against the codec lists that were * advertised by the MS and the MSC */ - if (test_codec_pref(ct, scl, perm_spch)) { + if (test_codec_pref(&sc_match, scl, ct, perm_spch)) { match = true; break; } @@ -211,6 +251,7 @@ int match_codec_pref(enum gsm48_chan_mode *chan_mode, if (!match) { *full_rate = false; *chan_mode = GSM48_CMODE_SIGN; + *s15_s0 = 0; return -1; } @@ -240,6 +281,31 @@ int match_codec_pref(enum gsm48_chan_mode *chan_mode, /* Lookup a channel mode for the selected codec */ *chan_mode = gsm88_to_chan_mode(perm_spch); + /* Special handling for AMR */ + if (perm_spch == GSM0808_PERM_HR3 || perm_spch == GSM0808_PERM_FR3) { + /* Normally the MSC should never try to advertise an AMR codec + * configuration that we did not previously advertise as + * supported. However, to ensure that no unsupported AMR codec + * configuration enters the further processing steps we again + * lookup what we support and generate an intersection. All + * further processing is then done with this intersection + * result */ + amr_s15_s0_supported = gen_bss_supported_amr_s15_s0(msc, bts, (perm_spch == GSM0808_PERM_HR3)); + if (sc_match) + *s15_s0 = sc_match->cfg & amr_s15_s0_supported; + else + *s15_s0 = amr_s15_s0_supported; + + /* NOTE: The function test_codec_pref() will populate the + * sc_match pointer from the searched speech codec list. For + * AoIP based networks, no speech codec list will be present + * and therefore no sc_match will be populated. For those + * cases only the local configuration will influence s15_s0. + * However s15_s0 is always populated with a meaningful value, + * regardless if AoIP is in use or not. */ + } else + *s15_s0 = 0; + return 0; } @@ -254,11 +320,6 @@ void gen_bss_supported_codec_list(struct gsm0808_speech_codec_list *scl, uint8_t perm_spch; unsigned int i; int rc; - uint16_t amr_s15_s0_bts; - uint16_t amr_s15_s0_msc; - uint16_t amr_s15_s0; - const struct gsm48_multi_rate_conf *amr_cfg_bts; - const struct gsm48_multi_rate_conf *amr_cfg_msc; memset(scl, 0, sizeof(*scl)); @@ -280,28 +341,8 @@ void gen_bss_supported_codec_list(struct gsm0808_speech_codec_list *scl, /* AMR (HR/FR version 3) is the only codec that requires a codec * configuration (S0-S15). Determine the current configuration and update * the cfg flag. */ - if (msc->audio_support[i]->ver == 3) { - - /* First lookup the BTS specific AMR rate configuration. Thsi config - * is set via the VTY for each BTS individually. In cases where no - * configuration is set we will assume a safe default */ - if (msc->audio_support[i]->hr) { - amr_cfg_bts = (struct gsm48_multi_rate_conf *)&bts->mr_half.gsm48_ie; - amr_s15_s0_bts = gsm0808_sc_cfg_from_gsm48_mr_cfg(amr_cfg_bts, false); - } else { - amr_cfg_bts = (struct gsm48_multi_rate_conf *)&bts->mr_full.gsm48_ie; - amr_s15_s0_bts = gsm0808_sc_cfg_from_gsm48_mr_cfg(amr_cfg_bts, true); - } - - /* At next, lookup the AMR rate configuration that is set for the MSC */ - amr_cfg_msc = &msc->amr_conf; - amr_s15_s0_msc = gsm0808_sc_cfg_from_gsm48_mr_cfg(amr_cfg_msc, true); - - /* Calculate the intersection of the two configurations and update S0-S15 - * in the codec list. */ - amr_s15_s0 = amr_s15_s0_bts & amr_s15_s0_msc; - scl->codec[scl->len].cfg = amr_s15_s0; - } + if (msc->audio_support[i]->ver == 3) + scl->codec[scl->len].cfg = gen_bss_supported_amr_s15_s0(msc, bts, msc->audio_support[i]->hr); scl->len++; } diff --git a/src/osmo-bsc/handover_fsm.c b/src/osmo-bsc/handover_fsm.c index 9d558bcb5..0ba506137 100644 --- a/src/osmo-bsc/handover_fsm.c +++ b/src/osmo-bsc/handover_fsm.c @@ -522,6 +522,7 @@ void handover_start_inter_bsc_in(struct gsm_subscriber_connection *conn, int match_idx; enum gsm48_chan_mode mode; bool full_rate; + uint16_t s15_s0; struct osmo_fsm_inst *fi; handover_fsm_alloc(conn); @@ -560,8 +561,7 @@ void handover_start_inter_bsc_in(struct gsm_subscriber_connection *conn, bts->nr, req->cell_id_target_name); /* Figure out channel type */ - if (match_codec_pref(&mode, &full_rate, &req->ct, &req->scl, msc->audio_support, - msc->audio_length, &bts->codec)) { + if (match_codec_pref(&mode, &full_rate, &s15_s0, &req->ct, &req->scl, msc, bts)) { LOG_HO(conn, LOGL_DEBUG, "BTS %u has no matching channel codec (%s, speech codec list len = %u)", bts->nr, gsm0808_channel_type_name(&req->ct), req->scl.len); @@ -606,6 +606,7 @@ void handover_start_inter_bsc_in(struct gsm_subscriber_connection *conn, .activ_for = FOR_HANDOVER, .for_conn = conn, .chan_mode = mode, + .s15_s0 = s15_s0, .requires_voice_stream = chan_mode_is_tch(mode), .msc_assigned_cic = req->msc_assigned_cic, }; diff --git a/src/osmo-bsc/lchan_fsm.c b/src/osmo-bsc/lchan_fsm.c index c80d8a16e..4aaedde66 100644 --- a/src/osmo-bsc/lchan_fsm.c +++ b/src/osmo-bsc/lchan_fsm.c @@ -425,11 +425,48 @@ void lchan_mr_config(struct gsm_lchan *lchan, struct gsm48_multi_rate_conf *mr_c }; } +/* Mask all rates instead of the highest possible */ +static void lchan_mr_config_mask(struct gsm48_multi_rate_conf *mr_conf) +{ + unsigned int i; + bool highest_seen = false; + uint8_t *_mr_conf = (uint8_t *) mr_conf; + + /* FIXME: At the moment we can not support multiple codec rates in one + * struct gsm48_multi_rate_conf, because the struct lacks the fields + * for Threshold and Hysteresis. Those fields are not needed when only + * a single codec rate is in place, but as soon as multiple codec + * rates are used the parameters are mandatory. The layout for the + * struct would then also be different because each rate needs its + * own Threshold and Hysteresis value. (See also 3GPP TS 04.08, + * chapter 10.5.2.21aa MultiRate configuration). + * + * Since we are unable to signal multiple codec rates properly, we just + * remove all codec rates from the active set, except the highest + * possible. Doing so we lack the functionality to switch towards the + * other, lower codec rates that were offered by the MSC, but it is + * still guaranteed that a rate is selected that is supported by all + * entities. + * + * To fix this problem, we should implement a proper encoder for + * struct gsm48_multi_rate_conf, in libosmocore and use it here. + * struct amr_mode already seems to have members for threshold and + * hysteresis we can use. */ + + for (i = 7; i > 0; i--) { + if (_mr_conf[1] & (1 << i) && highest_seen == false) { + highest_seen = true; + } else if (highest_seen) + _mr_conf[1] &= ~(1 << i); + } +} + static void lchan_fsm_unused(struct osmo_fsm_inst *fi, uint32_t event, void *data) { struct lchan_activate_info *info = data; struct gsm_lchan *lchan = lchan_fi_lchan(fi); struct gsm_bts *bts = lchan->ts->trx->bts; + struct gsm48_multi_rate_conf mr_conf; switch (event) { @@ -469,8 +506,12 @@ static void lchan_fsm_unused(struct osmo_fsm_inst *fi, uint32_t event, void *dat * - TA is still zero, to be determined by RACH. */ } - if (info->chan_mode == GSM48_CMODE_SPEECH_AMR) - lchan_mr_config(lchan, &info->for_conn->sccp.msc->amr_conf); + if (info->chan_mode == GSM48_CMODE_SPEECH_AMR) { + gsm48_mr_cfg_from_gsm0808_sc_cfg(&mr_conf, info->s15_s0); + /* FIXME: See above. */ + lchan_mr_config_mask(&mr_conf); + lchan_mr_config(lchan, &mr_conf); + } switch (info->chan_mode) { diff --git a/src/osmo-bsc/osmo_bsc_bssap.c b/src/osmo-bsc/osmo_bsc_bssap.c index 97daa5cf7..537b85168 100644 --- a/src/osmo-bsc/osmo_bsc_bssap.c +++ b/src/osmo-bsc/osmo_bsc_bssap.c @@ -603,6 +603,7 @@ static int bssmap_handle_assignm_req(struct gsm_subscriber_connection *conn, uint16_t cic = 0; enum gsm48_chan_mode chan_mode = GSM48_CMODE_SIGN; bool full_rate = false; + uint16_t s15_s0 = 0; bool aoip = false; struct sockaddr_storage rtp_addr; struct gsm0808_channel_type ct; @@ -706,9 +707,8 @@ static int bssmap_handle_assignm_req(struct gsm_subscriber_connection *conn, /* Match codec information from the assignment command against the * local preferences of the BSC and BTS */ - rc = match_codec_pref(&chan_mode, &full_rate, &ct, &conn->codec_list, - msc->audio_support, msc->audio_length, - &conn_get_bts(conn)->codec); + rc = match_codec_pref(&chan_mode, &full_rate, &s15_s0, &ct, &conn->codec_list, + msc, conn_get_bts(conn)); if (rc < 0) { LOGP(DMSC, LOGL_ERROR, "No supported audio type found for channel_type =" " { ch_indctr=0x%x, ch_rate_type=0x%x, perm_spch=[ %s] }\n", @@ -730,6 +730,7 @@ static int bssmap_handle_assignm_req(struct gsm_subscriber_connection *conn, .msc_assigned_cic = cic, .chan_mode = chan_mode, .full_rate = full_rate, + .s15_s0 = s15_s0 }; if (aoip) { unsigned int rc = osmo_sockaddr_to_str_and_uint(req.msc_rtp_addr, diff --git a/tests/codec_pref/codec_pref_test.c b/tests/codec_pref/codec_pref_test.c index 20e3525f0..e2876e2c8 100644 --- a/tests/codec_pref/codec_pref_test.c +++ b/tests/codec_pref/codec_pref_test.c @@ -374,6 +374,7 @@ static int test_match_codec_pref(const struct gsm0808_channel_type *ct, const st unsigned int i; bool full_rate; enum gsm48_chan_mode chan_mode; + uint16_t s15_s0; printf("Determining channel mode and rate:\n"); @@ -398,8 +399,9 @@ static int test_match_codec_pref(const struct gsm0808_channel_type *ct, const st printf(" codec->efr=%u\n", bts->codec.efr); printf(" codec->amr=%u\n", bts->codec.amr); - rc = match_codec_pref(&chan_mode, &full_rate, ct, scl, msc->audio_support, msc->audio_length, &bts->codec); - printf(" * result: rc=%i, full_rate=%i, chan_mode=%s\n", rc, full_rate, gsm48_chan_mode_name(chan_mode)); + rc = match_codec_pref(&chan_mode, &full_rate, &s15_s0, ct, scl, msc, bts); + printf(" * result: rc=%i, full_rate=%i, s15_s0=%04x, chan_mode=%s\n", + rc, full_rate, s15_s0, gsm48_chan_mode_name(chan_mode)); printf("\n"); diff --git a/tests/codec_pref/codec_pref_test.ok b/tests/codec_pref/codec_pref_test.ok index befc4972e..16d86ba67 100644 --- a/tests/codec_pref/codec_pref_test.ok +++ b/tests/codec_pref/codec_pref_test.ok @@ -12,7 +12,7 @@ Determining channel mode and rate: codec->hr=0 codec->efr=0 codec->amr=0 - * result: rc=0, full_rate=1, chan_mode=SPEECH_V1 + * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1 Determining channel mode and rate: * MS: speech codec list (1 items): @@ -26,7 +26,7 @@ Determining channel mode and rate: codec->hr=1 codec->efr=0 codec->amr=0 - * result: rc=0, full_rate=0, chan_mode=SPEECH_V1 + * result: rc=0, full_rate=0, s15_s0=0000, chan_mode=SPEECH_V1 Determining channel mode and rate: * MS: speech codec list (1 items): @@ -40,7 +40,7 @@ Determining channel mode and rate: codec->hr=0 codec->efr=1 codec->amr=0 - * result: rc=0, full_rate=1, chan_mode=SPEECH_EFR + * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_EFR Determining channel mode and rate: * MS: speech codec list (1 items): @@ -54,7 +54,7 @@ Determining channel mode and rate: codec->hr=0 codec->efr=0 codec->amr=1 - * result: rc=0, full_rate=1, chan_mode=SPEECH_AMR + * result: rc=0, full_rate=1, s15_s0=57ff, chan_mode=SPEECH_AMR Determining channel mode and rate: * MS: speech codec list (1 items): @@ -68,7 +68,7 @@ Determining channel mode and rate: codec->hr=0 codec->efr=0 codec->amr=1 - * result: rc=0, full_rate=0, chan_mode=SPEECH_AMR + * result: rc=0, full_rate=0, s15_s0=073f, chan_mode=SPEECH_AMR Determining channel mode and rate: * MS: speech codec list (2 items): @@ -85,7 +85,7 @@ Determining channel mode and rate: codec->hr=1 codec->efr=0 codec->amr=0 - * result: rc=0, full_rate=1, chan_mode=SPEECH_V1 + * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1 Determining channel mode and rate: * MS: speech codec list (3 items): @@ -105,7 +105,7 @@ Determining channel mode and rate: codec->hr=1 codec->efr=1 codec->amr=0 - * result: rc=0, full_rate=1, chan_mode=SPEECH_V1 + * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1 Determining channel mode and rate: * MS: speech codec list (3 items): @@ -125,7 +125,7 @@ Determining channel mode and rate: codec->hr=0 codec->efr=0 codec->amr=1 - * result: rc=0, full_rate=1, chan_mode=SPEECH_V1 + * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1 Determining channel mode and rate: * MS: speech codec list (5 items): @@ -151,7 +151,7 @@ Determining channel mode and rate: codec->hr=1 codec->efr=1 codec->amr=1 - * result: rc=0, full_rate=1, chan_mode=SPEECH_V1 + * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1 ============== test_ms ============== @@ -175,7 +175,7 @@ Determining channel mode and rate: codec->hr=1 codec->efr=1 codec->amr=1 - * result: rc=0, full_rate=1, chan_mode=SPEECH_V1 + * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1 Determining channel mode and rate: * MS: speech codec list (1 items): @@ -197,7 +197,7 @@ Determining channel mode and rate: codec->hr=1 codec->efr=1 codec->amr=1 - * result: rc=0, full_rate=0, chan_mode=SPEECH_V1 + * result: rc=0, full_rate=0, s15_s0=0000, chan_mode=SPEECH_V1 Determining channel mode and rate: * MS: speech codec list (1 items): @@ -219,7 +219,7 @@ Determining channel mode and rate: codec->hr=1 codec->efr=1 codec->amr=1 - * result: rc=0, full_rate=1, chan_mode=SPEECH_EFR + * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_EFR Determining channel mode and rate: * MS: speech codec list (1 items): @@ -241,7 +241,7 @@ Determining channel mode and rate: codec->hr=1 codec->efr=1 codec->amr=1 - * result: rc=0, full_rate=1, chan_mode=SPEECH_AMR + * result: rc=0, full_rate=1, s15_s0=57ff, chan_mode=SPEECH_AMR Determining channel mode and rate: * MS: speech codec list (1 items): @@ -263,7 +263,7 @@ Determining channel mode and rate: codec->hr=1 codec->efr=1 codec->amr=1 - * result: rc=0, full_rate=0, chan_mode=SPEECH_AMR + * result: rc=0, full_rate=0, s15_s0=073f, chan_mode=SPEECH_AMR Determining channel mode and rate: * MS: speech codec list (2 items): @@ -286,7 +286,7 @@ Determining channel mode and rate: codec->hr=1 codec->efr=1 codec->amr=1 - * result: rc=0, full_rate=1, chan_mode=SPEECH_V1 + * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1 Determining channel mode and rate: * MS: speech codec list (3 items): @@ -310,7 +310,7 @@ Determining channel mode and rate: codec->hr=1 codec->efr=1 codec->amr=1 - * result: rc=0, full_rate=1, chan_mode=SPEECH_V1 + * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1 Determining channel mode and rate: * MS: speech codec list (3 items): @@ -334,7 +334,7 @@ Determining channel mode and rate: codec->hr=1 codec->efr=1 codec->amr=1 - * result: rc=0, full_rate=1, chan_mode=SPEECH_V1 + * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1 Determining channel mode and rate: * MS: speech codec list (5 items): @@ -360,7 +360,7 @@ Determining channel mode and rate: codec->hr=1 codec->efr=1 codec->amr=1 - * result: rc=0, full_rate=1, chan_mode=SPEECH_V1 + * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1 ============== test_ct ============== @@ -384,7 +384,7 @@ Determining channel mode and rate: codec->hr=1 codec->efr=1 codec->amr=1 - * result: rc=0, full_rate=1, chan_mode=SPEECH_V1 + * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1 Determining channel mode and rate: * MS: speech codec list (5 items): @@ -406,7 +406,7 @@ Determining channel mode and rate: codec->hr=1 codec->efr=1 codec->amr=1 - * result: rc=0, full_rate=0, chan_mode=SPEECH_V1 + * result: rc=0, full_rate=0, s15_s0=0000, chan_mode=SPEECH_V1 Determining channel mode and rate: * MS: speech codec list (5 items): @@ -428,7 +428,7 @@ Determining channel mode and rate: codec->hr=1 codec->efr=1 codec->amr=1 - * result: rc=0, full_rate=1, chan_mode=SPEECH_EFR + * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_EFR Determining channel mode and rate: * MS: speech codec list (5 items): @@ -450,7 +450,7 @@ Determining channel mode and rate: codec->hr=1 codec->efr=1 codec->amr=1 - * result: rc=0, full_rate=1, chan_mode=SPEECH_AMR + * result: rc=0, full_rate=1, s15_s0=57ff, chan_mode=SPEECH_AMR Determining channel mode and rate: * MS: speech codec list (5 items): @@ -472,7 +472,7 @@ Determining channel mode and rate: codec->hr=1 codec->efr=1 codec->amr=1 - * result: rc=0, full_rate=0, chan_mode=SPEECH_AMR + * result: rc=0, full_rate=0, s15_s0=073f, chan_mode=SPEECH_AMR Determining channel mode and rate: * MS: speech codec list (5 items): @@ -495,7 +495,7 @@ Determining channel mode and rate: codec->hr=1 codec->efr=1 codec->amr=1 - * result: rc=0, full_rate=1, chan_mode=SPEECH_V1 + * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1 Determining channel mode and rate: * MS: speech codec list (5 items): @@ -519,7 +519,7 @@ Determining channel mode and rate: codec->hr=1 codec->efr=1 codec->amr=1 - * result: rc=0, full_rate=1, chan_mode=SPEECH_V1 + * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1 Determining channel mode and rate: * MS: speech codec list (5 items): @@ -543,7 +543,7 @@ Determining channel mode and rate: codec->hr=1 codec->efr=1 codec->amr=1 - * result: rc=0, full_rate=1, chan_mode=SPEECH_V1 + * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1 Determining channel mode and rate: * MS: speech codec list (5 items): @@ -569,7 +569,7 @@ Determining channel mode and rate: codec->hr=1 codec->efr=1 codec->amr=1 - * result: rc=0, full_rate=1, chan_mode=SPEECH_V1 + * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1 ============== test_msc ============== @@ -597,7 +597,7 @@ Determining channel mode and rate: codec->hr=1 codec->efr=1 codec->amr=1 - * result: rc=0, full_rate=1, chan_mode=SPEECH_V1 + * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1 Determining channel mode and rate: * MS: speech codec list (5 items): @@ -623,7 +623,7 @@ Determining channel mode and rate: codec->hr=1 codec->efr=1 codec->amr=1 - * result: rc=0, full_rate=1, chan_mode=SPEECH_V1 + * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1 Determining channel mode and rate: * MS: speech codec list (5 items): @@ -649,7 +649,7 @@ Determining channel mode and rate: codec->hr=1 codec->efr=1 codec->amr=1 - * result: rc=0, full_rate=1, chan_mode=SPEECH_V1 + * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1 Determining channel mode and rate: * MS: speech codec list (5 items): @@ -675,7 +675,7 @@ Determining channel mode and rate: codec->hr=1 codec->efr=1 codec->amr=1 - * result: rc=0, full_rate=1, chan_mode=SPEECH_V1 + * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1 Determining channel mode and rate: * MS: speech codec list (5 items): @@ -701,7 +701,7 @@ Determining channel mode and rate: codec->hr=1 codec->efr=1 codec->amr=1 - * result: rc=0, full_rate=1, chan_mode=SPEECH_V1 + * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1 Determining channel mode and rate: * MS: speech codec list (5 items): @@ -727,7 +727,7 @@ Determining channel mode and rate: codec->hr=1 codec->efr=1 codec->amr=1 - * result: rc=0, full_rate=1, chan_mode=SPEECH_V1 + * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1 Determining channel mode and rate: * MS: speech codec list (5 items): @@ -753,7 +753,7 @@ Determining channel mode and rate: codec->hr=1 codec->efr=1 codec->amr=1 - * result: rc=0, full_rate=1, chan_mode=SPEECH_V1 + * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1 Determining channel mode and rate: * MS: speech codec list (5 items): @@ -779,7 +779,7 @@ Determining channel mode and rate: codec->hr=1 codec->efr=1 codec->amr=1 - * result: rc=0, full_rate=1, chan_mode=SPEECH_V1 + * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1 Determining channel mode and rate: * MS: speech codec list (5 items): @@ -805,7 +805,7 @@ Determining channel mode and rate: codec->hr=1 codec->efr=1 codec->amr=1 - * result: rc=0, full_rate=1, chan_mode=SPEECH_V1 + * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1 ============== test_selected_working ============== @@ -826,7 +826,7 @@ Determining channel mode and rate: codec->hr=1 codec->efr=1 codec->amr=1 - * result: rc=0, full_rate=1, chan_mode=SPEECH_V1 + * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1 Determining channel mode and rate: * MS: speech codec list (1 items): @@ -843,7 +843,7 @@ Determining channel mode and rate: codec->hr=1 codec->efr=1 codec->amr=1 - * result: rc=0, full_rate=1, chan_mode=SPEECH_V1 + * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1 Determining channel mode and rate: * MS: speech codec list (1 items): @@ -860,7 +860,7 @@ Determining channel mode and rate: codec->hr=1 codec->efr=1 codec->amr=1 - * result: rc=0, full_rate=0, chan_mode=SPEECH_V1 + * result: rc=0, full_rate=0, s15_s0=0000, chan_mode=SPEECH_V1 Determining channel mode and rate: * MS: speech codec list (3 items): @@ -879,7 +879,7 @@ Determining channel mode and rate: codec->hr=0 codec->efr=0 codec->amr=1 - * result: rc=0, full_rate=1, chan_mode=SPEECH_V1 + * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1 Determining channel mode and rate: * MS: speech codec list (1 items): @@ -896,7 +896,7 @@ Determining channel mode and rate: codec->hr=0 codec->efr=1 codec->amr=0 - * result: rc=0, full_rate=1, chan_mode=SPEECH_V1 + * result: rc=0, full_rate=1, s15_s0=0000, chan_mode=SPEECH_V1 Determining channel mode and rate: * MS: speech codec list (1 items): @@ -913,7 +913,7 @@ Determining channel mode and rate: codec->hr=1 codec->efr=0 codec->amr=0 - * result: rc=0, full_rate=0, chan_mode=SPEECH_V1 + * result: rc=0, full_rate=0, s15_s0=0000, chan_mode=SPEECH_V1 ============== test_selected_non_working ============== @@ -932,7 +932,7 @@ Determining channel mode and rate: codec->hr=1 codec->efr=1 codec->amr=1 - * result: rc=-1, full_rate=0, chan_mode=SIGNALLING + * result: rc=-1, full_rate=0, s15_s0=0000, chan_mode=SIGNALLING Determining channel mode and rate: * MS: speech codec list (1 items): @@ -949,7 +949,7 @@ Determining channel mode and rate: codec->hr=1 codec->efr=1 codec->amr=1 - * result: rc=-1, full_rate=0, chan_mode=SIGNALLING + * result: rc=-1, full_rate=0, s15_s0=0000, chan_mode=SIGNALLING Determining channel mode and rate: * MS: speech codec list (1 items): @@ -965,7 +965,7 @@ Determining channel mode and rate: codec->hr=1 codec->efr=1 codec->amr=1 - * result: rc=-1, full_rate=0, chan_mode=SIGNALLING + * result: rc=-1, full_rate=0, s15_s0=0000, chan_mode=SIGNALLING Determining channel mode and rate: * MS: speech codec list (1 items): @@ -981,7 +981,7 @@ Determining channel mode and rate: codec->hr=1 codec->efr=1 codec->amr=1 - * result: rc=-1, full_rate=0, chan_mode=SIGNALLING + * result: rc=-1, full_rate=0, s15_s0=0000, chan_mode=SIGNALLING Determining channel mode and rate: * MS: speech codec list (1 items): @@ -996,7 +996,7 @@ Determining channel mode and rate: codec->hr=1 codec->efr=1 codec->amr=1 - * result: rc=-1, full_rate=0, chan_mode=SIGNALLING + * result: rc=-1, full_rate=0, s15_s0=0000, chan_mode=SIGNALLING Determining channel mode and rate: * MS: speech codec list (5 items): @@ -1016,7 +1016,7 @@ Determining channel mode and rate: codec->hr=0 codec->efr=0 codec->amr=1 - * result: rc=-1, full_rate=0, chan_mode=SIGNALLING + * result: rc=-1, full_rate=0, s15_s0=0000, chan_mode=SIGNALLING ============== test_gen_bss_supp_codec_list_cfgs ============== -- cgit v1.2.3