From 712dc7225a1e1e0e33799c2cb0b26a9848953036 Mon Sep 17 00:00:00 2001 From: winlin Date: Sun, 28 Feb 2021 06:56:53 +0800 Subject: [PATCH] RTC: Ignore NACK when disable for player. --- trunk/src/app/srs_app_rtc_conn.cpp | 32 ++++++++++++++++++++++++---- trunk/src/app/srs_app_rtc_source.cpp | 24 +++++++++++++++------ trunk/src/app/srs_app_rtc_source.hpp | 13 ++++++++--- 3 files changed, 56 insertions(+), 13 deletions(-) diff --git a/trunk/src/app/srs_app_rtc_conn.cpp b/trunk/src/app/srs_app_rtc_conn.cpp index cdd528b0a..57a428e7d 100644 --- a/trunk/src/app/srs_app_rtc_conn.cpp +++ b/trunk/src/app/srs_app_rtc_conn.cpp @@ -432,11 +432,13 @@ srs_error_t SrsRtcPlayStream::initialize(SrsRequest* req, std::map::iterator it = sub_relations.begin(); while (it != sub_relations.end()) { if (it->second->type_ == "audio") { - audio_tracks_.insert(make_pair(it->first, new SrsRtcAudioSendTrack(session_, it->second))); + SrsRtcAudioSendTrack* track = new SrsRtcAudioSendTrack(session_, it->second); + audio_tracks_.insert(make_pair(it->first, track)); } if (it->second->type_ == "video") { - video_tracks_.insert(make_pair(it->first, new SrsRtcVideoSendTrack(session_, it->second))); + SrsRtcVideoSendTrack* track = new SrsRtcVideoSendTrack(session_, it->second); + video_tracks_.insert(make_pair(it->first, track)); } ++it; } @@ -446,6 +448,18 @@ srs_error_t SrsRtcPlayStream::initialize(SrsRequest* req, std::mapget_rtc_nack_enabled(req->vhost); srs_trace("RTC player nack=%d", nack_enabled_); + // Apply configs for all tracks. + for (map::iterator it = audio_tracks_.begin(); it != audio_tracks_.end(); ++it) { + SrsRtcAudioSendTrack* track = it->second; + track->set_nack_enabled(nack_enabled_); + } + + for (map::iterator it = video_tracks_.begin(); it != video_tracks_.end(); ++it) { + SrsRtcVideoSendTrack* track = it->second; + track->set_nack_enabled(nack_enabled_); + } + + // Update stat for session. session_->stat_->nn_subscribers++; return err; @@ -910,6 +924,16 @@ srs_error_t SrsRtcPublishStream::initialize(SrsRequest* r, SrsRtcStreamDescripti srs_trace("RTC publisher nack=%d, pt-drop=%u, twcc=%u/%d", nack_enabled_, pt_to_drop_, twcc_enabled_, twcc_id); + for (vector::iterator it = audio_tracks_.begin(); it != audio_tracks_.end(); ++it) { + SrsRtcAudioRecvTrack* track = *it; + track->set_nack_enabled(nack_enabled_); + } + for (vector::iterator it = video_tracks_.begin(); it != video_tracks_.end(); ++it) { + SrsRtcVideoRecvTrack* track = *it; + track->set_nack_enabled(nack_enabled_); + } + + // Update stat for session. session_->stat_->nn_publishers++; // Setup the publish stream in source to enable PLI as such. @@ -1164,12 +1188,12 @@ srs_error_t SrsRtcPublishStream::do_on_rtp_plaintext(SrsRtpPacket2* pkt, SrsBuff SrsRtcVideoRecvTrack* video_track = get_video_track(ssrc); if (audio_track) { pkt->frame_type = SrsFrameTypeAudio; - if ((err = audio_track->on_rtp(source, pkt, nack_enabled_)) != srs_success) { + if ((err = audio_track->on_rtp(source, pkt)) != srs_success) { return srs_error_wrap(err, "on audio"); } } else if (video_track) { pkt->frame_type = SrsFrameTypeVideo; - if ((err = video_track->on_rtp(source, pkt, nack_enabled_)) != srs_success) { + if ((err = video_track->on_rtp(source, pkt)) != srs_success) { return srs_error_wrap(err, "on video"); } } else { diff --git a/trunk/src/app/srs_app_rtc_source.cpp b/trunk/src/app/srs_app_rtc_source.cpp index c2f96f918..84af630e2 100644 --- a/trunk/src/app/srs_app_rtc_source.cpp +++ b/trunk/src/app/srs_app_rtc_source.cpp @@ -1729,6 +1729,7 @@ SrsRtcRecvTrack::SrsRtcRecvTrack(SrsRtcConnection* session, SrsRtcTrackDescripti session_ = session; track_desc_ = track_desc->copy(); statistic_ = new SrsRtcTrackStatistic(); + nack_enabled_ = false; if (is_audio) { rtp_queue_ = new SrsRtpRingBuffer(100); @@ -1749,6 +1750,11 @@ SrsRtcRecvTrack::~SrsRtcRecvTrack() srs_freep(statistic_); } +void SrsRtcRecvTrack::set_nack_enabled(bool v) +{ + nack_enabled_ = v; +} + bool SrsRtcRecvTrack::has_ssrc(uint32_t ssrc) { return track_desc_->has_ssrc(ssrc); @@ -1872,7 +1878,7 @@ void SrsRtcAudioRecvTrack::on_before_decode_payload(SrsRtpPacket2* pkt, SrsBuffe *ppt = SrsRtpPacketPayloadTypeRaw; } -srs_error_t SrsRtcAudioRecvTrack::on_rtp(SrsRtcStream* source, SrsRtpPacket2* pkt, bool nack_enabled) +srs_error_t SrsRtcAudioRecvTrack::on_rtp(SrsRtcStream* source, SrsRtpPacket2* pkt) { srs_error_t err = srs_success; @@ -1888,7 +1894,7 @@ srs_error_t SrsRtcAudioRecvTrack::on_rtp(SrsRtcStream* source, SrsRtpPacket2* pk } // For NACK to handle packet. - if (nack_enabled && (err = on_nack(pkt)) != srs_success) { + if (nack_enabled_ && (err = on_nack(pkt)) != srs_success) { return srs_error_wrap(err, "on nack"); } @@ -1938,7 +1944,7 @@ void SrsRtcVideoRecvTrack::on_before_decode_payload(SrsRtpPacket2* pkt, SrsBuffe } } -srs_error_t SrsRtcVideoRecvTrack::on_rtp(SrsRtcStream* source, SrsRtpPacket2* pkt, bool nack_enabled) +srs_error_t SrsRtcVideoRecvTrack::on_rtp(SrsRtcStream* source, SrsRtpPacket2* pkt) { srs_error_t err = srs_success; @@ -1956,7 +1962,7 @@ srs_error_t SrsRtcVideoRecvTrack::on_rtp(SrsRtcStream* source, SrsRtpPacket2* pk } // For NACK to handle packet. - if (nack_enabled && (err = on_nack(pkt)) != srs_success) { + if ((err = on_nack(pkt)) != srs_success) { return srs_error_wrap(err, "on nack"); } @@ -1990,6 +1996,7 @@ SrsRtcSendTrack::SrsRtcSendTrack(SrsRtcConnection* session, SrsRtcTrackDescripti session_ = session; track_desc_ = track_desc->copy(); statistic_ = new SrsRtcTrackStatistic(); + nack_enabled_ = false; if (is_audio) { rtp_queue_ = new SrsRtpRingBuffer(100); @@ -2008,6 +2015,11 @@ SrsRtcSendTrack::~SrsRtcSendTrack() srs_freep(nack_epp); } +void SrsRtcSendTrack::set_nack_enabled(bool v) +{ + nack_enabled_ = v; +} + bool SrsRtcSendTrack::has_ssrc(uint32_t ssrc) { return track_desc_->has_ssrc(ssrc); @@ -2119,7 +2131,7 @@ srs_error_t SrsRtcAudioSendTrack::on_rtp(SrsRtpPacket2* pkt) } // Put rtp packet to NACK/ARQ queue - if (true) { + if (nack_enabled_) { SrsRtpPacket2* nack = pkt->copy(); rtp_queue_->set(nack->header.get_sequence(), nack); } @@ -2179,7 +2191,7 @@ srs_error_t SrsRtcVideoSendTrack::on_rtp(SrsRtpPacket2* pkt) } // Put rtp packet to NACK/ARQ queue - if (true) { + if (nack_enabled_) { SrsRtpPacket2* nack = pkt->copy(); rtp_queue_->set(nack->header.get_sequence(), nack); } diff --git a/trunk/src/app/srs_app_rtc_source.hpp b/trunk/src/app/srs_app_rtc_source.hpp index a1fe0b4f7..a267adf57 100644 --- a/trunk/src/app/srs_app_rtc_source.hpp +++ b/trunk/src/app/srs_app_rtc_source.hpp @@ -510,6 +510,9 @@ public: class SrsRtcRecvTrack { protected: + // Whether enabled nack. + bool nack_enabled_; + SrsRtcTrackDescription* track_desc_; SrsRtcTrackStatistic* statistic_; @@ -524,6 +527,7 @@ public: SrsRtcRecvTrack(SrsRtcConnection* session, SrsRtcTrackDescription* stream_descs, bool is_audio); virtual ~SrsRtcRecvTrack(); public: + void set_nack_enabled(bool v); bool has_ssrc(uint32_t ssrc); uint32_t get_ssrc(); void update_rtt(int rtt); @@ -536,7 +540,7 @@ public: protected: srs_error_t on_nack(SrsRtpPacket2* pkt); public: - virtual srs_error_t on_rtp(SrsRtcStream* source, SrsRtpPacket2* pkt, bool nack_enabled) = 0; + virtual srs_error_t on_rtp(SrsRtcStream* source, SrsRtpPacket2* pkt) = 0; virtual srs_error_t check_send_nacks() = 0; protected: virtual srs_error_t do_check_send_nacks(uint32_t& timeout_nacks); @@ -550,7 +554,7 @@ public: public: virtual void on_before_decode_payload(SrsRtpPacket2* pkt, SrsBuffer* buf, ISrsRtpPayloader** ppayload, SrsRtpPacketPayloadType* ppt); public: - virtual srs_error_t on_rtp(SrsRtcStream* source, SrsRtpPacket2* pkt, bool nack_enabled); + virtual srs_error_t on_rtp(SrsRtcStream* source, SrsRtpPacket2* pkt); virtual srs_error_t check_send_nacks(); }; @@ -562,7 +566,7 @@ public: public: virtual void on_before_decode_payload(SrsRtpPacket2* pkt, SrsBuffer* buf, ISrsRtpPayloader** ppayload, SrsRtpPacketPayloadType* ppt); public: - virtual srs_error_t on_rtp(SrsRtcStream* source, SrsRtpPacket2* pkt, bool nack_enabled); + virtual srs_error_t on_rtp(SrsRtcStream* source, SrsRtpPacket2* pkt); virtual srs_error_t check_send_nacks(); }; @@ -577,6 +581,8 @@ protected: SrsRtcConnection* session_; // NACK ARQ ring buffer. SrsRtpRingBuffer* rtp_queue_; + // Whether enabled nack. + bool nack_enabled_; private: // The pithy print for special stage. SrsErrorPithyPrint* nack_epp; @@ -584,6 +590,7 @@ public: SrsRtcSendTrack(SrsRtcConnection* session, SrsRtcTrackDescription* track_desc, bool is_audio); virtual ~SrsRtcSendTrack(); public: + void set_nack_enabled(bool v); bool has_ssrc(uint32_t ssrc); SrsRtpPacket2* fetch_rtp_packet(uint16_t seq); bool set_track_status(bool active);