diff options
author | Liong Sauw Ming <ming@teluu.com> | 2016-08-12 03:47:26 +0000 |
---|---|---|
committer | Liong Sauw Ming <ming@teluu.com> | 2016-08-12 03:47:26 +0000 |
commit | 818919149c6a062a1e138b1ed03260086eab30f2 (patch) | |
tree | 63adf27fc854d74447f687f84a7136da81dc9ba9 /pjsip/src | |
parent | 0a57d7a41645546cf06ca644bbc1924f01f1ff49 (diff) |
Fixed #1951: Add callback to configure SRTP setting and key in pjsua/pjsua2
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@5417 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjsip/src')
-rw-r--r-- | pjsip/src/pjsua-lib/pjsua_media.c | 16 | ||||
-rw-r--r-- | pjsip/src/pjsua2/endpoint.cpp | 47 |
2 files changed, 63 insertions, 0 deletions
diff --git a/pjsip/src/pjsua-lib/pjsua_media.c b/pjsip/src/pjsua-lib/pjsua_media.c index 9062b1f2..8de9c0ed 100644 --- a/pjsip/src/pjsua-lib/pjsua_media.c +++ b/pjsip/src/pjsua-lib/pjsua_media.c @@ -1480,6 +1480,22 @@ static pj_status_t call_media_init_cb(pjsua_call_media *call_med, srtp_opt.use = call_med->rem_srtp_use; else srtp_opt.use = acc->cfg.use_srtp; + + if (pjsua_var.ua_cfg.cb.on_create_media_transport_srtp) { + pjsua_call *call = call_med->call; + pjmedia_srtp_use srtp_use = srtp_opt.use; + + (*pjsua_var.ua_cfg.cb.on_create_media_transport_srtp) + (call->index, call_med->idx, &srtp_opt); + + /* Close_member_tp must not be overwritten by app */ + srtp_opt.close_member_tp = PJ_TRUE; + + /* Revert SRTP usage policy if media is reinitialized */ + if (call->inv && call->inv->state == PJSIP_INV_STATE_CONFIRMED) { + srtp_opt.use = srtp_use; + } + } status = pjmedia_transport_srtp_create(pjsua_var.med_endpt, call_med->tp, diff --git a/pjsip/src/pjsua2/endpoint.cpp b/pjsip/src/pjsua2/endpoint.cpp index 077190ec..bd984649 100644 --- a/pjsip/src/pjsua2/endpoint.cpp +++ b/pjsip/src/pjsua2/endpoint.cpp @@ -1266,6 +1266,53 @@ Endpoint::on_create_media_transport(pjsua_call_id call_id, return (pjmedia_transport *)prm.mediaTp; } +void Endpoint::on_create_media_transport_srtp(pjsua_call_id call_id, + unsigned media_idx, + pjmedia_srtp_setting *srtp_opt) +{ + Call *call = Call::lookup(call_id); + if (!call) { + pjsua_call *in_call = &pjsua_var.calls[call_id]; + if (in_call->incoming_data) { + /* This can happen when there is an incoming call but the + * on_incoming_call() callback hasn't been called. So we need to + * call the callback here. + */ + on_incoming_call(in_call->acc_id, call_id, in_call->incoming_data); + + /* New call should already be created by app. */ + call = Call::lookup(call_id); + if (!call) { + return; + } + } else { + return; + } + } + + OnCreateMediaTransportSrtpParam prm; + prm.mediaIdx = media_idx; + prm.srtpUse = srtp_opt->use; + for (int i = 0; i < srtp_opt->crypto_count; i++) { + SrtpCrypto crypto; + + crypto.key = pj2Str(srtp_opt->crypto[i].key); + crypto.name = pj2Str(srtp_opt->crypto[i].name); + crypto.flags = srtp_opt->crypto[i].flags; + prm.cryptos.push_back(crypto); + } + + call->onCreateMediaTransportSrtp(prm); + + srtp_opt->use = prm.srtpUse; + srtp_opt->crypto_count = prm.cryptos.size(); + for (int i = 0; i < srtp_opt->crypto_count; i++) { + srtp_opt->crypto[i].key = str2Pj(prm.cryptos[i].key); + srtp_opt->crypto[i].name = str2Pj(prm.cryptos[i].name); + srtp_opt->crypto[i].flags = prm.cryptos[i].flags; + } +} + /////////////////////////////////////////////////////////////////////////////// /* * Endpoint library operations |