]> sjero.net Git - linphone/commitdiff
Allocate ICE session and check lists for each stream when ICE is enabled.
authorGhislain MARY <ghislain.mary@belledonne-communications.com>
Tue, 17 Jul 2012 13:02:44 +0000 (15:02 +0200)
committerGhislain MARY <ghislain.mary@belledonne-communications.com>
Thu, 19 Jul 2012 13:03:27 +0000 (15:03 +0200)
coreapi/linphonecall.c
coreapi/private.h
coreapi/sal.h

index ec006dd58bad9e0f29cab205d9aea14ffe9655d8..f533711cf7de3630413bb7c8a5b3c176e15aafb0 100644 (file)
@@ -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;
        }
index 1ab7a6a7de5390ba236faf161f9b114bf78e7190..dd8b2b3bd3b1cf9ea450c406f4e8d2936490a464 100644 (file)
@@ -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;
 };
 
 
index d2d9cbe519ee3fe6e1221b48a34643f9bc1d4749..65eb5e0b4e38101725c86d056fac347cd4b681f4 100644 (file)
@@ -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