From 47b52bbcdbeb81bdfcbaedbed5e53e3f4f5f3723 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Tue, 17 Jul 2012 15:02:44 +0200 Subject: [PATCH] Allocate ICE session and check lists for each stream when ICE is enabled. --- coreapi/linphonecall.c | 33 +++++++++++++++++++++++++++++++-- coreapi/private.h | 2 ++ coreapi/sal.h | 2 ++ 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index ec006dd5..f533711c 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -245,6 +245,10 @@ static SalMediaDescription *_create_local_media_description(LinphoneCore *lc, Li md->streams[i].crypto[1].algo = 0; md->streams[i].crypto[2].algo = 0; } + if (linphone_core_get_firewall_policy(call->core) == LinphonePolicyUseIce){ + md->streams[i].ice_check_list = ice_check_list_new(); + ice_session_add_check_list(call->ice_session, md->streams[i].ice_check_list); + } } linphone_address_destroy(addr); @@ -338,10 +342,19 @@ LinphoneCall * linphone_call_new_outgoing(struct _LinphoneCore *lc, LinphoneAddr linphone_core_get_local_ip(lc,linphone_address_get_domain(to),call->localip); linphone_call_init_common(call,from,to); call->params=*params; + if (linphone_core_get_firewall_policy(call->core) == LinphonePolicyUseIce) call->ice_session=ice_session_new(); call->localdesc=create_local_media_description (lc,call); call->camera_active=params->has_video; - if (linphone_core_get_firewall_policy(call->core)==LinphonePolicyUseStun) - linphone_core_run_stun_tests(call->core,call); + switch (linphone_core_get_firewall_policy(call->core)) { + case LinphonePolicyUseStun: + linphone_core_run_stun_tests(call->core,call); + break; + case LinphonePolicyUseIce: + ms_error("Gather ICE candidates"); + break; + default: + break; + } discover_mtu(lc,linphone_address_get_domain (to)); if (params->referer){ sal_call_set_referer(call->op,params->referer->op); @@ -525,6 +538,10 @@ static void linphone_call_destroy(LinphoneCall *obj) sal_op_release(obj->op); obj->op=NULL; } + if (obj->ice_session!=NULL) { + ice_session_destroy(obj->ice_session); + obj->ice_session=NULL; + } if (obj->resultdesc!=NULL) { sal_media_description_unref(obj->resultdesc); obj->resultdesc=NULL; @@ -937,6 +954,11 @@ void linphone_call_init_media_streams(LinphoneCall *call){ RtpTransport *artcp=lc->rtptf->audio_rtcp_func(lc->rtptf->audio_rtcp_func_data, call->audio_port+1); rtp_session_set_transports(audiostream->session,artp,artcp); } + if (linphone_core_get_firewall_policy(lc) == LinphonePolicyUseIce){ + rtp_session_set_pktinfo(audiostream->session,TRUE); + audiostream->ice_check_list = call->localdesc->streams[0].ice_check_list; + ice_check_list_register_success_cb(audiostream->ice_check_list, audio_stream_set_remote_from_ice, audiostream); + } call->audiostream_app_evq = ortp_ev_queue_new(); rtp_session_register_event_queue(audiostream->session,call->audiostream_app_evq); @@ -957,6 +979,11 @@ void linphone_call_init_media_streams(LinphoneCall *call){ RtpTransport *vrtcp=lc->rtptf->video_rtcp_func(lc->rtptf->video_rtcp_func_data, call->video_port+1); rtp_session_set_transports(call->videostream->session,vrtp,vrtcp); } + if (linphone_core_get_firewall_policy(lc) == LinphonePolicyUseIce){ + rtp_session_set_pktinfo(call->videostream->session,TRUE); + call->videostream->ice_check_list = call->localdesc->streams[1].ice_check_list; + ice_check_list_register_success_cb(call->videostream->ice_check_list, video_stream_set_remote_from_ice, call->videostream); + } call->videostream_app_evq = ortp_ev_queue_new(); rtp_session_register_event_queue(call->videostream->session,call->videostream_app_evq); #ifdef TEST_EXT_RENDERER @@ -1436,6 +1463,7 @@ void linphone_call_stop_media_streams(LinphoneCall *call){ if (call->endpoint){ linphone_call_remove_from_conf(call); } + if (call->audiostream->ice_check_list) ice_check_list_destroy(call->audiostream->ice_check_list); audio_stream_stop(call->audiostream); call->audiostream=NULL; } @@ -1446,6 +1474,7 @@ void linphone_call_stop_media_streams(LinphoneCall *call){ rtp_session_unregister_event_queue(call->videostream->session,call->videostream_app_evq); ortp_ev_queue_flush(call->videostream_app_evq); ortp_ev_queue_destroy(call->videostream_app_evq); + if (call->videostream->ice_check_list) ice_check_list_destroy(call->videostream->ice_check_list); video_stream_stop(call->videostream); call->videostream=NULL; } diff --git a/coreapi/private.h b/coreapi/private.h index 1ab7a6a7..dd8b2b3b 100644 --- a/coreapi/private.h +++ b/coreapi/private.h @@ -35,6 +35,7 @@ extern "C" { #ifdef HAVE_CONFIG_H #include "config.h" #endif +#include "mediastreamer2/ice.h" #include "mediastreamer2/mediastream.h" #include "mediastreamer2/msconference.h" @@ -135,6 +136,7 @@ struct _LinphoneCall bool_t was_automatically_paused; CallCallbackObj nextVideoFrameDecoded; LinphoneCallStats stats[2]; + IceSession *ice_session; }; diff --git a/coreapi/sal.h b/coreapi/sal.h index d2d9cbe5..65eb5e0b 100644 --- a/coreapi/sal.h +++ b/coreapi/sal.h @@ -27,6 +27,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define sal_h #include "mediastreamer2/mscommon.h" +#include "mediastreamer2/ice.h" #include "ortp/ortp_srtp.h" /*Dirty hack, keep in sync with mediastreamer2/include/mediastream.h */ @@ -135,6 +136,7 @@ typedef struct SalStreamDescription{ SalSrtpCryptoAlgo crypto[SAL_CRYPTO_ALGO_MAX]; unsigned int crypto_local_tag; int max_rate; + IceCheckList *ice_check_list; } SalStreamDescription; #define SAL_MEDIA_DESCRIPTION_MAX_STREAMS 4 -- 2.39.2