summaryrefslogtreecommitdiff
path: root/pjsip
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2007-09-15 08:30:16 +0000
committerBenny Prijono <bennylp@teluu.com>2007-09-15 08:30:16 +0000
commit229e150c7b96a344f371fe02262d363ed0b88898 (patch)
treebd8b4b253ceb3ba011088a91559cf0626dfcf6bc /pjsip
parent560a0d9b22efac7c63b45566f8e69ac592421da1 (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.h3
-rw-r--r--pjsip/src/pjsua-lib/pjsua_media.c42
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",