diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index cde6f8767..93df26f22 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -3795,6 +3795,7 @@ int linphone_core_accept_call_with_params(LinphoneCore *lc, LinphoneCall *call, } linphone_call_update_remote_session_id_and_ver(call); + linphone_call_stop_ice_for_inactive_streams(call->localdesc, call->ice_session); sal_call_accept(call->op); linphone_core_notify_display_status(lc,_("Connected.")); lc->current_call=call; diff --git a/coreapi/misc.c b/coreapi/misc.c index 9d3d76989..080175a6c 100644 --- a/coreapi/misc.c +++ b/coreapi/misc.c @@ -716,8 +716,21 @@ void linphone_core_update_ice_state_in_call_stats(LinphoneCall *call) linphone_ice_state_to_string(call->stats[LINPHONE_CALL_STATS_AUDIO].ice_state), linphone_ice_state_to_string(call->stats[LINPHONE_CALL_STATS_VIDEO].ice_state)); } -void _update_local_media_description_from_ice(SalMediaDescription *desc, IceSession *session) -{ +void linphone_call_stop_ice_for_inactive_streams(SalMediaDescription *desc, IceSession *session) { + int i; + + if (session == NULL) return; + if (ice_session_state(session) == IS_Completed) return; + + for (i = 0; i < SAL_MEDIA_DESCRIPTION_MAX_STREAMS; i++) { + IceCheckList *cl = ice_session_check_list(session, i); + if (!sal_stream_description_active(&desc->streams[i]) && cl) { + ice_session_remove_check_list(session, cl); + } + } +} + +void _update_local_media_description_from_ice(SalMediaDescription *desc, IceSession *session) { const char *rtp_addr, *rtcp_addr; IceSessionState session_state = ice_session_state(session); int nb_candidates; diff --git a/coreapi/private.h b/coreapi/private.h index 7daed803e..a1751da5f 100644 --- a/coreapi/private.h +++ b/coreapi/private.h @@ -396,6 +396,7 @@ void linphone_core_adapt_to_network(LinphoneCore *lc, int ping_time_ms, Linphone int linphone_core_gather_ice_candidates(LinphoneCore *lc, LinphoneCall *call); void linphone_core_update_ice_state_in_call_stats(LinphoneCall *call); void linphone_call_stats_fill(LinphoneCallStats *stats, MediaStream *ms, OrtpEvent *ev); +void linphone_call_stop_ice_for_inactive_streams(SalMediaDescription *desc, IceSession *session); void _update_local_media_description_from_ice(SalMediaDescription *desc, IceSession *session); void linphone_call_update_local_media_description_from_ice_or_upnp(LinphoneCall *call); void linphone_call_update_ice_from_remote_media_description(LinphoneCall *call, const SalMediaDescription *md); diff --git a/tester/call_tester.c b/tester/call_tester.c index 253f83bdf..1b0b0ede2 100644 --- a/tester/call_tester.c +++ b/tester/call_tester.c @@ -1870,80 +1870,73 @@ static void call_with_ice_video_to_novideo(void) { linphone_core_manager_destroy(pauline); } -static void call_with_ice_video_added(void) { - LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); - LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); - LinphoneVideoPolicy vpol={0}; +static void _call_with_ice_video(LinphoneVideoPolicy caller_policy, LinphoneVideoPolicy callee_policy, + bool_t video_added_by_caller, bool_t video_added_by_callee, bool_t video_removed_by_caller, bool_t video_removed_by_callee) { + LinphoneCoreManager *marie = linphone_core_manager_new("marie_rc"); + LinphoneCoreManager *pauline = linphone_core_manager_new("pauline_rc"); bool_t call_ok; - linphone_core_set_video_policy(pauline->lc,&vpol); - linphone_core_set_video_policy(marie->lc,&vpol); + linphone_core_set_video_policy(pauline->lc, &caller_policy); + linphone_core_set_video_policy(marie->lc, &callee_policy); + linphone_core_set_firewall_policy(marie->lc, LinphonePolicyUseIce); + linphone_core_set_firewall_policy(pauline->lc, LinphonePolicyUseIce); - linphone_core_set_firewall_policy(marie->lc,LinphonePolicyUseIce); + linphone_core_set_audio_port(marie->lc, -1); + linphone_core_set_video_port(marie->lc, -1); + linphone_core_set_audio_port(pauline->lc, -1); + linphone_core_set_video_port(pauline->lc, -1); - linphone_core_set_firewall_policy(pauline->lc,LinphonePolicyUseIce); + CU_ASSERT_TRUE(call_ok = call(pauline, marie)); + if (!call_ok) goto end; + CU_ASSERT_TRUE(check_ice(pauline, marie, LinphoneIceStateHostConnection)); + CU_ASSERT_EQUAL(linphone_call_params_video_enabled(linphone_call_get_current_params(linphone_core_get_current_call(pauline->lc))), callee_policy.automatically_accept); - if (1){ - linphone_core_set_audio_port(marie->lc,-1); - linphone_core_set_video_port(marie->lc,-1); - linphone_core_set_audio_port(pauline->lc,-1); - linphone_core_set_video_port(pauline->lc,-1); + /* Wait for ICE reINVITEs to complete. */ + CU_ASSERT_TRUE(wait_for(pauline->lc, marie->lc, &pauline->stat.number_of_LinphoneCallStreamsRunning, 2) + && wait_for(pauline->lc, pauline->lc, &marie->stat.number_of_LinphoneCallStreamsRunning, 2)); + + if (video_added_by_caller) { + CU_ASSERT_TRUE(add_video(pauline, marie)); + } else if (video_added_by_callee) { + CU_ASSERT_TRUE(add_video(marie, pauline)); + } + if (video_added_by_caller || video_added_by_callee) { + CU_ASSERT_TRUE(check_ice(pauline, marie, LinphoneIceStateHostConnection)); + CU_ASSERT_TRUE(linphone_call_params_video_enabled(linphone_call_get_current_params(linphone_core_get_current_call(pauline->lc)))); + CU_ASSERT_TRUE(linphone_call_params_video_enabled(linphone_call_get_current_params(linphone_core_get_current_call(marie->lc)))); + } + + if (video_removed_by_caller) { + CU_ASSERT_TRUE(remove_video(pauline, marie)); + } else if (video_removed_by_callee) { + CU_ASSERT_TRUE(remove_video(marie, pauline)); + } + if (video_removed_by_caller || video_removed_by_callee) { + CU_ASSERT_TRUE(check_ice(pauline, marie, LinphoneIceStateHostConnection)); + CU_ASSERT_FALSE(linphone_call_params_video_enabled(linphone_call_get_current_params(linphone_core_get_current_call(pauline->lc)))); + CU_ASSERT_FALSE(linphone_call_params_video_enabled(linphone_call_get_current_params(linphone_core_get_current_call(marie->lc)))); } - CU_ASSERT_TRUE(call_ok=call(pauline,marie)); - if (!call_ok) goto end; - CU_ASSERT_TRUE(check_ice(pauline,marie,LinphoneIceStateHostConnection)); - /*wait for ICE reINVITEs to complete*/ - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallStreamsRunning,2) - && - wait_for(pauline->lc,pauline->lc,&marie->stat.number_of_LinphoneCallStreamsRunning,2)); - CU_ASSERT_TRUE(add_video(pauline,marie)); - CU_ASSERT_TRUE(check_ice(pauline,marie,LinphoneIceStateHostConnection)); end: linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); } -static void call_with_ice_video_added2(void) { - LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); - LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); - LinphoneVideoPolicy vpol={TRUE,TRUE}; - bool_t call_ok; - - linphone_core_enable_video_capture(marie->lc, TRUE); - linphone_core_enable_video_display(marie->lc, TRUE); - - linphone_core_enable_video_capture(pauline->lc, TRUE); - linphone_core_enable_video_display(pauline->lc, TRUE); - - linphone_core_set_video_policy(pauline->lc,&vpol); - vpol.automatically_accept=FALSE; - vpol.automatically_initiate=FALSE; - linphone_core_set_video_policy(marie->lc,&vpol); +static void call_with_ice_video_added(void) { + LinphoneVideoPolicy vpol = { FALSE, FALSE }; + _call_with_ice_video(vpol, vpol, TRUE, FALSE, TRUE, FALSE); +} - linphone_core_set_firewall_policy(marie->lc,LinphonePolicyUseIce); - linphone_core_set_firewall_policy(pauline->lc,LinphonePolicyUseIce); +static void call_with_ice_video_added_2(void) { + LinphoneVideoPolicy caller_policy = { TRUE, TRUE }; + LinphoneVideoPolicy callee_policy = { FALSE, FALSE }; + _call_with_ice_video(caller_policy, callee_policy, TRUE, FALSE, FALSE, TRUE); +} - if (1){ - linphone_core_set_audio_port(marie->lc,-1); - linphone_core_set_video_port(marie->lc,-1); - linphone_core_set_audio_port(pauline->lc,-1); - linphone_core_set_video_port(pauline->lc,-1); - } - - CU_ASSERT_TRUE(call_ok=call(pauline,marie)); - if (!call_ok) goto end; - CU_ASSERT_TRUE(check_ice(pauline,marie,LinphoneIceStateHostConnection)); - CU_ASSERT_FALSE(linphone_call_params_video_enabled(linphone_call_get_current_params(linphone_core_get_current_call(pauline->lc)))); - /*wait for ICE reINVITEs to complete*/ - CU_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallStreamsRunning,2) - && - wait_for(pauline->lc,pauline->lc,&marie->stat.number_of_LinphoneCallStreamsRunning,2)); - CU_ASSERT_TRUE(add_video(pauline,marie)); - CU_ASSERT_TRUE(check_ice(pauline,marie,LinphoneIceStateHostConnection)); -end: - linphone_core_manager_destroy(marie); - linphone_core_manager_destroy(pauline); +static void call_with_ice_video_added_3(void) { + LinphoneVideoPolicy caller_policy = { TRUE, TRUE }; + LinphoneVideoPolicy callee_policy = { FALSE, FALSE }; + _call_with_ice_video(caller_policy, callee_policy, FALSE, TRUE, TRUE, FALSE); } @@ -4070,7 +4063,8 @@ test_t call_tests[] = { { "Call with multiple early media", multiple_early_media }, { "Call with ICE from video to non-video", call_with_ice_video_to_novideo}, { "Call with ICE and video added", call_with_ice_video_added }, - { "Call with ICE and video added 2", call_with_ice_video_added2 }, + { "Call with ICE and video added 2", call_with_ice_video_added_2 }, + { "Call with ICE and video added 3", call_with_ice_video_added_3 }, { "Video call with ICE accepted using call params",video_call_ice_params}, { "Video call recording", video_call_recording_test }, { "Snapshot", video_call_snapshot },