diff options
author | Holger Hans Peter Freyther <holger@moiji-mobile.com> | 2015-08-14 15:43:06 +0200 |
---|---|---|
committer | Holger Hans Peter Freyther <holger@moiji-mobile.com> | 2015-08-14 15:43:06 +0200 |
commit | aeadf261e54d4e3987797b5818a8356441512568 (patch) | |
tree | f7a50b71838b0f868e9d8d4ad6871c4f3d4d9029 /openbsc/src/libmgcp/mgcp_sdp.c | |
parent | ca7d05bdb9e5be89442d6a2870e87919fdb11b98 (diff) |
mgcp: Allow to enforce that the codecs need to match
We have a lot of legacy that I am afraid to break. We have
everything in place to make a good codec selection (e.g. if
we can avoid transcoding, pick the one with best quality or
the lowest speed). Right now I have a specific case where
from all options I want to pick GSM. Guard the codec compat
check behind the disallow transcoding option to make sure
to not break legacy application.
Diffstat (limited to 'openbsc/src/libmgcp/mgcp_sdp.c')
-rw-r--r-- | openbsc/src/libmgcp/mgcp_sdp.c | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/openbsc/src/libmgcp/mgcp_sdp.c b/openbsc/src/libmgcp/mgcp_sdp.c index dc8708934..33837b9af 100644 --- a/openbsc/src/libmgcp/mgcp_sdp.c +++ b/openbsc/src/libmgcp/mgcp_sdp.c @@ -154,8 +154,23 @@ void codecs_update(void *ctx, struct sdp_rtp_map *codecs, int used, int payload, LOGP(DMGCP, LOGL_ERROR, "Unconfigured PT(%d) with %s\n", payload, audio_name); } +int is_codec_compatible(struct mgcp_endpoint *endp, struct sdp_rtp_map *codec) +{ + char *bts_codec; + char audio_codec[64]; + + /* + * GSM, GSM/8000 and GSM/8000/1 should all be compatible.. let's go + * by name first. + */ + bts_codec = endp->tcfg->audio_name; + if (sscanf(bts_codec, "%63[^/]/%*d/%*d", audio_codec) < 1) + return 0; + + return strcasecmp(audio_codec, codec->codec_name) == 0; +} -int mgcp_parse_sdp_data(struct mgcp_rtp_end *rtp, struct mgcp_parse_data *p) +int mgcp_parse_sdp_data(struct mgcp_endpoint *endp, struct mgcp_rtp_end *rtp, struct mgcp_parse_data *p) { struct sdp_rtp_map codecs[10]; int codecs_used = 0; @@ -243,6 +258,14 @@ int mgcp_parse_sdp_data(struct mgcp_rtp_end *rtp, struct mgcp_parse_data *p) for (i = 0; i < codecs_used && codecs_assigned < 2; ++i) { struct mgcp_rtp_codec *codec = codecs_assigned == 0 ? &rtp->codec : &rtp->alt_codec; + + if (endp->tcfg->no_audio_transcoding && + !is_codec_compatible(endp, &codecs[i])) { + LOGP(DMGCP, LOGL_NOTICE, "Skipping codec %s\n", + codecs[i].codec_name); + continue; + } + mgcp_set_audio_info(p->cfg, codec, codecs[i].payload_type, codecs[i].map_line); |