diff --git a/trunk/src/app/srs_app_rtc_source.cpp b/trunk/src/app/srs_app_rtc_source.cpp index 4fcc03cb9..7d6d1e529 100644 --- a/trunk/src/app/srs_app_rtc_source.cpp +++ b/trunk/src/app/srs_app_rtc_source.cpp @@ -1710,12 +1710,11 @@ srs_error_t SrsRtcRecvTrack::on_nack(SrsRtpPacket2* pkt) return err; } -srs_error_t SrsRtcRecvTrack::check_send_nacks() +srs_error_t SrsRtcRecvTrack::do_check_send_nacks(uint32_t& timeout_nacks) { srs_error_t err = srs_success; uint32_t sent_nacks = 0; - uint32_t timeout_nacks = 0; session_->check_send_nacks(nack_receiver_, track_desc_->ssrc_, sent_nacks, timeout_nacks); statistic_->nacks += sent_nacks; @@ -1754,6 +1753,18 @@ srs_error_t SrsRtcAudioRecvTrack::on_rtp(SrsRtcStream* source, SrsRtpPacket2* pk return err; } +srs_error_t SrsRtcAudioRecvTrack::check_send_nacks() +{ + srs_error_t err = srs_success; + + uint32_t timeout_nacks = 0; + if ((err = do_check_send_nacks(timeout_nacks)) != srs_success) { + return srs_error_wrap(err, "audio"); + } + + return err; +} + SrsRtcVideoRecvTrack::SrsRtcVideoRecvTrack(SrsRtcConnection* session, SrsRtcTrackDescription* track_desc) : SrsRtcRecvTrack(session, track_desc, false) { @@ -1800,6 +1811,26 @@ srs_error_t SrsRtcVideoRecvTrack::on_rtp(SrsRtcStream* source, SrsRtpPacket2* pk return err; } +srs_error_t SrsRtcVideoRecvTrack::check_send_nacks() +{ + srs_error_t err = srs_success; + + uint32_t timeout_nacks = 0; + if ((err = do_check_send_nacks(timeout_nacks)) != srs_success) { + return srs_error_wrap(err, "video"); + } + + // If NACK timeout, start PLI if not requesting. + if (timeout_nacks == 0 || request_key_frame_) { + return err; + } + + srs_trace("[Maybe] RTC: NACK timeout=%u, request PLI, track=%s, ssrc=%u", timeout_nacks, + track_desc_->id_.c_str(), track_desc_->ssrc_); + + return err; +} + void SrsRtcVideoRecvTrack::request_keyframe() { cid_of_subscriber_ = _srs_context->get_id(); diff --git a/trunk/src/app/srs_app_rtc_source.hpp b/trunk/src/app/srs_app_rtc_source.hpp index 31528b97c..e692610fe 100644 --- a/trunk/src/app/srs_app_rtc_source.hpp +++ b/trunk/src/app/srs_app_rtc_source.hpp @@ -501,7 +501,9 @@ protected: srs_error_t on_nack(SrsRtpPacket2* pkt); public: virtual srs_error_t on_rtp(SrsRtcStream* source, SrsRtpPacket2* pkt) = 0; - virtual srs_error_t check_send_nacks(); + virtual srs_error_t check_send_nacks() = 0; +protected: + virtual srs_error_t do_check_send_nacks(uint32_t& timeout_nacks); }; class SrsRtcAudioRecvTrack : public SrsRtcRecvTrack @@ -511,6 +513,7 @@ public: virtual ~SrsRtcAudioRecvTrack(); public: virtual srs_error_t on_rtp(SrsRtcStream* source, SrsRtpPacket2* pkt); + virtual srs_error_t check_send_nacks(); }; class SrsRtcVideoRecvTrack : public SrsRtcRecvTrack @@ -524,6 +527,7 @@ public: virtual ~SrsRtcVideoRecvTrack(); public: virtual srs_error_t on_rtp(SrsRtcStream* source, SrsRtpPacket2* pkt); + virtual srs_error_t check_send_nacks(); public: void request_keyframe(); };