void ms_media_stream_sessions_uninit(MSMediaStreamSessions *sessions){ if (sessions->srtp_session) { RtpTransport *rtptr=NULL,*rtcptr=NULL; ortp_srtp_dealloc(sessions->srtp_session); if (sessions->rtp_session){ rtp_session_get_transports(sessions->rtp_session,&rtptr,&rtcptr); rtp_session_set_transports(sessions->rtp_session,NULL,NULL); if (rtptr) srtp_transport_destroy(rtptr); if (rtcptr) srtp_transport_destroy(rtcptr); } sessions->srtp_session=NULL; } if (sessions->rtp_session) { rtp_session_destroy(sessions->rtp_session); sessions->rtp_session=NULL; } if (sessions->zrtp_context != NULL) { ortp_zrtp_context_destroy(sessions->zrtp_context); sessions->zrtp_context = NULL; } if (sessions->ticker){ ms_ticker_destroy(sessions->ticker); sessions->ticker=NULL; } }
srtp_t ortp_srtp_create_configure_session(enum ortp_srtp_crypto_suite_t suite, uint32_t ssrc, const char* snd_key, const char* rcv_key) { err_status_t err; srtp_t session; err = ortp_srtp_create(&session, NULL); if (err != err_status_ok) { ortp_error("Failed to create srtp session (%d)", err); return NULL; } // incoming stream { ssrc_t incoming_ssrc; srtp_policy_t policy; memset(&policy, 0, sizeof(srtp_policy_t)); incoming_ssrc.type = ssrc_any_inbound; if (!ortp_init_srtp_policy(session, &policy, suite, incoming_ssrc, rcv_key)) { ortp_srtp_dealloc(session); return NULL; } } // outgoing stream { ssrc_t outgoing_ssrc; srtp_policy_t policy; memset(&policy, 0, sizeof(srtp_policy_t)); policy.allow_repeat_tx=1; /*this is necessary to allow telephone-event to be sent 3 times for end of dtmf packet.*/ outgoing_ssrc.type = ssrc_specific; outgoing_ssrc.value = ssrc; if (!ortp_init_srtp_policy(session, &policy, suite, outgoing_ssrc, snd_key)) { ortp_srtp_dealloc(session); return NULL; } } return session; }
srtp_t ortp_srtp_create_configure_session(enum ortp_srtp_crypto_suite_t suite, uint32_t ssrc, const char* snd_key, const char* rcv_key) { err_status_t err; srtp_t session; err = ortp_srtp_create(&session, NULL); if (err != err_status_ok) { ortp_error("Failed to create srtp session (%d)", err); return NULL; } // incoming stream { ssrc_t incoming_ssrc; srtp_policy_t policy; memset(&policy, 0, sizeof(srtp_policy_t)); incoming_ssrc.type = ssrc_any_inbound; if (!ortp_init_srtp_policy(session, &policy, suite, incoming_ssrc, rcv_key)) { ortp_srtp_dealloc(session); return NULL; } } // outgoing stream { ssrc_t outgoing_ssrc; srtp_policy_t policy; memset(&policy, 0, sizeof(srtp_policy_t)); outgoing_ssrc.type = ssrc_specific; outgoing_ssrc.value = ssrc; if (!ortp_init_srtp_policy(session, &policy, suite, outgoing_ssrc, snd_key)) { ortp_srtp_dealloc(session); return NULL; } } return session; }