codec_mapping: add all AMR variants

Change-Id: I09233c8c17fce591195b7762740f4d82a9961db6
This commit is contained in:
Neels Hofmeyr 2024-01-19 06:21:07 +01:00
parent cb0758d4ba
commit 3083b970b3
2 changed files with 130 additions and 48 deletions

View File

@ -31,7 +31,9 @@
#include <osmocom/msc/codec_mapping.h>
#include <osmocom/msc/mncc.h>
const struct codec_mapping codec_map[] = {
#define S(N) (1 << (N))
static const struct codec_mapping codec_map[] = {
/* FIXME: sdp.fmtp handling is not done properly yet, proper mode-set and octet-align handling will follow in
* separate patches. */
{
@ -112,51 +114,121 @@ const struct codec_mapping codec_map[] = {
.perm_speech = GSM0808_PERM_HR1,
.frhr = CODEC_FRHR_HR,
},
{
.sdp = {
/* 112 is just what we use by default. The other call leg may impose a different number. */
.payload_type = 112,
.subtype_name = "AMR",
.rate = 8000,
/* AMR is always octet-aligned in 2G and 3G RAN, so this fmtp is signalled to remote call legs.
* So far, fmtp is ignored in incoming SIP SDP, so an incoming SDP without 'octet-align=1' will
* match with this entry; we will still reply with 'octet-align=1', which often works out. */
.fmtp = OSMO_SDP_VAL_AMR_OCTET_ALIGN_1,
},
.mgcp = CODEC_AMR_8000_1,
.speech_ver_count = 1,
.speech_ver = { GSM48_BCAP_SV_AMR_F },
.mncc_payload_msg_type = GSM_TCH_FRAME_AMR,
.has_gsm0808_speech_codec = true,
.gsm0808_speech_codec = {
.fi = true,
.type = GSM0808_SCT_FR3,
.cfg = GSM0808_SC_CFG_DEFAULT_FR_AMR,
},
.perm_speech = GSM0808_PERM_FR3,
.frhr = CODEC_FRHR_FR,
},
{
/* Another entry like the above, to map HR3 to AMR, too. */
.sdp = {
.payload_type = 112,
.subtype_name = "AMR",
.rate = 8000,
.fmtp = OSMO_SDP_VAL_AMR_OCTET_ALIGN_1,
},
.mgcp = CODEC_AMR_8000_1,
.speech_ver_count = 1,
.speech_ver = { GSM48_BCAP_SV_AMR_H },
.mncc_payload_msg_type = GSM_TCH_FRAME_AMR,
.has_gsm0808_speech_codec = true,
.gsm0808_speech_codec = {
.fi = true,
.type = GSM0808_SCT_HR3,
.cfg = GSM0808_SC_CFG_DEFAULT_HR_AMR,
},
.perm_speech = GSM0808_PERM_HR3,
.frhr = CODEC_FRHR_HR,
},
/* payload_type = 112 is just what we use by default. The other call leg may impose a different number. */
#define AMR_FR(IS_OA, FMTP, SPEECH_CODEC_CFG) \
{ \
.sdp = { \
.payload_type = 112, \
.subtype_name = "AMR", \
.rate = 8000, \
.fmtp = FMTP, \
}, \
.mgcp = CODEC_AMR_8000_1, \
.speech_ver_count = 1, \
.speech_ver = { GSM48_BCAP_SV_AMR_F }, \
.mncc_payload_msg_type = GSM_TCH_FRAME_AMR, \
.has_gsm0808_speech_codec = true, \
.gsm0808_speech_codec = { \
.fi = true, \
.type = GSM0808_SCT_FR3, \
.cfg = SPEECH_CODEC_CFG, \
}, \
.perm_speech = GSM0808_PERM_FR3, \
.frhr = CODEC_FRHR_FR, \
}
#define AMR_HR(IS_OA, FMTP, SPEECH_CODEC_CFG) \
{ \
.sdp = { \
.payload_type = 112, \
.subtype_name = "AMR", \
.rate = 8000, \
.fmtp = FMTP, \
}, \
.mgcp = CODEC_AMR_8000_1, \
.speech_ver_count = 1, \
.speech_ver = { GSM48_BCAP_SV_AMR_H }, \
.mncc_payload_msg_type = GSM_TCH_FRAME_AMR, \
.has_gsm0808_speech_codec = true, \
.gsm0808_speech_codec = { \
.fi = true, \
.type = GSM0808_SCT_HR3, \
.cfg = SPEECH_CODEC_CFG, \
}, \
.perm_speech = GSM0808_PERM_HR3, \
.frhr = CODEC_FRHR_HR, \
}
/* AMR rates as in 3GPP TS 28.062, Table 7.11.3.1.3-2; gsm0808_speech_codec.cfg is a bitmask of Sn bits:
*
* S0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
* 12,20 (x) x x x
* 10,20 x x x
* 7,95 x x x
* 7,40 x x x x
* 6,70 x x x x x x
* 5,90 x x x x x x x x x x
* 5,15
* 4,75 x x x x x x x x x x
*
* OM F F F F F F F F F F F A F A F A
*
* HR Y Y Y Y Y Y Y Y Y
* FR Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y
*/
#if 0
/* Add *all* AMR rate combinations as separate entries to the codec mapping */
#define ALL_AMR(IS_OA, FMTP_PREFIX) \
/* FR rates */ \
AMR_FR(IS_OA, FMTP_PREFIX "mode-set=0", S(0)), \
AMR_FR(IS_OA, FMTP_PREFIX "mode-set=0,2,4,7", S(1)), \
AMR_FR(IS_OA, FMTP_PREFIX "mode-set=2", S(2)), \
AMR_FR(IS_OA, FMTP_PREFIX "mode-set=3", S(3)), \
AMR_FR(IS_OA, FMTP_PREFIX "mode-set=4", S(4)), \
AMR_FR(IS_OA, FMTP_PREFIX "mode-set=5", S(5)), \
AMR_FR(IS_OA, FMTP_PREFIX "mode-set=6", S(6)), \
AMR_FR(IS_OA, FMTP_PREFIX "mode-set=7", S(7)), \
AMR_FR(IS_OA, FMTP_PREFIX "mode-set=0,2", S(8)), \
AMR_FR(IS_OA, FMTP_PREFIX "mode-set=0,2,3", S(9)), \
AMR_FR(IS_OA, FMTP_PREFIX "mode-set=0,2,3,4", S(10)), \
AMR_FR(IS_OA, FMTP_PREFIX "mode-set=0,2,3,6", S(12)), \
AMR_FR(IS_OA, FMTP_PREFIX "mode-set=0,2,5,7", S(14)), \
/* AMR FR: S1 in compatibility with AMR-HR = without 12k2 */ \
AMR_FR(IS_OA, FMTP_PREFIX "mode-set=0,2,4", S(1)), \
\
/* HR rates */ \
AMR_HR(IS_OA, FMTP_PREFIX "mode-set=0", S(0)), \
AMR_HR(IS_OA, FMTP_PREFIX "mode-set=0,2,4", S(1)), \
AMR_HR(IS_OA, FMTP_PREFIX "mode-set=2", S(2)), \
AMR_HR(IS_OA, FMTP_PREFIX "mode-set=3", S(3)), \
AMR_HR(IS_OA, FMTP_PREFIX "mode-set=4", S(4)), \
AMR_HR(IS_OA, FMTP_PREFIX "mode-set=5", S(5)), \
AMR_HR(IS_OA, FMTP_PREFIX "mode-set=0,2", S(8)), \
AMR_HR(IS_OA, FMTP_PREFIX "mode-set=0,2,3", S(9)), \
AMR_HR(IS_OA, FMTP_PREFIX "mode-set=0,2,3,4", S(10))
#else
/* Add only AMR rates for S1 (0,2,4,7) as well as 12k2 only. */
#define ALL_AMR(IS_OA, FMTP_PREFIX) \
/* FR rates */ \
AMR_FR(IS_OA, FMTP_PREFIX "mode-set=0,2,4,7", S(1)), \
AMR_FR(IS_OA, FMTP_PREFIX "mode-set=7", S(7)), \
AMR_FR(IS_OA, FMTP_PREFIX "mode-set=0,2,4", S(1)), \
\
/* HR rates */ \
AMR_HR(IS_OA, FMTP_PREFIX "mode-set=0,2,4", S(1))
#endif
/* All AMR rates, once with and once without octet-align=1 */
ALL_AMR(true, OSMO_SDP_STR_AMR_OCTET_ALIGN_1 ";"),
ALL_AMR(false, ""),
/* AMR-WB */
{
.sdp = {
.payload_type = 113,

View File

@ -873,7 +873,12 @@ struct codec_test {
#define SDP_CODECS_ALL_GSM \
{ \
"AMR:octet-align=1#112", \
"AMR:octet-align=1;mode-set=0,2,4,7#112", \
"AMR:octet-align=1;mode-set=7#114", \
"AMR:octet-align=1;mode-set=0,2,4#115", \
"AMR:mode-set=0,2,4,7#116", \
"AMR:mode-set=7#117", \
"AMR:mode-set=0,2,4#118", \
"GSM-EFR#110", \
"GSM#3", \
"GSM-HR-08#111", \
@ -881,7 +886,12 @@ struct codec_test {
#define SDP_CODECS_ALL_GSM_WITH_ODD_PT_NRS \
{ \
"AMR:octet-align=1#127", \
"AMR:octet-align=1;mode-set=0,2,4,7#127", \
"AMR:octet-align=1;mode-set=7#126", \
"AMR:octet-align=1;mode-set=0,2,4#125", \
"AMR:mode-set=0,2,4,7#124", \
"AMR:mode-set=7#123", \
"AMR:mode-set=0,2,4#122", \
"GSM-EFR#110", \
"GSM#3", \
"GSM-HR-08#111", \