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; } }
static void ms_dtls_srtp_set_transport(MSDtlsSrtpContext *userData, RtpSession *s) { RtpTransport *rtpt=NULL,*rtcpt=NULL; RtpTransportModifier *rtp_modifier, *rtcp_modifier; rtp_session_get_transports(s,&rtpt,&rtcpt); ms_dtls_srtp_transport_modifier_new(userData, &rtp_modifier,&rtcp_modifier); meta_rtp_transport_append_modifier(rtpt, rtp_modifier); meta_rtp_transport_append_modifier(rtcpt, rtcp_modifier); /* save transport modifier into context, needed to inject packets generated by DTLS */ userData->rtp_modifier = rtp_modifier; userData->rtcp_modifier = rtcp_modifier; }
static MSZrtpContext* ms_zrtp_configure_context(MSZrtpContext *userData, RtpSession *s) { bzrtpContext_t *context=userData->zrtpContext; RtpTransport *rtpt=NULL,*rtcpt=NULL; RtpTransportModifier *rtp_modifier, *rtcp_modifier; rtp_session_get_transports(s,&rtpt,&rtcpt); ms_zrtp_transport_modifier_new(userData, &rtp_modifier,&rtcp_modifier); meta_rtp_transport_append_modifier(rtpt, rtp_modifier); meta_rtp_transport_append_modifier(rtcpt, rtcp_modifier); /* save transport modifier into context, needed to inject packets generated by ZRTP */ userData->rtp_modifier = rtp_modifier; ms_message("Starting ZRTP engine on rtp session [%p]",s); bzrtp_startChannelEngine(context, s->snd.ssrc); return userData; }
/** * @brief Send a ZRTP packet via RTP transport modifiers. * * ZRTP calls this method to send a ZRTP packet via the RTP session. * * @param[in] clientData Pointer to our ZrtpContext structure used to retrieve RTP session * @param[in] data Points to ZRTP message to send. * @param[in] length The length in bytes of the data * @return 0 on success */ static int32_t ms_zrtp_sendDataZRTP (void *clientData, const uint8_t* data, uint16_t length ){ MSZrtpContext *userData = (MSZrtpContext *)clientData; RtpSession *session = userData->stream_sessions->rtp_session; RtpTransport *rtpt=NULL; mblk_t *msg; ms_message("ZRTP Send packet type %.8s on rtp session [%p]", data+16, session); /* get RTP transport from session */ rtp_session_get_transports(session,&rtpt,NULL); /* generate message from raw data */ msg = rtp_session_create_packet_raw(data, length); meta_rtp_transport_modifier_inject_packet(rtpt, userData->rtp_modifier, msg , 0); freemsg(msg); return 0; }
/** * Send a DTLS packet via RTCP. * * DTLS calls this method to send a DTLS packet via the RTCP session. * * @param ctx * Pointer to the MSDtlsSrtpContext structure. * @param data * Points to DTLS message to send. * @param length * The length in bytes of the data * @return * length of data sent */ static int ms_dtls_srtp_rtcp_sendData (void *ctx, const unsigned char *data, size_t length ){ MSDtlsSrtpContext *context = (MSDtlsSrtpContext *)ctx; RtpSession *session = context->stream_sessions->rtp_session; RtpTransport *rtcpt=NULL; mblk_t *msg; int ret; ms_message("DTLS Send RTCP packet len %d sessions: %p rtp session %p", (int)length, context->stream_sessions, context->stream_sessions->rtp_session); /* get RTCP transport from session */ rtp_session_get_transports(session,NULL,&rtcpt); /* generate message from raw data */ msg = rtp_session_create_packet_raw((uint8_t *)data, length); ret = meta_rtp_transport_modifier_inject_packet(rtcpt, context->rtcp_modifier, msg , 0); freemsg(msg); return ret; }