Fix 0002202: ICE fails again.

This commit is contained in:
Ghislain MARY 2015-04-17 16:06:49 +02:00
parent da924cdece
commit f53864f9c0
4 changed files with 72 additions and 63 deletions

View file

@ -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;

View file

@ -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;

View file

@ -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);

View file

@ -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 },