diff --git a/console/linphonec.c b/console/linphonec.c index fef795d86..f4d855574 100644 --- a/console/linphonec.c +++ b/console/linphonec.c @@ -326,9 +326,10 @@ static void linphonec_call_updated(LinphoneCall *call){ static void linphonec_call_encryption_changed(LinphoneCore *lc, LinphoneCall *call, bool_t encrypted, const char *auth_token) { long id=(long)linphone_call_get_user_pointer (call); if (!encrypted) { - linphonec_out("Call %i is not encrypted.\n", id); + linphonec_out("Call %i is not fully encrypted and auth token is %s.\n", id, + (auth_token != NULL) ? auth_token : "absent"); } else { - linphonec_out("Call %i is encrypted and auth token is %s.\n", id, + linphonec_out("Call %i is fully encrypted and auth token is %s.\n", id, (auth_token != NULL) ? auth_token : "absent"); } } diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c index f405c139a..ee69c93dc 100644 --- a/coreapi/linphonecall.c +++ b/coreapi/linphonecall.c @@ -25,6 +25,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "sipsetup.h" #include "lpconfig.h" #include "private.h" +#include #include "mediastreamer2/mediastream.h" @@ -56,22 +57,22 @@ static const char* get_zrtp_identifier(LinphoneCore *lc){ } const char* linphone_call_get_authentication_token(LinphoneCall *call){ - return call->audiostream->auth_token; + return call->auth_token; } bool_t linphone_call_get_authentication_token_verified(LinphoneCall *call){ - return call->audiostream->auth_token_verified; + return call->auth_token_verified; } bool_t linphone_call_are_all_streams_encrypted(LinphoneCall *call) { // Check ZRTP encryption in audiostream - if (!call->audiostream->encrypted) { + if (!call->audiostream_encrypted) { return FALSE; } #ifdef VIDEO_ENABLED // If video enabled, check ZRTP encryption in videostream const LinphoneCallParams *params=linphone_call_get_current_params(call); - if (params->has_video && !call->videostream->encrypted) { + if (params->has_video && !call->videostream_encrypted) { return FALSE; } #endif @@ -83,9 +84,11 @@ void propagate_encryption_changed(LinphoneCall *call){ if (call->core->vtable.call_encryption_changed == NULL) return; if (!linphone_call_are_all_streams_encrypted(call)) { - call->core->vtable.call_encryption_changed(call->core, call, FALSE, NULL); + ms_message("Some streams are not encrypted"); + call->core->vtable.call_encryption_changed(call->core, call, FALSE, call->auth_token); } else { - call->core->vtable.call_encryption_changed(call->core, call, TRUE, call->audiostream->auth_token); + ms_message("All streams are encrypted"); + call->core->vtable.call_encryption_changed(call->core, call, TRUE, call->auth_token); } } @@ -94,7 +97,7 @@ static void linphone_call_videostream_encryption_changed(void *data, bool_t encr ms_message("Video stream is %s", encrypted ? "encrypted" : "not encrypted"); LinphoneCall *call = (LinphoneCall *)data; - call->videostream->encrypted=encrypted; + call->videostream_encrypted=encrypted; propagate_encryption_changed(call); } #endif @@ -103,7 +106,7 @@ static void linphone_call_audiostream_encryption_changed(void *data, bool_t encr ms_message("Audio stream is %s ", encrypted ? "encrypted" : "not encrypted"); LinphoneCall *call = (LinphoneCall *)data; - call->audiostream->encrypted=encrypted; + call->audiostream_encrypted=encrypted; propagate_encryption_changed(call); @@ -123,11 +126,11 @@ static void linphone_call_audiostream_encryption_changed(void *data, bool_t encr static void linphone_call_audiostream_auth_token_ready(void *data, const char* auth_token, bool_t verified) { LinphoneCall *call=(LinphoneCall *)data; - if (call->audiostream->auth_token != NULL) - ms_free(call->audiostream->auth_token); + if (call->auth_token != NULL) + ms_free(call->auth_token); - call->audiostream->auth_token=ms_strdup(auth_token); - call->audiostream->auth_token_verified=verified; + call->auth_token=ms_strdup(auth_token); + call->auth_token_verified=verified; ms_message("Authentication token is %s (%s)", auth_token, verified?"verified":"unverified"); } @@ -449,6 +452,10 @@ static void linphone_call_destroy(LinphoneCall *obj) } if (obj->owns_call_log) linphone_call_log_destroy(obj->log); + if (obj->auth_token) { + ms_free(obj->auth_token); + } + ms_free(obj); } @@ -765,6 +772,9 @@ void linphone_call_init_media_streams(LinphoneCall *call){ if (lc->a_rtp) rtp_session_set_transports(audiostream->session,lc->a_rtp,lc->a_rtcp); + call->audiostream_app_evq = ortp_ev_queue_new(); + rtp_session_register_event_queue(audiostream->session,call->audiostream_app_evq); + #ifdef VIDEO_ENABLED if ((lc->video_conf.display || lc->video_conf.capture) && md->streams[1].port>0){ @@ -774,6 +784,8 @@ void linphone_call_init_media_streams(LinphoneCall *call){ video_stream_set_event_callback(call->videostream,video_stream_event_cb, call); if (lc->v_rtp) rtp_session_set_transports(call->videostream->session,lc->v_rtp,lc->v_rtcp); + call->videostream_app_evq = ortp_ev_queue_new(); + rtp_session_register_event_queue(call->videostream->session,call->videostream_app_evq); #ifdef TEST_EXT_RENDERER video_stream_set_render_callback(call->videostream,rendercb,NULL); #endif @@ -1129,6 +1141,10 @@ static void linphone_call_log_fill_stats(LinphoneCallLog *log, AudioStream *st){ void linphone_call_stop_media_streams(LinphoneCall *call){ if (call->audiostream!=NULL) { + rtp_session_unregister_event_queue(call->audiostream->session,call->audiostream_app_evq); + ortp_ev_queue_flush(call->audiostream_app_evq); + ortp_ev_queue_destroy(call->audiostream_app_evq); + if (call->audiostream->ec){ const char *state_str=NULL; ms_filter_call_method(call->audiostream->ec,MS_ECHO_CANCELLER_GET_STATE_STRING,&state_str); @@ -1141,8 +1157,13 @@ void linphone_call_stop_media_streams(LinphoneCall *call){ audio_stream_stop(call->audiostream); call->audiostream=NULL; } + + #ifdef VIDEO_ENABLED if (call->videostream!=NULL){ + 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); video_stream_stop(call->videostream); call->videostream=NULL; } @@ -1325,9 +1346,13 @@ void linphone_call_background_tasks(LinphoneCall *call, bool_t one_second_elapse } #ifdef VIDEO_ENABLED if (call->videostream!=NULL) { - if (call->videostream->evq){ - OrtpEvent *ev=ortp_ev_queue_get(call->videostream->evq); - if (ev!=NULL){ + // Beware that the application queue should not depend on treatments fron the + // mediastreamer queue. + video_stream_iterate(call->videostream); + + if (call->videostream_app_evq){ + OrtpEvent *ev; + while (NULL != (ev=ortp_ev_queue_get(call->videostream_app_evq))){ OrtpEventType evt=ortp_event_get_type(ev); if (evt == ORTP_EVENT_ZRTP_ENCRYPTION_CHANGED){ OrtpEventData *evd=ortp_event_get_data(ev); @@ -1336,13 +1361,16 @@ void linphone_call_background_tasks(LinphoneCall *call, bool_t one_second_elapse ortp_event_destroy(ev); } } - video_stream_iterate(call->videostream); } #endif if (call->audiostream!=NULL) { + // Beware that the application queue should not depend on treatments fron the + // mediastreamer queue. + audio_stream_iterate(call->audiostream); + if (call->audiostream->evq){ - OrtpEvent *ev=ortp_ev_queue_get(call->audiostream->evq); - if (ev!=NULL){ + OrtpEvent *ev; + while (NULL != (ev=ortp_ev_queue_get(call->audiostream_app_evq))){ OrtpEventType evt=ortp_event_get_type(ev); if (evt == ORTP_EVENT_ZRTP_ENCRYPTION_CHANGED){ OrtpEventData *evd=ortp_event_get_data(ev); @@ -1354,7 +1382,6 @@ void linphone_call_background_tasks(LinphoneCall *call, bool_t one_second_elapse ortp_event_destroy(ev); } } - audio_stream_iterate(call->audiostream); } if (one_second_elapsed && call->audiostream!=NULL && disconnect_timeout>0 ) disconnected=!audio_stream_alive(call->audiostream,disconnect_timeout); diff --git a/coreapi/private.h b/coreapi/private.h index 7fd8f1934..e79780b91 100644 --- a/coreapi/private.h +++ b/coreapi/private.h @@ -99,6 +99,12 @@ struct _LinphoneCall bool_t all_muted; /*this flag is set during early medias*/ bool_t playing_ringbacktone; bool_t owns_call_log; + OrtpEvQueue *audiostream_app_evq; + bool_t audiostream_encrypted; + char *auth_token; + bool_t auth_token_verified; + OrtpEvQueue *videostream_app_evq; + bool_t videostream_encrypted; }; diff --git a/mediastreamer2 b/mediastreamer2 index 97b4a85bb..737846b37 160000 --- a/mediastreamer2 +++ b/mediastreamer2 @@ -1 +1 @@ -Subproject commit 97b4a85bba7b0c75040137b6ba1a3543fda9c63c +Subproject commit 737846b3719dd5be9786f2a9be1aacf29595ad9f