From 8c9935db4467413efb5ad5e38a309acb56f8e6f1 Mon Sep 17 00:00:00 2001 From: winlin Date: Fri, 7 Aug 2020 16:41:55 +0800 Subject: [PATCH] RTC: Connection support hijack --- trunk/src/app/srs_app_rtc_conn.cpp | 20 ++++++++++++++++++++ trunk/src/app/srs_app_rtc_conn.hpp | 12 ++++++++++++ 2 files changed, 32 insertions(+) diff --git a/trunk/src/app/srs_app_rtc_conn.cpp b/trunk/src/app/srs_app_rtc_conn.cpp index 30e9977d3..988688557 100644 --- a/trunk/src/app/srs_app_rtc_conn.cpp +++ b/trunk/src/app/srs_app_rtc_conn.cpp @@ -1754,6 +1754,14 @@ string SrsRtcConnectionStatistic::summary() return ss.str(); } +ISrsRtcConnectionHijacker::ISrsRtcConnectionHijacker() +{ +} + +ISrsRtcConnectionHijacker::~ISrsRtcConnectionHijacker() +{ +} + SrsRtcConnection::SrsRtcConnection(SrsRtcServer* s, SrsContextId context_id) { req = NULL; @@ -1761,6 +1769,7 @@ SrsRtcConnection::SrsRtcConnection(SrsRtcServer* s, SrsContextId context_id) cid = context_id; stat_ = new SrsRtcConnectionStatistic(); timer_ = new SrsHourGlass(this, 1000 * SRS_UTIME_MILLISECONDS); + hijacker_ = NULL; publisher_ = NULL; player_ = NULL; @@ -2067,6 +2076,11 @@ srs_error_t SrsRtcConnection::on_rtcp_feedback(char* data, int nb_data) return srs_success; } +void SrsRtcConnection::set_hijacker(ISrsRtcConnectionHijacker* h) +{ + hijacker_ = h; +} + srs_error_t SrsRtcConnection::on_rtp(char* data, int nb_data) { if (publisher_ == NULL) { @@ -2094,6 +2108,12 @@ srs_error_t SrsRtcConnection::on_connection_established() } } + if (hijacker_) { + if ((err = hijacker_->on_dtls_done()) != srs_success) { + return srs_error_wrap(err, "hijack on dtls done"); + } + } + return err; } diff --git a/trunk/src/app/srs_app_rtc_conn.hpp b/trunk/src/app/srs_app_rtc_conn.hpp index a35a47d21..e55c818b7 100644 --- a/trunk/src/app/srs_app_rtc_conn.hpp +++ b/trunk/src/app/srs_app_rtc_conn.hpp @@ -364,6 +364,16 @@ public: std::string summary(); }; +// Callback for RTC connection. +class ISrsRtcConnectionHijacker +{ +public: + ISrsRtcConnectionHijacker(); + virtual ~ISrsRtcConnectionHijacker(); +public: + virtual srs_error_t on_dtls_done() = 0; +}; + // A RTC Peer Connection, SDP level object. class SrsRtcConnection : virtual public ISrsHourGlass { @@ -373,6 +383,7 @@ class SrsRtcConnection : virtual public ISrsHourGlass public: bool disposing_; SrsRtcConnectionStatistic* stat_; + ISrsRtcConnectionHijacker* hijacker_; private: SrsRtcServer* server_; SrsRtcConnectionStateType state_; @@ -439,6 +450,7 @@ public: srs_error_t on_rtp(char* data, int nb_data); srs_error_t on_rtcp(char* data, int nb_data); srs_error_t on_rtcp_feedback(char* buf, int nb_buf); + void set_hijacker(ISrsRtcConnectionHijacker* h); public: srs_error_t on_connection_established(); srs_error_t start_play();