|
|
@@ -110,17 +110,15 @@ struct endpoint_call_t {
|
|
|
sdp_session_t *last_sdp;
|
|
|
int connected;
|
|
|
int local_media_port;
|
|
|
- int mapped_audio_port;
|
|
|
int local_video_port;
|
|
|
- int mapped_video_port;
|
|
|
unsigned int last_media_desc_hash;
|
|
|
char local_ip[RVC_MAX_IP_LEN];
|
|
|
- char mapped_ip[RVC_MAX_IP_LEN];
|
|
|
DeviceTypeEnum eDeviceType;
|
|
|
CallingTypeEnum nCallType;
|
|
|
sdpvideo_desc_t sdpvieo_desc;
|
|
|
DECLARE_REF_COUNT_MEMBER(ref_cnt);
|
|
|
};
|
|
|
+
|
|
|
DECLARE_REF_COUNT_STATIC(endpoint_call, endpoint_call_t)
|
|
|
|
|
|
struct endpoint_t {
|
|
|
@@ -128,7 +126,12 @@ struct endpoint_t {
|
|
|
su_root_t *root;
|
|
|
nua_t *nua;
|
|
|
endpoint_call_t *active_call;
|
|
|
+#ifdef RVC_OS_WIN
|
|
|
HANDLE event_thread;
|
|
|
+#else
|
|
|
+ pthread_t ievent_threadid;
|
|
|
+#endif
|
|
|
+
|
|
|
int call_seq;
|
|
|
int media_port_seq;
|
|
|
CEntityBase *entity;
|
|
|
@@ -230,7 +233,6 @@ static void endpoint_media_update_video(endpoint_call_t *call, media_desc_t *vid
|
|
|
conf.ns_out[DEV_HANDFREE] = !!ep_conf->audio_dsp.audio_handfree_out_ns;
|
|
|
conf.aec[DEV_PICKUP] = !!ep_conf->audio_dsp.audio_pickup_aec;
|
|
|
conf.aec[DEV_HANDFREE] = !!ep_conf->audio_dsp.audio_handfree_aec;
|
|
|
- conf.istoptype = ep_conf->istoptype;
|
|
|
rc = audio_session_create(&conf, &call->audio);
|
|
|
if (rc != 0) {
|
|
|
DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("create audio session failed! rc = %d", rc);
|
|
|
@@ -367,7 +369,6 @@ static void endpoint_media_update_audio(endpoint_call_t *call, media_desc_t *aud
|
|
|
conf.ns_out[DEV_HANDFREE] = !!ep_conf->audio_dsp.audio_handfree_out_ns;
|
|
|
conf.aec[DEV_PICKUP] = !!ep_conf->audio_dsp.audio_pickup_aec;
|
|
|
conf.aec[DEV_HANDFREE] = !!ep_conf->audio_dsp.audio_handfree_aec;
|
|
|
- conf.istoptype = ep_conf->istoptype;
|
|
|
rc = audio_session_create(&conf, &call->audio);
|
|
|
if (rc != 0) {
|
|
|
DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("create audio session failed! rc = %d", rc);
|
|
|
@@ -606,19 +607,15 @@ static int get_media_direction(const sdp_media_t *lm, const sdp_media_t *rm)
|
|
|
return media_dir;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
static int negotiate_audio(endpoint_call_t *call, media_desc_t *audio_desc, const sdp_media_t *lm, const sdp_media_t *rm)
|
|
|
{
|
|
|
memset(audio_desc, 0, sizeof(media_desc_t));
|
|
|
const char *local_ip;
|
|
|
const char *remote_ip;
|
|
|
- char str_domain_ip[MAX_PATH] = {0};
|
|
|
|
|
|
local_ip = lm->m_connections ? lm->m_connections->c_address : lm->m_session->sdp_connection->c_address;
|
|
|
remote_ip = rm->m_connections ? rm->m_connections->c_address : rm->m_session->sdp_connection->c_address;
|
|
|
|
|
|
- //audio_desc->local_ip = local_ip ? inet_addr(local_ip) : 0;
|
|
|
- //audio_desc->local_port = lm->m_port;
|
|
|
audio_desc->local_ip = strlen(call->local_ip) ? inet_addr(call->local_ip) : 0;
|
|
|
audio_desc->local_port = call->local_media_port;
|
|
|
|
|
|
@@ -649,13 +646,11 @@ static int negotiate_video(endpoint_call_t *call, media_desc_t *video_desc, cons
|
|
|
|
|
|
const char *local_ip;
|
|
|
const char *remote_ip;
|
|
|
- char str_domain_ip[MAX_PATH] = {0};
|
|
|
|
|
|
local_ip = lm->m_connections ? lm->m_connections->c_address : lm->m_session->sdp_connection->c_address;
|
|
|
remote_ip = rm->m_connections ? rm->m_connections->c_address : rm->m_session->sdp_connection->c_address;
|
|
|
|
|
|
- //video_desc->local_ip = local_ip ? inet_addr(local_ip) : 0;
|
|
|
- //video_desc->local_port = lm->m_port;
|
|
|
+
|
|
|
video_desc->local_ip = strlen(call->local_ip) ? inet_addr(call->local_ip) : 0;
|
|
|
video_desc->local_port = call->local_video_port;
|
|
|
|
|
|
@@ -794,109 +789,124 @@ static void on_state(CONDITION_PARAMS)
|
|
|
|
|
|
switch (state)
|
|
|
{
|
|
|
- case nua_callstate_calling:
|
|
|
- if (local_sdp_str) {
|
|
|
- sdp_parser_t *parser = sdp_parse(call->home, local_sdp_str, strlen(local_sdp_str), -1);
|
|
|
- assert(call->last_sdp == NULL);
|
|
|
- call->last_sdp = sdp_session_dup(call->home, sdp_session(parser));
|
|
|
- sdp_parser_free(parser);
|
|
|
- }
|
|
|
- st = CALLING;
|
|
|
- call->cb.on_call_state(st, state_desc[st], phrase, call->cb.user_data);
|
|
|
- break;
|
|
|
+ case nua_callstate_calling:
|
|
|
+ {
|
|
|
+ if (local_sdp_str) {
|
|
|
+ sdp_parser_t* parser = sdp_parse(call->home, local_sdp_str, strlen(local_sdp_str), -1);
|
|
|
+ assert(call->last_sdp == NULL);
|
|
|
+ call->last_sdp = sdp_session_dup(call->home, sdp_session(parser));
|
|
|
+ sdp_parser_free(parser);
|
|
|
+ }
|
|
|
+ st = CALLING;
|
|
|
+ call->cb.on_call_state(st, state_desc[st], phrase, call->cb.user_data);
|
|
|
+ }
|
|
|
+ break;
|
|
|
|
|
|
case nua_callstate_proceeding:
|
|
|
- st = PROCEEDING;
|
|
|
- call->cb.on_call_state(st, state_desc[st], phrase, call->cb.user_data);
|
|
|
- if (remote_sdp_str) {
|
|
|
- sdp_parser_t *parser = sdp_parse(call->home, remote_sdp_str, strlen(remote_sdp_str), -1);
|
|
|
- remote_sdp = sdp_session(parser);
|
|
|
- if (call->last_sdp) {
|
|
|
- negotiate_sdp(call, call->last_sdp, remote_sdp);
|
|
|
- su_free(call->home, call->last_sdp);
|
|
|
- call->last_sdp = NULL;
|
|
|
+ {
|
|
|
+ st = PROCEEDING;
|
|
|
+ call->cb.on_call_state(st, state_desc[st], phrase, call->cb.user_data);
|
|
|
+ if (remote_sdp_str) {
|
|
|
+ sdp_parser_t* parser = sdp_parse(call->home, remote_sdp_str, strlen(remote_sdp_str), -1);
|
|
|
+ remote_sdp = sdp_session(parser);
|
|
|
+ if (call->last_sdp) {
|
|
|
+ negotiate_sdp(call, call->last_sdp, remote_sdp);
|
|
|
+ su_free(call->home, call->last_sdp);
|
|
|
+ call->last_sdp = NULL;
|
|
|
+ }
|
|
|
+ sdp_parser_free(parser);
|
|
|
+ }
|
|
|
}
|
|
|
- sdp_parser_free(parser);
|
|
|
- }
|
|
|
- break;
|
|
|
+ break;
|
|
|
|
|
|
- case nua_callstate_completing:
|
|
|
- st = COMPLETING;
|
|
|
- //DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("nua_callstate_completing, has_local_sdp : %d, has_remote_sdp : %d", !!local_sdp_str, !!remote_sdp_str);
|
|
|
- call->cb.on_call_state(st, state_desc[st], phrase, call->cb.user_data);
|
|
|
- if (remote_sdp_str) {
|
|
|
- sdp_parser_t *parser = sdp_parse(call->home, remote_sdp_str, strlen(remote_sdp_str), -1);
|
|
|
- remote_sdp = sdp_session(parser);
|
|
|
- if (call->last_sdp) {
|
|
|
- negotiate_sdp(call, call->last_sdp, remote_sdp);
|
|
|
- su_free(call->home, call->last_sdp);
|
|
|
- call->last_sdp = NULL;
|
|
|
- }
|
|
|
- sdp_parser_free(parser);
|
|
|
- }
|
|
|
- break;
|
|
|
- case nua_callstate_completed:
|
|
|
- //DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("nua_callstate_completed, has_local_sdp : %d, has_remote_sdp : %d", !!local_sdp_str, !!remote_sdp_str);
|
|
|
- if (remote_sdp_str) {
|
|
|
- if (!call->last_sdp) {
|
|
|
- sdp_parser_t *parser = sdp_parse(call->home, remote_sdp_str, strlen(remote_sdp_str), -1);
|
|
|
- call->last_sdp = sdp_session_dup(call->home, sdp_session(parser));
|
|
|
- sdp_parser_free(parser);
|
|
|
- }
|
|
|
- }
|
|
|
- if (local_sdp_str) {
|
|
|
- if (call->last_sdp) {
|
|
|
- sdp_parser_t *parser = sdp_parse(call->home, local_sdp_str, strlen(local_sdp_str), -1);
|
|
|
- local_sdp = sdp_session(parser);
|
|
|
- negotiate_sdp(call, local_sdp, call->last_sdp);
|
|
|
- su_free(call->home, call->last_sdp);
|
|
|
- call->last_sdp = NULL;
|
|
|
- sdp_parser_free(parser);
|
|
|
+ case nua_callstate_completing:
|
|
|
+ {
|
|
|
+ st = COMPLETING;
|
|
|
+ call->cb.on_call_state(st, state_desc[st], phrase, call->cb.user_data);
|
|
|
+ if (remote_sdp_str) {
|
|
|
+ sdp_parser_t* parser = sdp_parse(call->home, remote_sdp_str, strlen(remote_sdp_str), -1);
|
|
|
+ remote_sdp = sdp_session(parser);
|
|
|
+ if (call->last_sdp) {
|
|
|
+ negotiate_sdp(call, call->last_sdp, remote_sdp);
|
|
|
+ su_free(call->home, call->last_sdp);
|
|
|
+ call->last_sdp = NULL;
|
|
|
+ }
|
|
|
+ sdp_parser_free(parser);
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
- break;
|
|
|
- case nua_callstate_ready:
|
|
|
- call->connected = true;
|
|
|
- //DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("nua_callstate_ready, has_local_sdp : %d, has_remote_sdp : %d.", !!local_sdp_str, !!remote_sdp_str);
|
|
|
- st = READY;
|
|
|
- call->cb.on_call_state(st, state_desc[st], phrase, call->cb.user_data);
|
|
|
- if (remote_sdp_str) {
|
|
|
- sdp_parser_t *parser = sdp_parse(call->home, remote_sdp_str, strlen(remote_sdp_str), -1);
|
|
|
- remote_sdp = sdp_session(parser);
|
|
|
- if (call->last_sdp) {
|
|
|
- negotiate_sdp(call, call->last_sdp, remote_sdp);
|
|
|
- su_free(call->home, call->last_sdp);
|
|
|
- call->last_sdp = NULL;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case nua_callstate_completed:
|
|
|
+ {
|
|
|
+ if (remote_sdp_str) {
|
|
|
+ if (!call->last_sdp) {
|
|
|
+ sdp_parser_t* parser = sdp_parse(call->home, remote_sdp_str, strlen(remote_sdp_str), -1);
|
|
|
+ call->last_sdp = sdp_session_dup(call->home, sdp_session(parser));
|
|
|
+ sdp_parser_free(parser);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (local_sdp_str) {
|
|
|
+ if (call->last_sdp) {
|
|
|
+ sdp_parser_t* parser = sdp_parse(call->home, local_sdp_str, strlen(local_sdp_str), -1);
|
|
|
+ local_sdp = sdp_session(parser);
|
|
|
+ negotiate_sdp(call, local_sdp, call->last_sdp);
|
|
|
+ su_free(call->home, call->last_sdp);
|
|
|
+ call->last_sdp = NULL;
|
|
|
+ sdp_parser_free(parser);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
- sdp_parser_free(parser);
|
|
|
- }
|
|
|
+ break;
|
|
|
+
|
|
|
+ case nua_callstate_ready:
|
|
|
+ {
|
|
|
+ call->connected = true;
|
|
|
+ st = READY;
|
|
|
+ call->cb.on_call_state(st, state_desc[st], phrase, call->cb.user_data);
|
|
|
+ if (remote_sdp_str) {
|
|
|
+ sdp_parser_t* parser = sdp_parse(call->home, remote_sdp_str, strlen(remote_sdp_str), -1);
|
|
|
+ remote_sdp = sdp_session(parser);
|
|
|
+ if (call->last_sdp) {
|
|
|
+ negotiate_sdp(call, call->last_sdp, remote_sdp);
|
|
|
+ su_free(call->home, call->last_sdp);
|
|
|
+ call->last_sdp = NULL;
|
|
|
+ }
|
|
|
+ sdp_parser_free(parser);
|
|
|
+ }
|
|
|
#if 0
|
|
|
- if (remote_sdp_str) {
|
|
|
- sdp_parser_t *parser = sdp_parse(call->home, remote_sdp_str, strlen(remote_sdp_str), -1);
|
|
|
- remote_sdp = sdp_session(parser);
|
|
|
- negotiate_sdp(call, call->last_sdp, remote_sdp);
|
|
|
- sdp_parser_free(parser);
|
|
|
- } else if (local_sdp_str) {
|
|
|
- sdp_parser_t *parser = sdp_parse(call->home, local_sdp_str, strlen(local_sdp_str), -1);
|
|
|
- local_sdp = sdp_session(parser);
|
|
|
- negotiate_sdp(call, local_sdp, call->last_sdp);
|
|
|
- sdp_parser_free(parser);
|
|
|
- }
|
|
|
+ if (remote_sdp_str) {
|
|
|
+ sdp_parser_t* parser = sdp_parse(call->home, remote_sdp_str, strlen(remote_sdp_str), -1);
|
|
|
+ remote_sdp = sdp_session(parser);
|
|
|
+ negotiate_sdp(call, call->last_sdp, remote_sdp);
|
|
|
+ sdp_parser_free(parser);
|
|
|
+ }
|
|
|
+ else if (local_sdp_str) {
|
|
|
+ sdp_parser_t* parser = sdp_parse(call->home, local_sdp_str, strlen(local_sdp_str), -1);
|
|
|
+ local_sdp = sdp_session(parser);
|
|
|
+ negotiate_sdp(call, local_sdp, call->last_sdp);
|
|
|
+ sdp_parser_free(parser);
|
|
|
+ }
|
|
|
#endif
|
|
|
- break;
|
|
|
- case nua_callstate_terminated:
|
|
|
- st = TERMINATED;
|
|
|
- //DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("call terminated! in sofia thread!");
|
|
|
- {
|
|
|
- media_desc_t audio_desc = {0};
|
|
|
- audio_desc.media_dir = DIR_NONE;
|
|
|
- endpoint_media_update_audio(call, &audio_desc, call->ep->curr_audio_dev_type);
|
|
|
- }
|
|
|
- call->cb.on_call_state(st, state_desc[st], phrase, call->cb.user_data);
|
|
|
- nua_handle_bind(nh, NULL);
|
|
|
- nua_handle_destroy(nh);
|
|
|
- call->nh = NULL;
|
|
|
- break;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ case nua_callstate_terminated:
|
|
|
+ {
|
|
|
+ st = TERMINATED;
|
|
|
+ {
|
|
|
+ media_desc_t audio_desc = { 0 };
|
|
|
+ audio_desc.media_dir = DIR_NONE;
|
|
|
+ endpoint_media_update_audio(call, &audio_desc, call->ep->curr_audio_dev_type);
|
|
|
+ }
|
|
|
+ call->cb.on_call_state(st, state_desc[st], phrase, call->cb.user_data);
|
|
|
+ nua_handle_bind(nh, NULL);
|
|
|
+ nua_handle_destroy(nh);
|
|
|
+ call->nh = NULL;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ default:
|
|
|
+ break;
|
|
|
}
|
|
|
|
|
|
}
|