diff --git a/coreapi/callbacks.c b/coreapi/callbacks.c index 584191cc4..95d5b81af 100644 --- a/coreapi/callbacks.c +++ b/coreapi/callbacks.c @@ -46,6 +46,9 @@ void linphone_core_update_streams(LinphoneCore *lc, LinphoneCall *call, SalMedia call->media_pending=TRUE; } call->resultdesc=new_md; + if (call->ice_session != NULL) { + linphone_core_deactivate_ice_for_deactivated_media_streams(call, call->resultdesc); + } if (call->audiostream && call->audiostream->ticker){ /* we already started media: check if we really need to restart it*/ if (oldmd){ diff --git a/coreapi/misc.c b/coreapi/misc.c index 3f48b419b..a65793350 100644 --- a/coreapi/misc.c +++ b/coreapi/misc.c @@ -813,6 +813,17 @@ void linphone_core_update_ice_from_remote_media_description(LinphoneCall *call, } } +void linphone_core_deactivate_ice_for_deactivated_media_streams(LinphoneCall *call, const SalMediaDescription *md) +{ + int i; + for (i = 0; i < md->nstreams; i++) { + IceCheckList *cl = ice_session_check_list(call->ice_session, i); + if (cl && (md->streams[i].rtp_port == 0)) { + if (cl->state != ICL_Completed) ice_check_list_set_state(cl, ICL_Failed); + } + } +} + LinphoneCall * is_a_linphone_call(void *user_pointer){ LinphoneCall *call=(LinphoneCall*)user_pointer; if (call==NULL) return NULL; diff --git a/coreapi/private.h b/coreapi/private.h index a68615e36..b102dc7b5 100644 --- a/coreapi/private.h +++ b/coreapi/private.h @@ -224,6 +224,7 @@ void linphone_core_run_stun_tests(LinphoneCore *lc, LinphoneCall *call); int linphone_core_gather_ice_candidates(LinphoneCore *lc, LinphoneCall *call); void linphone_core_update_local_media_description_from_ice(SalMediaDescription *desc, IceSession *session); void linphone_core_update_ice_from_remote_media_description(LinphoneCall *call, const SalMediaDescription *md); +void linphone_core_deactivate_ice_for_deactivated_media_streams(LinphoneCall *call, const SalMediaDescription *md); void linphone_core_send_initial_subscribes(LinphoneCore *lc); void linphone_core_write_friends_config(LinphoneCore* lc);