diff options
author | Benny Prijono <bennylp@teluu.com> | 2007-09-15 08:30:16 +0000 |
---|---|---|
committer | Benny Prijono <bennylp@teluu.com> | 2007-09-15 08:30:16 +0000 |
commit | 229e150c7b96a344f371fe02262d363ed0b88898 (patch) | |
tree | bd8b4b253ceb3ba011088a91559cf0626dfcf6bc /pjsip | |
parent | 560a0d9b22efac7c63b45566f8e69ac592421da1 (diff) |
Ticket #370: Implemented callback notification to application when ICE negotiation fails (via on_call_media_state callback)
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@1435 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjsip')
-rw-r--r-- | pjsip/include/pjsua-lib/pjsua.h | 3 | ||||
-rw-r--r-- | pjsip/src/pjsua-lib/pjsua_media.c | 42 |
2 files changed, 44 insertions, 1 deletions
diff --git a/pjsip/include/pjsua-lib/pjsua.h b/pjsip/include/pjsua-lib/pjsua.h index a82141b5..f493de5d 100644 --- a/pjsip/include/pjsua-lib/pjsua.h +++ b/pjsip/include/pjsua-lib/pjsua.h @@ -2375,6 +2375,9 @@ typedef enum pjsua_call_media_status /** The media is currently put on hold by remote endpoint */ PJSUA_CALL_MEDIA_REMOTE_HOLD, + /** The media has reported error (e.g. ICE negotiation) */ + PJSUA_CALL_MEDIA_ERROR + } pjsua_call_media_status; diff --git a/pjsip/src/pjsua-lib/pjsua_media.c b/pjsip/src/pjsua-lib/pjsua_media.c index 8700bd59..0e58d100 100644 --- a/pjsip/src/pjsua-lib/pjsua_media.c +++ b/pjsip/src/pjsua-lib/pjsua_media.c @@ -537,6 +537,42 @@ on_error: } +/* This callback is called when ICE negotiation completes */ +static void on_ice_complete(pjmedia_transport *tp, pj_status_t result) +{ + unsigned id, c; + pj_bool_t found = PJ_FALSE; + + /* We're only interested with failure case */ + if (result == PJ_SUCCESS) + return; + + /* Find call which has this media transport */ + + PJSUA_LOCK(); + + for (id=0, c=0; id<PJSUA_MAX_CALLS && c<pjsua_var.call_cnt; ++id) { + pjsua_call *call = &pjsua_var.calls[id]; + if (call->inv) { + ++c; + + if (call->med_tp == tp) { + call->media_st = PJSUA_CALL_MEDIA_ERROR; + call->media_dir = PJMEDIA_DIR_NONE; + found = PJ_TRUE; + break; + } + } + } + + PJSUA_UNLOCK(); + + if (found && pjsua_var.ua_cfg.cb.on_call_media_state) { + pjsua_var.ua_cfg.cb.on_call_media_state(id); + } +} + + /* Create ICE media transports (when ice is enabled) */ static pj_status_t create_ice_media_transports(pjsua_transport_config *cfg) { @@ -556,6 +592,7 @@ static pj_status_t create_ice_media_transports(pjsua_transport_config *cfg) /* Create each media transport */ for (i=0; i<pjsua_var.ua_cfg.max_calls; ++i) { pj_ice_strans_comp comp; + pjmedia_ice_cb ice_cb; int next_port; #if PJMEDIA_ADVERTISE_RTCP enum { COMP_CNT=2 }; @@ -563,8 +600,11 @@ static pj_status_t create_ice_media_transports(pjsua_transport_config *cfg) enum { COMP_CNT=1 }; #endif + pj_bzero(&ice_cb, sizeof(pjmedia_ice_cb)); + ice_cb.on_ice_complete = &on_ice_complete; + status = pjmedia_ice_create(pjsua_var.med_endpt, NULL, COMP_CNT, - &pjsua_var.stun_cfg, + &pjsua_var.stun_cfg, &ice_cb, &pjsua_var.calls[i].med_tp); if (status != PJ_SUCCESS) { pjsua_perror(THIS_FILE, "Unable to create ICE media transport", |