tsk_bool_t tsip_dialog_invite_ice_is_enabled(const tsip_dialog_invite_t * self) { if(self){ return (self->supported.ice && (tnet_ice_ctx_is_active(self->ice.ctx_audio) || tnet_ice_ctx_is_active(self->ice.ctx_video))); } return tsk_false; }
tsk_bool_t tsip_dialog_invite_ice_got_local_candidates(const tsip_dialog_invite_t * self) { if(self){ return (!tnet_ice_ctx_is_active(self->ice.ctx_audio) || tnet_ice_ctx_got_local_candidates(self->ice.ctx_audio)) && (!tnet_ice_ctx_is_active(self->ice.ctx_video) || tnet_ice_ctx_got_local_candidates(self->ice.ctx_video)); } return tsk_false; }
tsk_bool_t tsip_dialog_invite_ice_is_connected(const tsip_dialog_invite_t * self) { if(self){ return (!tnet_ice_ctx_is_active(self->ice.ctx_audio) || tnet_ice_ctx_is_connected(self->ice.ctx_audio)) && (!tnet_ice_ctx_is_active(self->ice.ctx_video) || tnet_ice_ctx_is_connected(self->ice.ctx_video)); } return tsk_false; }
int tsip_dialog_invite_ice_timers_set(tsip_dialog_invite_t *self, int64_t timeout) { if(tnet_ice_ctx_is_active(self->ice.ctx_audio)){ tnet_ice_ctx_set_concheck_timeout(self->ice.ctx_audio, timeout); } if(tnet_ice_ctx_is_active(self->ice.ctx_video)){ tnet_ice_ctx_set_concheck_timeout(self->ice.ctx_video, timeout); } return 0; }
int tsip_dialog_invite_ice_process_lo(tsip_dialog_invite_t * self, const tsdp_message_t* sdp_lo) { const tsdp_header_M_t* M; const tsdp_header_A_t *A; int ret = 0, i; if(!self || !sdp_lo){ TSK_DEBUG_ERROR("Invalid parameter"); return -1; } // cancels all ICE contexts without candidates // this happens if codecs negotiations mismatch for one media out of two or three for(i = 0; i < 2; ++i){ struct tnet_ice_ctx_s *ctx = i == 0 ? self->ice.ctx_audio : self->ice.ctx_video; const char* media = i == 0 ? "audio" : "video"; if(tnet_ice_ctx_is_active(ctx)){ tsk_bool_t cancel = tsk_true; if((M = tsdp_message_find_media(sdp_lo, media))){ if((A = tsdp_header_M_findA(M, "candidate"))){ cancel = tsk_false; } } if(cancel){ ret = tnet_ice_ctx_cancel(ctx); } } } return ret; }