+static int media_parameters_changed(LinphoneCall *call, SalMediaDescription *oldmd, SalMediaDescription *newmd) {
+ if (call->params.in_conference != call->current_params.in_conference) return SAL_MEDIA_DESCRIPTION_CHANGED;
+ if (call->up_bw != linphone_core_get_upload_bandwidth(call->core)) return SAL_MEDIA_DESCRIPTION_CHANGED;
+ return sal_media_description_equals(oldmd, newmd);
+}
+
+void linphone_core_update_streams_destinations(LinphoneCore *lc, LinphoneCall *call, SalMediaDescription *old_md, SalMediaDescription *new_md) {
+ SalStreamDescription *old_audiodesc = NULL;
+ SalStreamDescription *old_videodesc = NULL;
+ SalStreamDescription *new_audiodesc = NULL;
+ SalStreamDescription *new_videodesc = NULL;
+ char *rtp_addr, *rtcp_addr;
+ int i;
+
+ for (i = 0; i < old_md->nstreams; i++) {
+ if (old_md->streams[i].type == SalAudio) {
+ old_audiodesc = &old_md->streams[i];
+ } else if (old_md->streams[i].type == SalVideo) {
+ old_videodesc = &old_md->streams[i];
+ }
+ }
+ for (i = 0; i < new_md->nstreams; i++) {
+ if (new_md->streams[i].type == SalAudio) {
+ new_audiodesc = &new_md->streams[i];
+ } else if (new_md->streams[i].type == SalVideo) {
+ new_videodesc = &new_md->streams[i];
+ }
+ }
+ if (call->audiostream && new_audiodesc) {
+ rtp_addr = (new_audiodesc->rtp_addr[0] != '\0') ? new_audiodesc->rtp_addr : new_md->addr;
+ rtcp_addr = (new_audiodesc->rtcp_addr[0] != '\0') ? new_audiodesc->rtcp_addr : new_md->addr;
+ ms_message("Change audio stream destination: RTP=%s:%d RTCP=%s:%d", rtp_addr, new_audiodesc->rtp_port, rtcp_addr, new_audiodesc->rtcp_port);
+ rtp_session_set_remote_addr_full(call->audiostream->session, rtp_addr, new_audiodesc->rtp_port, rtcp_addr, new_audiodesc->rtcp_port);
+ }
+#ifdef VIDEO_ENABLED
+ if (call->videostream && new_videodesc) {
+ rtp_addr = (new_videodesc->rtp_addr[0] != '\0') ? new_videodesc->rtp_addr : new_md->addr;
+ rtcp_addr = (new_videodesc->rtcp_addr[0] != '\0') ? new_videodesc->rtcp_addr : new_md->addr;
+ ms_message("Change video stream destination: RTP=%s:%d RTCP=%s:%d", rtp_addr, new_videodesc->rtp_port, rtcp_addr, new_videodesc->rtcp_port);
+ rtp_session_set_remote_addr_full(call->videostream->session, rtp_addr, new_videodesc->rtp_port, rtcp_addr, new_videodesc->rtcp_port);
+ }
+#endif
+
+ /* Copy address and port values from new_md to old_md since we will keep old_md as resultdesc */
+ strcpy(old_md->addr, new_md->addr);
+ if (old_audiodesc && new_audiodesc) {
+ strcpy(old_audiodesc->rtp_addr, new_audiodesc->rtp_addr);
+ strcpy(old_audiodesc->rtcp_addr, new_audiodesc->rtcp_addr);
+ old_audiodesc->rtp_port = new_audiodesc->rtp_port;
+ old_audiodesc->rtcp_port = new_audiodesc->rtcp_port;
+ }
+ if (old_videodesc && new_videodesc) {
+ strcpy(old_videodesc->rtp_addr, new_videodesc->rtp_addr);
+ strcpy(old_videodesc->rtcp_addr, new_videodesc->rtcp_addr);
+ old_videodesc->rtp_port = new_videodesc->rtp_port;
+ old_videodesc->rtcp_port = new_videodesc->rtcp_port;
+ }