diff --git a/call/call.cc b/call/call.cc index 735b3d2c78..f1385c9933 100644 --- a/call/call.cc +++ b/call/call.cc @@ -280,6 +280,7 @@ class Call final : public webrtc::Call, void EnableSendCongestionControlFeedbackAccordingToRfc8888() override; int FeedbackAccordingToRfc8888Count() override; + int FeedbackAccordingToTransportCcCount() override; const FieldTrialsView& trials() const override; @@ -1200,6 +1201,10 @@ int Call::FeedbackAccordingToRfc8888Count() { return transport_send_->ReceivedCongestionControlFeedbackCount(); } +int Call::FeedbackAccordingToTransportCcCount() { + return transport_send_->ReceivedTransportCcFeedbackCount(); +} + const FieldTrialsView& Call::trials() const { return env_.field_trials(); } diff --git a/call/call.h b/call/call.h index c69e37416f..ae6eaf82d9 100644 --- a/call/call.h +++ b/call/call.h @@ -155,6 +155,7 @@ class Call { virtual void EnableSendCongestionControlFeedbackAccordingToRfc8888() = 0; virtual int FeedbackAccordingToRfc8888Count() = 0; + virtual int FeedbackAccordingToTransportCcCount() = 0; virtual const FieldTrialsView& trials() const = 0; diff --git a/call/rtp_transport_controller_send.cc b/call/rtp_transport_controller_send.cc index 8232d3c741..cd6a61f5c2 100644 --- a/call/rtp_transport_controller_send.cc +++ b/call/rtp_transport_controller_send.cc @@ -639,6 +639,7 @@ void RtpTransportControllerSend::OnTransportFeedback( Timestamp receive_time, const rtcp::TransportFeedback& feedback) { RTC_DCHECK_RUN_ON(&sequence_checker_); + ++transport_cc_feedback_count_; feedback_demuxer_.OnTransportFeedback(feedback); std::optional feedback_msg = transport_feedback_adapter_.ProcessTransportFeedback(feedback, diff --git a/call/rtp_transport_controller_send.h b/call/rtp_transport_controller_send.h index f4f29b06a8..3d4185b07c 100644 --- a/call/rtp_transport_controller_send.h +++ b/call/rtp_transport_controller_send.h @@ -146,6 +146,10 @@ class RtpTransportControllerSend final RTC_DCHECK_RUN_ON(&sequence_checker_); return feedback_count_; } + int ReceivedTransportCcFeedbackCount() const override { + RTC_DCHECK_RUN_ON(&sequence_checker_); + return transport_cc_feedback_count_; + } private: void MaybeCreateControllers() RTC_RUN_ON(sequence_checker_); @@ -235,6 +239,7 @@ class RtpTransportControllerSend final bool is_congested_ RTC_GUARDED_BY(sequence_checker_); // Count of feedback messages received. int feedback_count_ RTC_GUARDED_BY(sequence_checker_) = 0; + int transport_cc_feedback_count_ RTC_GUARDED_BY(sequence_checker_) = 0; // Protected by internal locks. RateLimiter retransmission_rate_limiter_; diff --git a/call/rtp_transport_controller_send_interface.h b/call/rtp_transport_controller_send_interface.h index dc2e072254..88b3d88ea3 100644 --- a/call/rtp_transport_controller_send_interface.h +++ b/call/rtp_transport_controller_send_interface.h @@ -163,6 +163,8 @@ class RtpTransportControllerSendInterface { virtual NetworkControllerInterface* GetNetworkController() = 0; // Count of RFC8888 feedback reports received virtual int ReceivedCongestionControlFeedbackCount() const = 0; + // Count of transport-cc feedback reports received + virtual int ReceivedTransportCcFeedbackCount() const = 0; }; } // namespace webrtc diff --git a/call/test/mock_rtp_transport_controller_send.h b/call/test/mock_rtp_transport_controller_send.h index cfdcb91e79..c580637635 100644 --- a/call/test/mock_rtp_transport_controller_send.h +++ b/call/test/mock_rtp_transport_controller_send.h @@ -119,6 +119,7 @@ class MockRtpTransportControllerSend ReceivedCongestionControlFeedbackCount, (), (const, override)); + MOCK_METHOD(int, ReceivedTransportCcFeedbackCount, (), (const, override)); }; } // namespace webrtc #endif // CALL_TEST_MOCK_RTP_TRANSPORT_CONTROLLER_SEND_H_ diff --git a/media/engine/fake_webrtc_call.h b/media/engine/fake_webrtc_call.h index ce2ec2057c..04724d831f 100644 --- a/media/engine/fake_webrtc_call.h +++ b/media/engine/fake_webrtc_call.h @@ -471,6 +471,7 @@ class FakeCall final : public webrtc::Call, public webrtc::PacketReceiver { } void EnableSendCongestionControlFeedbackAccordingToRfc8888() override {} int FeedbackAccordingToRfc8888Count() { return 0; } + int FeedbackAccordingToTransportCcCount() { return 0; } private: webrtc::AudioSendStream* CreateAudioSendStream( diff --git a/pc/congestion_control_integrationtest.cc b/pc/congestion_control_integrationtest.cc index 634c52b629..2ac804bba5 100644 --- a/pc/congestion_control_integrationtest.cc +++ b/pc/congestion_control_integrationtest.cc @@ -23,6 +23,7 @@ namespace webrtc { +using testing::Eq; using testing::HasSubstr; class PeerConnectionCongestionControlTest @@ -83,4 +84,24 @@ TEST_F(PeerConnectionCongestionControlTest, CcfbGetsUsed) { kDefaultTimeout); } +TEST_F(PeerConnectionCongestionControlTest, TransportCcGetsUsed) { + test::ScopedFieldTrials trials( + "WebRTC-RFC8888CongestionControlFeedback/Disabled/"); + ASSERT_TRUE(CreatePeerConnectionWrappers()); + ConnectFakeSignaling(); + caller()->AddAudioVideoTracks(); + caller()->CreateAndSetAndSignalOffer(); + ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout); + MediaExpectations media_expectations; + media_expectations.CalleeExpectsSomeAudio(); + media_expectations.CalleeExpectsSomeVideo(); + ASSERT_TRUE(ExpectNewFrames(media_expectations)); + auto pc_internal = caller()->pc_internal(); + EXPECT_TRUE_WAIT( + pc_internal->FeedbackAccordingToTransportCcCountForTesting() > 0, + kDefaultTimeout); + // Test that RFC 8888 feedback is NOT generated when field trial disabled. + EXPECT_THAT(pc_internal->FeedbackAccordingToRfc8888CountForTesting(), Eq(0)); +} + } // namespace webrtc diff --git a/pc/peer_connection.cc b/pc/peer_connection.cc index a9559c3a6f..b0f0446c04 100644 --- a/pc/peer_connection.cc +++ b/pc/peer_connection.cc @@ -3038,6 +3038,13 @@ int PeerConnection::FeedbackAccordingToRfc8888CountForTesting() const { }); } +int PeerConnection::FeedbackAccordingToTransportCcCountForTesting() const { + return worker_thread()->BlockingCall([this]() { + RTC_DCHECK_RUN_ON(worker_thread()); + return call_->FeedbackAccordingToTransportCcCount(); + }); +} + std::function PeerConnection::InitializeRtcpCallback() { diff --git a/pc/peer_connection.h b/pc/peer_connection.h index 923b9be4ba..d3f4457646 100644 --- a/pc/peer_connection.h +++ b/pc/peer_connection.h @@ -443,6 +443,7 @@ class PeerConnection : public PeerConnectionInternal, } void RequestUsagePatternReportForTesting(); int FeedbackAccordingToRfc8888CountForTesting() const; + int FeedbackAccordingToTransportCcCountForTesting() const; NetworkControllerInterface* GetNetworkController() override { if (!worker_thread()->IsCurrent()) {