diff --git a/src/modules/rtp_rtcp/source/remote_rate_control.cc b/src/modules/rtp_rtcp/source/remote_rate_control.cc index 97237e929..dc3a49fe9 100644 --- a/src/modules/rtp_rtcp/source/remote_rate_control.cc +++ b/src/modules/rtp_rtcp/source/remote_rate_control.cc @@ -79,6 +79,10 @@ void RemoteRateControl::Reset() _initializedBitRate = false; } +bool RemoteRateControl::ValidEstimate() { + return _initializedBitRate; +} + WebRtc_Word32 RemoteRateControl::SetConfiguredBitRates(WebRtc_UWord32 minBitRateBps, WebRtc_UWord32 maxBitRateBps) { if (minBitRateBps > maxBitRateBps) diff --git a/src/modules/rtp_rtcp/source/remote_rate_control.h b/src/modules/rtp_rtcp/source/remote_rate_control.h index ad7381583..e404dc700 100644 --- a/src/modules/rtp_rtcp/source/remote_rate_control.h +++ b/src/modules/rtp_rtcp/source/remote_rate_control.h @@ -31,6 +31,10 @@ public: WebRtc_Word64 nowMS); void Reset(); + // Returns true if there is a valid estimate of the incoming bitrate, false + // otherwise. + bool ValidEstimate(); + private: WebRtc_UWord32 ChangeBitRate(WebRtc_UWord32 currentBitRate, WebRtc_UWord32 incomingBitRate, diff --git a/src/modules/rtp_rtcp/source/rtcp_sender.cc b/src/modules/rtp_rtcp/source/rtcp_sender.cc index 4c314c453..750dd6557 100644 --- a/src/modules/rtp_rtcp/source/rtcp_sender.cc +++ b/src/modules/rtp_rtcp/source/rtcp_sender.cc @@ -282,7 +282,7 @@ bool RTCPSender::SetRemoteBitrateObserver(RtpRemoteBitrateObserver* observer) { void RTCPSender::UpdateRemoteBitrateEstimate(unsigned int target_bitrate) { CriticalSectionScoped lock(_criticalSectionRTCPSender); - if (_bitrate_observer && _remoteSSRC != 0) { + if (_bitrate_observer) { _bitrate_observer->OnReceiveBitrateChanged(_remoteSSRC, target_bitrate); } } @@ -1191,12 +1191,19 @@ RTCPSender::BuildREMB(WebRtc_UWord8* rtcpbuffer, WebRtc_UWord32& pos) WebRtc_UWord32 RTCPSender::CalculateNewTargetBitrate(WebRtc_UWord32 RTT) { + CriticalSectionScoped lock(_criticalSectionRTCPSender); WebRtc_UWord32 target_bitrate = _remoteRateControl.TargetBitRate(RTT, _clock.GetTimeInMS()); _tmmbr_Send = target_bitrate / 1000; return target_bitrate; } +bool +RTCPSender::ValidBitrateEstimate() { + CriticalSectionScoped lock(_criticalSectionRTCPSender); + return _remoteRateControl.ValidEstimate(); +} + WebRtc_Word32 RTCPSender::BuildTMMBR(WebRtc_UWord8* rtcpbuffer, WebRtc_UWord32& pos) { diff --git a/src/modules/rtp_rtcp/source/rtcp_sender.h b/src/modules/rtp_rtcp/source/rtcp_sender.h index c51e91386..833aa5470 100644 --- a/src/modules/rtp_rtcp/source/rtcp_sender.h +++ b/src/modules/rtp_rtcp/source/rtcp_sender.h @@ -133,6 +133,10 @@ public: WebRtc_UWord32 CalculateNewTargetBitrate(WebRtc_UWord32 RTT); + // Returns true if there is a valid estimate of the incoming bitrate, false + // otherwise. + bool ValidBitrateEstimate(); + private: WebRtc_Word32 SendToNetwork(const WebRtc_UWord8* dataBuffer, const WebRtc_UWord16 length); diff --git a/src/modules/rtp_rtcp/source/rtp_rtcp_impl.cc b/src/modules/rtp_rtcp/source/rtp_rtcp_impl.cc index b644c47f3..8ef9e9f60 100644 --- a/src/modules/rtp_rtcp/source/rtp_rtcp_impl.cc +++ b/src/modules/rtp_rtcp/source/rtp_rtcp_impl.cc @@ -415,7 +415,7 @@ WebRtc_Word32 ModuleRtpRtcpImpl::Process() { WebRtc_UWord16 RTT = 0; _rtcpReceiver.RTT(_rtpReceiver.SSRC(), &RTT, NULL, NULL, NULL); - if (REMB()) + if (REMB() && _rtcpSender.ValidBitrateEstimate()) { unsigned int target_bitrate = _rtcpSender.CalculateNewTargetBitrate(RTT);