From: jay98237438 <58031260+jay98237438@users.noreply.github.com> Date: Thu, 21 Nov 2019 12:42:54 +0000 (+0100) Subject: [mod_amrwb] RFC4867 mode-set compliancy X-Git-Tag: v1.10.3^2~2^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f7a424a263680ddcfd974548a61668779e093759;p=thirdparty%2Ffreeswitch.git [mod_amrwb] RFC4867 mode-set compliancy Yield to offered mode-set when set. From RFC4867: If a mode set was supplied in the offer, the answerer SHALL return the mode-set unmodified or reject the payload type. --- diff --git a/src/mod/codecs/mod_amrwb/mod_amrwb.c b/src/mod/codecs/mod_amrwb/mod_amrwb.c index 19cde02adf..89402dd807 100644 --- a/src/mod/codecs/mod_amrwb/mod_amrwb.c +++ b/src/mod/codecs/mod_amrwb/mod_amrwb.c @@ -189,7 +189,7 @@ static switch_status_t switch_amrwb_init(switch_codec_t *codec, switch_codec_fla #else struct amrwb_context *context = NULL; int encoding, decoding; - int x, i, argc; + int x, i, argc, fmtptmp_pos; char *argv[10]; char fmtptmp[128]; @@ -266,12 +266,24 @@ static switch_status_t switch_amrwb_init(switch_codec_t *codec, switch_codec_fla if (context->enc_modes) { /* choose the highest mode (bitrate) for high audio quality. */ - for (i = 8; i > -1; i--) { + for (i = SWITCH_AMRWB_MODES-2; i > -1; i--) { if (context->enc_modes & (1 << i)) { context->enc_mode = (switch_byte_t) i; break; } } + + /* re-create mode-set */ + fmtptmp_pos = switch_snprintf(fmtptmp, sizeof(fmtptmp), "mode-set="); + for (i = 0; SWITCH_AMRWB_MODES-1 > i; ++i) { + if (context->enc_modes & (1 << i)) { + fmtptmp_pos += switch_snprintf(fmtptmp + fmtptmp_pos, sizeof(fmtptmp) - fmtptmp_pos, fmtptmp_pos > strlen("mode-set=") ? ",%d" : "%d", i); + } + } + + } else { + /* use default mode-set */ + fmtptmp_pos = switch_snprintf(fmtptmp, sizeof(fmtptmp), "mode-set=%d", context->enc_mode); } if (globals.adjust_bitrate) { @@ -279,11 +291,11 @@ static switch_status_t switch_amrwb_init(switch_codec_t *codec, switch_codec_fla } if (!globals.volte) { - switch_snprintf(fmtptmp, sizeof(fmtptmp), "octet-align=%d; mode-set=%d", - switch_test_flag(context, AMRWB_OPT_OCTET_ALIGN) ? 1 : 0, context->enc_mode); + fmtptmp_pos += switch_snprintf(fmtptmp + fmtptmp_pos, sizeof(fmtptmp) - fmtptmp_pos, ";octet-align=%d", + switch_test_flag(context, AMRWB_OPT_OCTET_ALIGN) ? 1 : 0); } else { - switch_snprintf(fmtptmp, sizeof(fmtptmp), "octet-align=%d; mode-set=%d; max-red=0; mode-change-capability=2", - switch_test_flag(context, AMRWB_OPT_OCTET_ALIGN) ? 1 : 0, context->enc_mode); + fmtptmp_pos += switch_snprintf(fmtptmp + fmtptmp_pos, sizeof(fmtptmp) - fmtptmp_pos, ";octet-align=%d;max-red=0;mode-change-capability=2", + switch_test_flag(context, AMRWB_OPT_OCTET_ALIGN) ? 1 : 0); } codec->fmtp_out = switch_core_strdup(codec->memory_pool, fmtptmp);