Fix Media Stream initialization when ZRTP is used

This commit is contained in:
Aaro Altonen 2020-08-12 16:19:31 +03:00
parent 007ba4cb5c
commit 29d274d72b
2 changed files with 59 additions and 21 deletions

View File

@ -199,8 +199,9 @@ namespace uvg_rtp {
/* media stream type */
enum mstream_type type_;
/* Primary handler's key for the RTP packet dispatcher */
/* Primary handler keys for the RTP packet dispatcher */
uint32_t rtp_handler_key_;
uint32_t zrtp_handler_key_;
/* RTP packet dispatcher for the receiver */
uvg_rtp::pkt_dispatcher *pkt_dispatcher_;

View File

@ -160,28 +160,26 @@ rtp_error_t uvg_rtp::media_stream::init()
#ifdef __RTP_CRYPTO__
rtp_error_t uvg_rtp::media_stream::init(uvg_rtp::zrtp *zrtp)
{
rtp_error_t ret;
if (init_connection() != RTP_OK) {
LOG_ERROR("Failed to initialize the underlying socket: %s!", strerror(errno));
return RTP_GENERIC_ERROR;
}
/* First initialize the RTP context for this media stream (SSRC, sequence number, etc.)
* Then initialize ZRTP and using ZRTP, initialize SRTP.
*
* When ZRTP and SRTP have been initialized, create sender and receiver for the media type
* before returning the media stream for user */
rtp_error_t ret = RTP_OK;
if ((rtp_ = new uvg_rtp::rtp(fmt_)) == nullptr)
if (!(pkt_dispatcher_ = new uvg_rtp::pkt_dispatcher()))
return RTP_MEMORY_ERROR;
if (!(rtp_ = new uvg_rtp::rtp(fmt_))) {
delete pkt_dispatcher_;
return RTP_MEMORY_ERROR;
}
if ((ret = zrtp->init(rtp_->get_ssrc(), socket_.get_raw_socket(), addr_out_)) != RTP_OK) {
LOG_WARN("Failed to initialize ZRTP for media stream!");
return ret;
}
/* TODO: install zrtp packet handler */
if ((srtp_ = new uvg_rtp::srtp()) == nullptr)
return RTP_MEMORY_ERROR;
@ -190,24 +188,62 @@ rtp_error_t uvg_rtp::media_stream::init(uvg_rtp::zrtp *zrtp)
return ret;
}
if (!(rtcp_ = new uvg_rtp::rtcp(rtp_))) {
delete rtp_;
delete pkt_dispatcher_;
return RTP_MEMORY_ERROR;
}
socket_.install_handler(rtcp_, rtcp_->send_packet_handler_buf);
socket_.install_handler(rtcp_, rtcp_->send_packet_handler_vec);
rtp_handler_key_ = pkt_dispatcher_->install_handler(rtp_->packet_handler);
zrtp_handler_key_ = pkt_dispatcher_->install_handler(zrtp->packet_handler);
pkt_dispatcher_->install_aux_handler(rtp_handler_key_, rtcp_, rtcp_->recv_packet_handler);
pkt_dispatcher_->install_aux_handler(rtp_handler_key_, srtp_, srtp_->recv_packet_handler);
switch (fmt_) {
case RTP_FORMAT_HEVC:
media_ = new uvg_rtp::formats::hevc(&socket_, rtp_, ctx_config_.flags);
pkt_dispatcher_->install_aux_handler(
rtp_handler_key_,
nullptr,
dynamic_cast<uvg_rtp::formats::hevc *>(media_)->packet_handler
);
break;
case RTP_FORMAT_OPUS:
case RTP_FORMAT_GENERIC:
media_ = new uvg_rtp::formats::media(&socket_, rtp_, ctx_config_.flags);
pkt_dispatcher_->install_aux_handler(rtp_handler_key_, nullptr, media_->packet_handler);
break;
default:
LOG_ERROR("Unknown payload format %u\n", fmt_);
}
if (!media_) {
delete rtp_;
delete pkt_dispatcher_;
return RTP_MEMORY_ERROR;
}
if (ctx_config_.flags & RCE_RTCP) {
rtcp_->add_participant(addr_, src_port_ + 1, dst_port_ + 1, rtp_->get_clock_rate());
rtcp_->start();
}
if (ctx_config_.flags & RCE_SRTP_AUTHENTICATE_RTP)
rtp_->set_payload_size(MAX_PAYLOAD - AUTH_TAG_LENGTH);
socket_.set_srtp(srtp_);
/* TODO: install srtp packet handler */
receiver_ = new uvg_rtp::receiver(socket_, ctx_config_, fmt_, rtp_);
receiver_->start();
initialized_ = true;
return ret;
return pkt_dispatcher_->start(&socket_, ctx_config_.flags);
}
rtp_error_t uvg_rtp::media_stream::add_srtp_ctx(uint8_t *key, uint8_t *salt)
{
#if 0
if (!key || !salt)
return RTP_INVALID_VALUE;
@ -245,6 +281,7 @@ rtp_error_t uvg_rtp::media_stream::add_srtp_ctx(uint8_t *key, uint8_t *salt)
initialized_ = true;
return ret;
#endif
}
#endif