diff --git a/coreapi/callbacks.c b/coreapi/callbacks.c index ad425b21c..85217b576 100644 --- a/coreapi/callbacks.c +++ b/coreapi/callbacks.c @@ -380,7 +380,10 @@ static void try_early_media_forking(LinphoneCall *call, SalMediaDescription *md) RtpSession *session=ms->sessions.rtp_session; const char *rtp_addr=new_stream->rtp_addr[0]!='\0' ? new_stream->rtp_addr : md->addr; const char *rtcp_addr=new_stream->rtcp_addr[0]!='\0' ? new_stream->rtcp_addr : md->addr; - rtp_session_add_aux_remote_addr_full(session,rtp_addr,new_stream->rtp_port,rtcp_addr,new_stream->rtcp_port); + if (ms_is_multicast(new_stream->rtp_addr)) + ms_message("Multicast addr [%s/%i] does not need auxiliary rtp's destination for call [%p]",new_stream->rtp_addr,new_stream->rtp_port,call); + else + rtp_session_add_aux_remote_addr_full(session,rtp_addr,new_stream->rtp_port,rtcp_addr,new_stream->rtcp_port); } } } @@ -425,8 +428,15 @@ static void call_ringing(SalOp *h){ if (call->audiostream && audio_stream_started(call->audiostream)){ /*streams already started */ try_early_media_forking(call,md); - return; + #ifdef VIDEO_ENABLED + if (call->videostream){ + /*just request for iframe*/ + video_stream_send_vfu(call->videostream); + } + #endif + return; } + linphone_core_notify_show_interface(lc); linphone_core_notify_display_status(lc,_("Early media.")); linphone_call_set_state(call,LinphoneCallOutgoingEarlyMedia,"Early media"); diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index f39a1eb20..2a951a18c 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -1482,7 +1482,6 @@ static void misc_config_read(LinphoneCore *lc) { *//*JOHAN: USELESS? REMOVE IT*/ //const char *user_certificate_config_path = lp_config_get_string(config,"misc","uuid",); // }*/ - lc->real_early_media=lp_config_get_int(config,"misc","real_early_media",FALSE); } static void linphone_core_start(LinphoneCore * lc) { @@ -6905,7 +6904,7 @@ void linphone_core_init_default_params(LinphoneCore*lc, LinphoneCallParams *para params->avpf_enabled=FALSE; params->audio_dir=LinphoneCallParamsMediaDirectionSendRecv; params->video_dir=LinphoneCallParamsMediaDirectionSendRecv; - params->real_early_media=lc->real_early_media; + params->real_early_media=lp_config_get_int(lc->config,"misc","real_early_media",FALSE); } void linphone_core_set_device_identifier(LinphoneCore *lc,const char* device_id) { diff --git a/coreapi/private.h b/coreapi/private.h index 69b8f233e..18feea39f 100644 --- a/coreapi/private.h +++ b/coreapi/private.h @@ -796,7 +796,6 @@ struct _LinphoneCore const char **supported_formats; LinphoneContent *log_collection_upload_information; LinphoneCoreVTable *current_vtable; // the latest vtable to call a callback, see linphone_core_get_current_vtable - bool_t real_early_media; /*default value for CallParams.real_early_media*/ }; diff --git a/tester/liblinphone_tester.h b/tester/liblinphone_tester.h index c20f29cc4..9dbb63a9a 100644 --- a/tester/liblinphone_tester.h +++ b/tester/liblinphone_tester.h @@ -24,6 +24,9 @@ #include "CUnit/Basic.h" #include "linphonecore.h" +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif typedef void (*test_function_t)(void); typedef int (*test_suite_function_t)(const char *name); diff --git a/tester/multicast_call_tester.c b/tester/multicast_call_tester.c index 8fe459dba..963fbe62f 100644 --- a/tester/multicast_call_tester.c +++ b/tester/multicast_call_tester.c @@ -21,15 +21,17 @@ #include "linphonecore.h" #include "belle-sip/belle-sip.h" + static void call_multicast_base(bool_t video) { - LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); - LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_rc"); + LinphoneCoreManager *marie, *pauline; int begin; int leaked_objects; LinphoneVideoPolicy marie_policy, pauline_policy; belle_sip_object_enable_leak_detector(TRUE); begin=belle_sip_object_get_object_count(); + marie = linphone_core_manager_new( "marie_rc"); + pauline = linphone_core_manager_new( "pauline_rc"); if (video) { linphone_core_enable_video_capture(marie->lc, TRUE); @@ -71,8 +73,10 @@ static void call_multicast_base(bool_t video) { if (leaked_objects>0){ belle_sip_object_dump_active_objects(); } + belle_sip_object_enable_leak_detector(FALSE); } + static void call_multicast(void) { call_multicast_base(FALSE); } @@ -85,21 +89,29 @@ static void call_multicast_video(void) { } #endif static void early_media_with_multicast_base(bool_t video) { - LinphoneCoreManager* marie = linphone_core_manager_new("marie_rc"); - LinphoneCoreManager* pauline = linphone_core_manager_new("pauline_rc"); + LinphoneCoreManager *marie, *pauline, *pauline2; MSList* lcs = NULL; LinphoneCall* marie_call; int dummy=0; int leaked_objects; int begin; LinphoneVideoPolicy marie_policy, pauline_policy; + LpConfig *marie_lp; belle_sip_object_enable_leak_detector(TRUE); begin=belle_sip_object_get_object_count(); + marie = linphone_core_manager_new("marie_rc"); + pauline = linphone_core_manager_new("pauline_rc"); + pauline2 = linphone_core_manager_new("pauline_rc"); + + marie_lp=linphone_core_get_config(marie->lc); + lp_config_set_int(marie_lp,"misc","real_early_media",1); if (video) { - linphone_core_enable_video_capture(pauline->lc, TRUE); + linphone_core_enable_video_capture(pauline->lc, FALSE); linphone_core_enable_video_display(pauline->lc, TRUE); + linphone_core_enable_video_capture(pauline2->lc, FALSE); + linphone_core_enable_video_display(pauline2->lc, TRUE); linphone_core_enable_video_capture(marie->lc, TRUE); linphone_core_enable_video_display(marie->lc, FALSE); @@ -110,6 +122,7 @@ static void early_media_with_multicast_base(bool_t video) { linphone_core_set_video_policy(marie->lc,&marie_policy); linphone_core_set_video_policy(pauline->lc,&pauline_policy); + linphone_core_set_video_policy(pauline2->lc,&pauline_policy); linphone_core_set_video_multicast_addr(marie->lc,"224.1.2.3"); linphone_core_enable_video_multicast(marie->lc,TRUE); } @@ -119,6 +132,7 @@ static void early_media_with_multicast_base(bool_t video) { lcs = ms_list_append(lcs,marie->lc); lcs = ms_list_append(lcs,pauline->lc); + lcs = ms_list_append(lcs,pauline2->lc); /* Marie calls Pauline, and after the call has rung, transitions to an early_media session */ @@ -140,12 +154,29 @@ static void early_media_with_multicast_base(bool_t video) { CU_ASSERT_TRUE( wait_for_list(lcs, &pauline->stat.number_of_LinphoneCallIncomingEarlyMedia,1,2000) ); CU_ASSERT_TRUE( wait_for_list(lcs, &marie->stat.number_of_LinphoneCallOutgoingEarlyMedia,1,2000) ); + if (linphone_core_inc_invite_pending(pauline2->lc)) { + /* send a 183 to initiate the early media */ + if (video) { + /*check video path*/ + linphone_call_set_next_video_frame_decoded_callback(linphone_core_get_current_call(pauline2->lc),linphone_call_cb,pauline2->lc); + } + linphone_core_accept_early_media(pauline2->lc, linphone_core_get_current_call(pauline2->lc)); + + CU_ASSERT_TRUE( wait_for_list(lcs, &pauline2->stat.number_of_LinphoneCallIncomingEarlyMedia,1,2000) ); + } + wait_for_list(lcs, &dummy, 1, 3000); CU_ASSERT_TRUE(linphone_call_get_audio_stats(linphone_core_get_current_call(pauline->lc))->download_bandwidth>70); + CU_ASSERT_TRUE(linphone_call_get_audio_stats(linphone_core_get_current_call(pauline->lc))->download_bandwidth<90); + + CU_ASSERT_TRUE(linphone_call_get_audio_stats(linphone_core_get_current_call(pauline2->lc))->download_bandwidth>70); + CU_ASSERT_TRUE(linphone_call_get_audio_stats(linphone_core_get_current_call(pauline2->lc))->download_bandwidth<90); + if (video) { - CU_ASSERT_TRUE( wait_for(marie->lc,pauline->lc,&pauline->stat.number_of_IframeDecoded,1)); + CU_ASSERT_TRUE( wait_for_list(lcs,&pauline->stat.number_of_IframeDecoded,1,2000)); + CU_ASSERT_TRUE( wait_for_list(lcs,&pauline2->stat.number_of_IframeDecoded,1,2000)); } linphone_core_accept_call(pauline->lc, linphone_core_get_current_call(pauline->lc)); @@ -158,12 +189,14 @@ static void early_media_with_multicast_base(bool_t video) { ms_free(lcs); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); + linphone_core_manager_destroy(pauline2); leaked_objects=belle_sip_object_get_object_count()-begin; - CU_ASSERT_TRUE(leaked_objects==2/*fixme jehan*/); - if ((leaked_objects)>0){ + CU_ASSERT_EQUAL(leaked_objects,0); + if (leaked_objects>0){ belle_sip_object_dump_active_objects(); } + belle_sip_object_enable_leak_detector(FALSE); } static void early_media_with_multicast_audio() { diff --git a/tester/rcfiles/marie_early_rc b/tester/rcfiles/marie_early_rc index 079a81879..f1866026b 100644 --- a/tester/rcfiles/marie_early_rc +++ b/tester/rcfiles/marie_early_rc @@ -30,8 +30,8 @@ subscribe=0 [rtp] -audio_rtp_port=18070 -video_rtp_port=19072 +audio_rtp_port=18070-28000 +video_rtp_port=39072-49000 [video] display=0 diff --git a/tester/rcfiles/pauline_rc b/tester/rcfiles/pauline_rc index 7322fd99a..35ad8c36f 100644 --- a/tester/rcfiles/pauline_rc +++ b/tester/rcfiles/pauline_rc @@ -29,8 +29,8 @@ dial_escape_plus=0 #subscribe=0 [rtp] -audio_rtp_port=8090 -video_rtp_port=9092 +audio_rtp_port=18070-28000 +video_rtp_port=39072-49000 [video] display=0