linphone_call_init_common(call, from, to);
linphone_core_init_default_params(lc, &call->params);
call->params.has_video &= !!lc->video_policy.automatically_accept;
+ call->params.has_video &= linphone_core_media_description_contains_video_stream(sal_call_get_remote_media_description(op));
switch (linphone_core_get_firewall_policy(call->core)) {
case LinphonePolicyUseIce:
call->ice_session = ice_session_new();
if (linphone_core_gather_ice_candidates(call->core,call)<0) {
/* Ice candidates gathering failed, proceed with the call anyway. */
linphone_call_delete_ice_session(call);
- linphone_call_stop_media_streams(call);
+ linphone_call_stop_media_streams_for_ice_gathering(call);
}
}
break;
void linphone_call_init_audio_stream(LinphoneCall *call){
LinphoneCore *lc=call->core;
AudioStream *audiostream;
- int dscp=linphone_core_get_audio_dscp(lc);
+ int dscp;
+ if (call->audiostream != NULL) return;
call->audiostream=audiostream=audio_stream_new(call->audio_port,call->audio_port+1,linphone_core_ipv6_enabled(lc));
+ dscp=linphone_core_get_audio_dscp(lc);
if (dscp!=-1)
audio_stream_set_dscp(audiostream,dscp);
if (linphone_core_echo_limiter_enabled(lc)){
#ifdef VIDEO_ENABLED
LinphoneCore *lc=call->core;
+ if (!call->params.has_video) {
+ linphone_call_stop_video_stream(call);
+ return;
+ }
+ if (call->videostream != NULL) return;
if ((lc->video_conf.display || lc->video_conf.capture) && call->params.has_video){
int video_recv_buf_size=lp_config_get_int(lc->config,"video","recv_buf_size",0);
int dscp=linphone_core_get_video_dscp(lc);
#endif
}
+void linphone_call_stop_media_streams_for_ice_gathering(LinphoneCall *call){
+ audio_stream_unprepare_sound(call->audiostream);
+#ifdef VIDEO_ENABLED
+ if (call->videostream) {
+ video_stream_unprepare_video(call->videostream);
+ }
+#endif
+}
+
void linphone_call_delete_ice_session(LinphoneCall *call){
if (call->ice_session != NULL) {
ice_session_destroy(call->ice_session);
log->quality=audio_stream_get_average_quality_rating(st);
}
-void linphone_call_stop_media_streams(LinphoneCall *call){
+void linphone_call_stop_audio_stream(LinphoneCall *call) {
if (call->audiostream!=NULL) {
call->audiostream->ice_check_list = NULL;
rtp_session_unregister_event_queue(call->audiostream->session,call->audiostream_app_evq);
audio_stream_stop(call->audiostream);
call->audiostream=NULL;
}
+}
-
+void linphone_call_stop_video_stream(LinphoneCall *call) {
#ifdef VIDEO_ENABLED
if (call->videostream!=NULL){
call->videostream->ice_check_list = NULL;
call->videostream=NULL;
}
#endif
+}
+
+void linphone_call_stop_media_streams(LinphoneCall *call){
+ linphone_call_stop_audio_stream(call);
+ linphone_call_stop_video_stream(call);
ms_event_queue_skip(call->core->msevq);
if (call->audio_profile){
linphone_core_start_accept_call_update(call->core, call);
break;
case LinphoneCallOutgoingInit:
- linphone_call_stop_media_streams(call);
+ linphone_call_stop_media_streams_for_ice_gathering(call);
linphone_core_proceed_with_invite_if_ready(call->core, call, NULL);
break;
default:
- linphone_call_stop_media_streams(call);
+ linphone_call_stop_media_streams_for_ice_gathering(call);
linphone_core_notify_incoming_call(call->core, call);
break;
}
ms_warning("ICE candidates gathering from [%s] has not finished yet, proceed with the call without ICE anyway."
,linphone_core_get_stun_server(lc));
linphone_call_delete_ice_session(call);
- linphone_call_stop_media_streams(call);
+ linphone_call_stop_media_streams_for_ice_gathering(call);
}
linphone_core_start_invite(lc,call);
}
if (linphone_core_gather_ice_candidates(lc,call)<0) {
/* Ice candidates gathering failed, proceed with the call anyway. */
linphone_call_delete_ice_session(call);
- linphone_call_stop_media_streams(call);
+ linphone_call_stop_media_streams_for_ice_gathering(call);
} else {
use_ice = TRUE;
}
ms_warning("Video isn't supported in conference");
call->params.has_video = FALSE;
}
+ call->params.has_video &= linphone_core_media_description_contains_video_stream(sal_call_get_remote_media_description(call->op));
call->camera_active=call->params.has_video;
update_local_media_description(lc,call);
if (call->ice_session != NULL) {
if (contact)
sal_op_set_contact(call->op,contact);
- if (call->audiostream==NULL)
- linphone_call_init_media_streams(call);
- if (!was_ringing && call->audiostream->ticker==NULL){
- audio_stream_prepare_sound(call->audiostream,lc->sound_conf.play_sndcard,lc->sound_conf.capt_sndcard);
- }
-
if (params){
call->params=*params;
+ call->params.has_video &= linphone_core_media_description_contains_video_stream(sal_call_get_remote_media_description(call->op));
call->camera_active=call->params.has_video;
update_local_media_description(lc,call);
sal_call_set_local_media_description(call->op,call->localdesc);
}
+ if (call->audiostream==NULL)
+ linphone_call_init_media_streams(call);
+ if (!was_ringing && call->audiostream->ticker==NULL){
+ audio_stream_prepare_sound(call->audiostream,lc->sound_conf.play_sndcard,lc->sound_conf.capt_sndcard);
+ }
+
sal_call_accept(call->op);
if (lc->vtable.display_status!=NULL)
lc->vtable.display_status(lc,_("Connected."));
void linphone_core_update_ice_state_in_call_stats(LinphoneCall *call);
void linphone_core_update_local_media_description_from_ice(SalMediaDescription *desc, IceSession *session);
void linphone_core_update_ice_from_remote_media_description(LinphoneCall *call, const SalMediaDescription *md);
+bool_t linphone_core_media_description_contains_video_stream(const SalMediaDescription *md);
void linphone_core_deactivate_ice_for_deactivated_media_streams(LinphoneCall *call, const SalMediaDescription *md);
void linphone_core_send_initial_subscribes(LinphoneCore *lc);
void linphone_call_init_media_streams(LinphoneCall *call);
void linphone_call_start_media_streams(LinphoneCall *call, bool_t all_inputs_muted, bool_t send_ringbacktone);
void linphone_call_start_media_streams_for_ice_gathering(LinphoneCall *call);
+void linphone_call_stop_audio_stream(LinphoneCall *call);
+void linphone_call_stop_video_stream(LinphoneCall *call);
void linphone_call_stop_media_streams(LinphoneCall *call);
void linphone_call_delete_ice_session(LinphoneCall *call);
+void linphone_call_stop_media_streams_for_ice_gathering(LinphoneCall *call);
const char * linphone_core_get_identity(LinphoneCore *lc);
const char * linphone_core_get_route(LinphoneCore *lc);