summaryrefslogtreecommitdiff
path: root/pjsip/src
diff options
context:
space:
mode:
authorLiong Sauw Ming <ming@teluu.com>2016-08-12 03:47:26 +0000
committerLiong Sauw Ming <ming@teluu.com>2016-08-12 03:47:26 +0000
commit818919149c6a062a1e138b1ed03260086eab30f2 (patch)
tree63adf27fc854d74447f687f84a7136da81dc9ba9 /pjsip/src
parent0a57d7a41645546cf06ca644bbc1924f01f1ff49 (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.c16
-rw-r--r--pjsip/src/pjsua2/endpoint.cpp47
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