diff --git a/call/call.cc b/call/call.cc index 39772a2bad..1bb107c9b9 100644 --- a/call/call.cc +++ b/call/call.cc @@ -898,9 +898,7 @@ void Call::DestroyAudioReceiveStream( audio_receive_stream->UnregisterFromTransport(); uint32_t ssrc = audio_receive_stream->remote_ssrc(); - receive_side_cc_ - .GetRemoteBitrateEstimator(UseSendSideBwe(audio_receive_stream)) - ->RemoveStream(ssrc); + receive_side_cc_.RemoveStream(ssrc); audio_receive_streams_.erase(audio_receive_stream); @@ -1086,9 +1084,7 @@ void Call::DestroyVideoReceiveStream( video_receive_streams_.erase(receive_stream_impl); ConfigureSync(receive_stream_impl->sync_group()); - receive_side_cc_ - .GetRemoteBitrateEstimator(UseSendSideBwe(receive_stream_impl)) - ->RemoveStream(receive_stream_impl->remote_ssrc()); + receive_side_cc_.RemoveStream(receive_stream_impl->remote_ssrc()); UpdateAggregateNetworkState(); delete receive_stream_impl; @@ -1132,9 +1128,7 @@ void Call::DestroyFlexfecReceiveStream(FlexfecReceiveStream* receive_stream) { // Remove all SSRCs pointing to the FlexfecReceiveStreamImpl to be // destroyed. - receive_side_cc_ - .GetRemoteBitrateEstimator(UseSendSideBwe(receive_stream_impl)) - ->RemoveStream(ssrc); + receive_side_cc_.RemoveStream(ssrc); delete receive_stream_impl; } @@ -1165,11 +1159,7 @@ Call::Stats Call::GetStats() const { stats.rtt_ms = call_stats_->LastProcessedRtt(); // Fetch available send/receive bitrates. - std::vector ssrcs; - uint32_t recv_bandwidth = 0; - receive_side_cc_.GetRemoteBitrateEstimator(false)->LatestEstimate( - &ssrcs, &recv_bandwidth); - stats.recv_bandwidth_bps = recv_bandwidth; + stats.recv_bandwidth_bps = receive_side_cc_.LatestReceiveSideEstimate().bps(); stats.send_bandwidth_bps = last_bandwidth_bps_.load(std::memory_order_relaxed); stats.max_padding_bitrate_bps = diff --git a/modules/congestion_controller/include/receive_side_congestion_controller.h b/modules/congestion_controller/include/receive_side_congestion_controller.h index 53a0de21c7..fe30865c53 100644 --- a/modules/congestion_controller/include/receive_side_congestion_controller.h +++ b/modules/congestion_controller/include/receive_side_congestion_controller.h @@ -48,9 +48,10 @@ class ReceiveSideCongestionController : public CallStatsObserver { void SetSendPeriodicFeedback(bool send_periodic_feedback); // TODO(nisse): Delete these methods, design a more specific interface. - virtual RemoteBitrateEstimator* GetRemoteBitrateEstimator(bool send_side_bwe); - virtual const RemoteBitrateEstimator* GetRemoteBitrateEstimator( - bool send_side_bwe) const; + [[deprecated]] virtual RemoteBitrateEstimator* GetRemoteBitrateEstimator( + bool send_side_bwe); + [[deprecated]] virtual const RemoteBitrateEstimator* + GetRemoteBitrateEstimator(bool send_side_bwe) const; // Implements CallStatsObserver. void OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms) override; @@ -64,6 +65,14 @@ class ReceiveSideCongestionController : public CallStatsObserver { void SetTransportOverhead(DataSize overhead_per_packet); + // Returns latest receive side bandwidth estimation. + // Returns zero if receive side bandwidth estimation is unavailable. + DataRate LatestReceiveSideEstimate() const; + + // Removes stream from receive side bandwidth estimation. + // Noop if receive side bwe is not used or stream doesn't participate in it. + void RemoveStream(uint32_t ssrc); + [[deprecated]] int64_t TimeUntilNextProcess(); [[deprecated]] void Process(); diff --git a/modules/congestion_controller/receive_side_congestion_controller.cc b/modules/congestion_controller/receive_side_congestion_controller.cc index e495a4dbc8..3f337f84c7 100644 --- a/modules/congestion_controller/receive_side_congestion_controller.cc +++ b/modules/congestion_controller/receive_side_congestion_controller.cc @@ -167,6 +167,20 @@ ReceiveSideCongestionController::GetRemoteBitrateEstimator( } } +DataRate ReceiveSideCongestionController::LatestReceiveSideEstimate() const { + std::vector unused_ssrcs; + uint32_t bitrate_bps = 0; + if (remote_bitrate_estimator_.LatestEstimate(&unused_ssrcs, &bitrate_bps)) { + return DataRate::BitsPerSec(bitrate_bps); + } else { + return DataRate::Zero(); + } +} + +void ReceiveSideCongestionController::RemoveStream(uint32_t ssrc) { + remote_bitrate_estimator_.RemoveStream(ssrc); +} + void ReceiveSideCongestionController::OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms) { remote_bitrate_estimator_.OnRttUpdate(avg_rtt_ms, max_rtt_ms); diff --git a/test/fuzzers/congestion_controller_feedback_fuzzer.cc b/test/fuzzers/congestion_controller_feedback_fuzzer.cc index 06a73b0434..e266b85fa4 100644 --- a/test/fuzzers/congestion_controller_feedback_fuzzer.cc +++ b/test/fuzzers/congestion_controller_feedback_fuzzer.cc @@ -26,7 +26,6 @@ void FuzzOneInput(const uint8_t* data, size_t size) { &clock, absl::bind_front(&PacketRouter::SendCombinedRtcpPacket, &packet_router), absl::bind_front(&PacketRouter::SendRemb, &packet_router), nullptr); - RemoteBitrateEstimator* rbe = cc.GetRemoteBitrateEstimator(true); RTPHeader header; header.ssrc = ByteReader::ReadBigEndian(&data[i]); i += sizeof(uint32_t); @@ -43,11 +42,11 @@ void FuzzOneInput(const uint8_t* data, size_t size) { header.extension.transportSequenceNumber = ByteReader::ReadBigEndian(&data[i]); i += sizeof(uint16_t); - rbe->IncomingPacket(arrival_time_ms, payload_size, header); + cc.OnReceivedPacket(arrival_time_ms, payload_size, header); clock.AdvanceTimeMilliseconds(5); arrival_time_ms += ByteReader::ReadBigEndian(&data[i]); i += sizeof(uint8_t); + cc.MaybeProcess(); } - rbe->Process(); } } // namespace webrtc