Merge pull request #133 from jay98237438/master
[mod_amr, mod_amrwb] RFC4867 mode-set compliancy
This commit is contained in:
commit
5b1088d39f
|
@ -246,7 +246,7 @@ static switch_status_t switch_amr_init(switch_codec_t *codec, switch_codec_flag_
|
||||||
switch_codec_fmtp_t codec_fmtp;
|
switch_codec_fmtp_t codec_fmtp;
|
||||||
amr_codec_settings_t amr_codec_settings = { 0 };
|
amr_codec_settings_t amr_codec_settings = { 0 };
|
||||||
int encoding, decoding;
|
int encoding, decoding;
|
||||||
int x, i, argc;
|
int x, i, argc, fmtptmp_pos;
|
||||||
char *argv[10];
|
char *argv[10];
|
||||||
char fmtptmp[128];
|
char fmtptmp[128];
|
||||||
|
|
||||||
|
@ -332,25 +332,38 @@ static switch_status_t switch_amr_init(switch_codec_t *codec, switch_codec_flag_
|
||||||
|
|
||||||
if (context->enc_modes) {
|
if (context->enc_modes) {
|
||||||
/* choose the highest mode (bitrate) for high audio quality */
|
/* choose the highest mode (bitrate) for high audio quality */
|
||||||
for (i = 7; i > -1; i--) {
|
for (i = SWITCH_AMR_MODES-2; i > -1; i--) {
|
||||||
if (context->enc_modes & (1 << i)) {
|
if (context->enc_modes & (1 << i)) {
|
||||||
context->enc_mode = (switch_byte_t) i;
|
context->enc_mode = (switch_byte_t) i;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* re-create mode-set */
|
||||||
|
fmtptmp_pos = switch_snprintf(fmtptmp, sizeof(fmtptmp), "mode-set=");
|
||||||
|
for (i = 0; SWITCH_AMR_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) {
|
if (globals.adjust_bitrate) {
|
||||||
switch_set_flag(codec, SWITCH_CODEC_FLAG_HAS_ADJ_BITRATE);
|
switch_set_flag(codec, SWITCH_CODEC_FLAG_HAS_ADJ_BITRATE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (!globals.volte) {
|
if (!globals.volte) {
|
||||||
switch_snprintf(fmtptmp, sizeof(fmtptmp), "octet-align=%d; mode-set=%d", switch_test_flag(context, AMR_OPT_OCTET_ALIGN) ? 1 : 0,
|
fmtptmp_pos += switch_snprintf(fmtptmp + fmtptmp_pos, sizeof(fmtptmp) - fmtptmp_pos, ";octet-align=%d", switch_test_flag(context, AMR_OPT_OCTET_ALIGN) ? 1 : 0);
|
||||||
context->enc_mode);
|
|
||||||
} else {
|
} else {
|
||||||
/* some UEs reject the call with 488 if mode-change-capability is not 2 */
|
/* some UEs reject the call with 488 if mode-change-capability is not 2 */
|
||||||
switch_snprintf(fmtptmp, sizeof(fmtptmp), "octet-align=%d; mode-set=%d; max-red=0; mode-change-capability=2",
|
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, AMR_OPT_OCTET_ALIGN) ? 1 : 0, context->enc_mode);
|
switch_test_flag(context, AMR_OPT_OCTET_ALIGN) ? 1 : 0);
|
||||||
}
|
}
|
||||||
codec->fmtp_out = switch_core_strdup(codec->memory_pool, fmtptmp);
|
codec->fmtp_out = switch_core_strdup(codec->memory_pool, fmtptmp);
|
||||||
|
|
||||||
|
|
|
@ -189,7 +189,7 @@ static switch_status_t switch_amrwb_init(switch_codec_t *codec, switch_codec_fla
|
||||||
#else
|
#else
|
||||||
struct amrwb_context *context = NULL;
|
struct amrwb_context *context = NULL;
|
||||||
int encoding, decoding;
|
int encoding, decoding;
|
||||||
int x, i, argc;
|
int x, i, argc, fmtptmp_pos;
|
||||||
char *argv[10];
|
char *argv[10];
|
||||||
char fmtptmp[128];
|
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) {
|
if (context->enc_modes) {
|
||||||
/* choose the highest mode (bitrate) for high audio quality. */
|
/* 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)) {
|
if (context->enc_modes & (1 << i)) {
|
||||||
context->enc_mode = (switch_byte_t) i;
|
context->enc_mode = (switch_byte_t) i;
|
||||||
break;
|
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) {
|
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) {
|
if (!globals.volte) {
|
||||||
switch_snprintf(fmtptmp, sizeof(fmtptmp), "octet-align=%d; mode-set=%d",
|
fmtptmp_pos += switch_snprintf(fmtptmp + fmtptmp_pos, sizeof(fmtptmp) - fmtptmp_pos, ";octet-align=%d",
|
||||||
switch_test_flag(context, AMRWB_OPT_OCTET_ALIGN) ? 1 : 0, context->enc_mode);
|
switch_test_flag(context, AMRWB_OPT_OCTET_ALIGN) ? 1 : 0);
|
||||||
} else {
|
} else {
|
||||||
switch_snprintf(fmtptmp, sizeof(fmtptmp), "octet-align=%d; mode-set=%d; max-red=0; mode-change-capability=2",
|
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, context->enc_mode);
|
switch_test_flag(context, AMRWB_OPT_OCTET_ALIGN) ? 1 : 0);
|
||||||
}
|
}
|
||||||
codec->fmtp_out = switch_core_strdup(codec->memory_pool, fmtptmp);
|
codec->fmtp_out = switch_core_strdup(codec->memory_pool, fmtptmp);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue