]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
[mod_amrwb] RFC4867 mode-set compliancy 133/head
authorjay98237438 <58031260+jay98237438@users.noreply.github.com>
Thu, 21 Nov 2019 12:42:54 +0000 (13:42 +0100)
committerjorgen <jorgen@netclient.no>
Thu, 21 Nov 2019 13:54:40 +0000 (13:54 +0000)
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.

src/mod/codecs/mod_amrwb/mod_amrwb.c

index 19cde02adf71a2ec418acbeb605829a7f4e3ff5c..89402dd807819aceea655c4ee71987bd536c5ad5 100644 (file)
@@ -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);