FS-5883 --resolve
This commit is contained in:
parent
67c0f489bc
commit
d98a1eb4f3
|
@ -718,6 +718,8 @@ struct private_object {
|
||||||
sofia_private_t *sofia_private;
|
sofia_private_t *sofia_private;
|
||||||
uint8_t flags[TFLAG_MAX];
|
uint8_t flags[TFLAG_MAX];
|
||||||
switch_payload_t agreed_pt;
|
switch_payload_t agreed_pt;
|
||||||
|
int channels;
|
||||||
|
int adv_channels;
|
||||||
switch_payload_t audio_recv_pt;
|
switch_payload_t audio_recv_pt;
|
||||||
switch_payload_t video_recv_pt;
|
switch_payload_t video_recv_pt;
|
||||||
switch_core_session_t *session;
|
switch_core_session_t *session;
|
||||||
|
|
|
@ -39,6 +39,15 @@
|
||||||
switch_cache_db_handle_t *_sofia_glue_get_db_handle(sofia_profile_t *profile, const char *file, const char *func, int line);
|
switch_cache_db_handle_t *_sofia_glue_get_db_handle(sofia_profile_t *profile, const char *file, const char *func, int line);
|
||||||
#define sofia_glue_get_db_handle(_p) _sofia_glue_get_db_handle(_p, __FILE__, __SWITCH_FUNC__, __LINE__)
|
#define sofia_glue_get_db_handle(_p) _sofia_glue_get_db_handle(_p, __FILE__, __SWITCH_FUNC__, __LINE__)
|
||||||
|
|
||||||
|
static int get_channels(const switch_codec_implementation_t *imp)
|
||||||
|
{
|
||||||
|
if (!strcasecmp(imp->iananame, "opus")) {
|
||||||
|
return 2; /* IKR???*/
|
||||||
|
}
|
||||||
|
|
||||||
|
return imp->number_of_channels;
|
||||||
|
}
|
||||||
|
|
||||||
void sofia_glue_set_udptl_image_sdp(private_object_t *tech_pvt, switch_t38_options_t *t38_options, int insist)
|
void sofia_glue_set_udptl_image_sdp(private_object_t *tech_pvt, switch_t38_options_t *t38_options, int insist)
|
||||||
{
|
{
|
||||||
char buf[2048] = "";
|
char buf[2048] = "";
|
||||||
|
@ -308,7 +317,14 @@ static void generate_m(private_object_t *tech_pvt, char *buf, size_t buflen,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tech_pvt->ianacodes[i] > 95 || verbose_sdp) {
|
if (tech_pvt->ianacodes[i] > 95 || verbose_sdp) {
|
||||||
switch_snprintf(buf + strlen(buf), buflen - strlen(buf), "a=rtpmap:%d %s/%d\n", tech_pvt->ianacodes[i], imp->iananame, rate);
|
int channels = get_channels(imp);
|
||||||
|
|
||||||
|
if (channels > 1) {
|
||||||
|
switch_snprintf(buf + strlen(buf), buflen - strlen(buf), "a=rtpmap:%d %s/%d/%d\n", tech_pvt->ianacodes[i], imp->iananame, rate, channels);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
switch_snprintf(buf + strlen(buf), buflen - strlen(buf), "a=rtpmap:%d %s/%d\n", tech_pvt->ianacodes[i], imp->iananame, rate);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fmtp) {
|
if (fmtp) {
|
||||||
|
@ -530,7 +546,15 @@ void sofia_glue_set_local_sdp(private_object_t *tech_pvt, const char *ip, switch
|
||||||
switch_snprintf(buf + strlen(buf), SDPBUFLEN - strlen(buf), "\n");
|
switch_snprintf(buf + strlen(buf), SDPBUFLEN - strlen(buf), "\n");
|
||||||
|
|
||||||
rate = tech_pvt->rm_rate;
|
rate = tech_pvt->rm_rate;
|
||||||
switch_snprintf(buf + strlen(buf), SDPBUFLEN - strlen(buf), "a=rtpmap:%d %s/%d\n", tech_pvt->agreed_pt, tech_pvt->rm_encoding, rate);
|
|
||||||
|
if (tech_pvt->adv_channels > 1) {
|
||||||
|
switch_snprintf(buf + strlen(buf), SDPBUFLEN - strlen(buf), "a=rtpmap:%d %s/%d/%d\n",
|
||||||
|
tech_pvt->agreed_pt, tech_pvt->rm_encoding, rate, tech_pvt->adv_channels);
|
||||||
|
} else {
|
||||||
|
switch_snprintf(buf + strlen(buf), SDPBUFLEN - strlen(buf), "a=rtpmap:%d %s/%d\n",
|
||||||
|
tech_pvt->agreed_pt, tech_pvt->rm_encoding, rate);
|
||||||
|
}
|
||||||
|
|
||||||
if (fmtp_out) {
|
if (fmtp_out) {
|
||||||
switch_snprintf(buf + strlen(buf), SDPBUFLEN - strlen(buf), "a=fmtp:%d %s\n", tech_pvt->agreed_pt, fmtp_out);
|
switch_snprintf(buf + strlen(buf), SDPBUFLEN - strlen(buf), "a=fmtp:%d %s\n", tech_pvt->agreed_pt, fmtp_out);
|
||||||
}
|
}
|
||||||
|
@ -735,6 +759,7 @@ void sofia_glue_set_local_sdp(private_object_t *tech_pvt, const char *ip, switch
|
||||||
const switch_codec_implementation_t *imp = tech_pvt->codecs[i];
|
const switch_codec_implementation_t *imp = tech_pvt->codecs[i];
|
||||||
char *fmtp = NULL;
|
char *fmtp = NULL;
|
||||||
uint32_t ianacode = tech_pvt->ianacodes[i];
|
uint32_t ianacode = tech_pvt->ianacodes[i];
|
||||||
|
int channels = 1;
|
||||||
|
|
||||||
if (imp->codec_type != SWITCH_CODEC_TYPE_VIDEO) {
|
if (imp->codec_type != SWITCH_CODEC_TYPE_VIDEO) {
|
||||||
continue;
|
continue;
|
||||||
|
@ -751,9 +776,15 @@ void sofia_glue_set_local_sdp(private_object_t *tech_pvt, const char *ip, switch
|
||||||
rate = imp->samples_per_second;
|
rate = imp->samples_per_second;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
channels = get_channels(imp);
|
||||||
switch_snprintf(buf + strlen(buf), SDPBUFLEN - strlen(buf), "a=rtpmap:%d %s/%d\n", ianacode, imp->iananame,
|
|
||||||
imp->samples_per_second);
|
if (channels > 1) {
|
||||||
|
switch_snprintf(buf + strlen(buf), SDPBUFLEN - strlen(buf), "a=rtpmap:%d %s/%d/%d\n", ianacode, imp->iananame,
|
||||||
|
imp->samples_per_second, channels);
|
||||||
|
} else {
|
||||||
|
switch_snprintf(buf + strlen(buf), SDPBUFLEN - strlen(buf), "a=rtpmap:%d %s/%d\n", ianacode, imp->iananame,
|
||||||
|
imp->samples_per_second);
|
||||||
|
}
|
||||||
|
|
||||||
if (!zstr(ov_fmtp)) {
|
if (!zstr(ov_fmtp)) {
|
||||||
fmtp = (char *) ov_fmtp;
|
fmtp = (char *) ov_fmtp;
|
||||||
|
@ -5314,6 +5345,23 @@ uint8_t sofia_glue_negotiate_sdp(switch_core_session_t *session, const char *r_s
|
||||||
switch_channel_set_variable(tech_pvt->channel, SWITCH_REMOTE_MEDIA_IP_VARIABLE, tech_pvt->remote_sdp_audio_ip);
|
switch_channel_set_variable(tech_pvt->channel, SWITCH_REMOTE_MEDIA_IP_VARIABLE, tech_pvt->remote_sdp_audio_ip);
|
||||||
switch_channel_set_variable(tech_pvt->channel, SWITCH_REMOTE_MEDIA_PORT_VARIABLE, tmp);
|
switch_channel_set_variable(tech_pvt->channel, SWITCH_REMOTE_MEDIA_PORT_VARIABLE, tmp);
|
||||||
tech_pvt->audio_recv_pt = (switch_payload_t)map->rm_pt;
|
tech_pvt->audio_recv_pt = (switch_payload_t)map->rm_pt;
|
||||||
|
|
||||||
|
if (!strcasecmp((char *) map->rm_encoding, "opus")) {
|
||||||
|
if (tech_pvt->channels == 1) {
|
||||||
|
switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_WARNING, "Invalid SDP for opus. Don't ask.. but it needs a /2\n");
|
||||||
|
tech_pvt->adv_channels = 1;
|
||||||
|
} else {
|
||||||
|
tech_pvt->adv_channels = 2; /* IKR ???*/
|
||||||
|
}
|
||||||
|
if (!zstr((char *) map->rm_fmtp) && switch_stristr("stereo=1", (char *) map->rm_fmtp)) {
|
||||||
|
tech_pvt->channels = 2;
|
||||||
|
} else {
|
||||||
|
tech_pvt->channels = 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
tech_pvt->adv_channels = tech_pvt->channels;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if (!switch_true(mirror) &&
|
if (!switch_true(mirror) &&
|
||||||
switch_channel_direction(channel) == SWITCH_CALL_DIRECTION_OUTBOUND &&
|
switch_channel_direction(channel) == SWITCH_CALL_DIRECTION_OUTBOUND &&
|
||||||
|
|
Loading…
Reference in New Issue