From 6ae414af3f9cd18c988128e7c4fda7753eacbf63 Mon Sep 17 00:00:00 2001 From: winlin Date: Tue, 11 Aug 2020 14:29:05 +0800 Subject: [PATCH] RTC: Refine RTC hijacker. --- trunk/src/app/srs_app_rtc_conn.cpp | 19 ++++++++++++++++++- trunk/src/app/srs_app_rtc_conn.hpp | 6 ++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/trunk/src/app/srs_app_rtc_conn.cpp b/trunk/src/app/srs_app_rtc_conn.cpp index de8d19df3..cc2eb8b00 100644 --- a/trunk/src/app/srs_app_rtc_conn.cpp +++ b/trunk/src/app/srs_app_rtc_conn.cpp @@ -815,7 +815,10 @@ SrsRtcPublishStream::SrsRtcPublishStream(SrsRtcConnection* session) SrsRtcPublishStream::~SrsRtcPublishStream() { - // TODO: FIXME: Do unpublish when session timeout. + if (_srs_rtc_hijacker) { + _srs_rtc_hijacker->on_stop_publish(session_, this, req); + } + if (source) { source->set_publish_stream(NULL); source->on_unpublish(); @@ -1101,6 +1104,7 @@ srs_error_t SrsRtcPublishStream::do_on_rtp(char* plaintext, int nb_plaintext) } if (_srs_rtc_hijacker) { + // TODO: FIXME: copy pkt by hijacker itself if ((err = _srs_rtc_hijacker->on_rtp_packet(session_, this, req, pkt->copy())) != srs_success) { return srs_error_wrap(err, "on rtp packet"); } @@ -1548,6 +1552,13 @@ srs_error_t SrsRtcConnection::add_publisher(SrsRequest* req, const SrsSdp& remot srs_error_t SrsRtcConnection::add_player(SrsRequest* req, const SrsSdp& remote_sdp, SrsSdp& local_sdp) { srs_error_t err = srs_success; + + if (_srs_rtc_hijacker) { + if ((err = _srs_rtc_hijacker->on_before_play(this, req)) != srs_success) { + return srs_error_wrap(err, "before play check"); + } + } + std::map play_sub_relations; if ((err = negotiate_play_capability(req, remote_sdp, play_sub_relations)) != srs_success) { return srs_error_wrap(err, "play negotiate"); @@ -1588,6 +1599,12 @@ srs_error_t SrsRtcConnection::add_player2(SrsRequest* req, SrsSdp& local_sdp) { srs_error_t err = srs_success; + if (_srs_rtc_hijacker) { + if ((err = _srs_rtc_hijacker->on_before_play(this, req)) != srs_success) { + return srs_error_wrap(err, "before play check"); + } + } + std::map play_sub_relations; if ((err = fetch_source_capability(req, play_sub_relations)) != srs_success) { return srs_error_wrap(err, "play negotiate"); diff --git a/trunk/src/app/srs_app_rtc_conn.hpp b/trunk/src/app/srs_app_rtc_conn.hpp index f091d1854..c14332fd6 100644 --- a/trunk/src/app/srs_app_rtc_conn.hpp +++ b/trunk/src/app/srs_app_rtc_conn.hpp @@ -494,10 +494,16 @@ public: ISrsRtcHijacker(); virtual ~ISrsRtcHijacker(); public: + // Initialize the hijacker. + virtual srs_error_t initialize() = 0; // When start publisher by RTC. virtual srs_error_t on_start_publish(SrsRtcConnection* session, SrsRtcPublishStream* publisher, SrsRequest* req) = 0; + // When stop publish by RTC. + virtual void on_stop_publish(SrsRtcConnection* session, SrsRtcPublishStream* publisher, SrsRequest* req) = 0; // When got RTP plaintext packet. virtual srs_error_t on_rtp_packet(SrsRtcConnection* session, SrsRtcPublishStream* publisher, SrsRequest* req, SrsRtpPacket2* pkt) = 0; + // When before play by RTC. (wait source to ready in cascade scenario) + virtual srs_error_t on_before_play(SrsRtcConnection* session, SrsRequest* req) = 0; // When start player by RTC. virtual srs_error_t on_start_play(SrsRtcConnection* session, SrsRtcPlayStream* player, SrsRequest* req) = 0; // When start consuming for player for RTC.