Ensure Answer after PrAnswer can change usage from CCFB to TWCC feedback
Bug: webrtc:448848876
Change-Id: I991ac772b78dab26bebf3dd8716fda8ec4c2510f
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/422801
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Commit-Queue: Per Kjellander <perkj@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#46119}
diff --git a/call/BUILD.gn b/call/BUILD.gn
index effafa2..4350e0e 100644
--- a/call/BUILD.gn
+++ b/call/BUILD.gn
@@ -688,6 +688,7 @@
":rtp_interfaces",
"../api:fec_controller_api",
"../api:frame_transformer_interface",
+ "../api:rtp_parameters",
"../api:scoped_refptr",
"../api/transport:bandwidth_estimation_settings",
"../api/transport:bitrate_settings",
diff --git a/call/call.cc b/call/call.cc
index 716da8b..97a54dc 100644
--- a/call/call.cc
+++ b/call/call.cc
@@ -1173,10 +1173,8 @@
void Call::SetPreferredRtcpCcAckType(
RtcpFeedbackType preferred_rtcp_cc_ack_type) {
- if (preferred_rtcp_cc_ack_type == RtcpFeedbackType::CCFB) {
- receive_side_cc_.EnableSendCongestionControlFeedbackAccordingToRfc8888();
- transport_send_->EnableCongestionControlFeedbackAccordingToRfc8888();
- } // else default to transport CC if correct header extension is negotiated
+ receive_side_cc_.SetPreferredRtcpCcAckType(preferred_rtcp_cc_ack_type);
+ transport_send_->SetPreferredRtcpCcAckType(preferred_rtcp_cc_ack_type);
}
std::optional<int> Call::FeedbackAccordingToRfc8888Count() {
diff --git a/call/rtp_transport_controller_send.cc b/call/rtp_transport_controller_send.cc
index 880855b..cea947b 100644
--- a/call/rtp_transport_controller_send.cc
+++ b/call/rtp_transport_controller_send.cc
@@ -25,6 +25,7 @@
#include "api/frame_transformer_interface.h"
#include "api/rtc_event_log/rtc_event_log.h"
#include "api/rtp_packet_sender.h"
+#include "api/rtp_parameters.h"
#include "api/scoped_refptr.h"
#include "api/sequence_checker.h"
#include "api/task_queue/pending_task_safety_flag.h"
@@ -398,7 +399,9 @@
network_route.connected, network_route.packet_overhead));
if (rfc_8888_feedback_negotiated_) {
sending_packets_as_ect1_ = true;
- packet_router_.ConfigureForRfc8888Feedback(sending_packets_as_ect1_);
+ packet_router_.ConfigureForRtcpFeedback(
+ /*set_transport_seq=*/rfc_8888_feedback_negotiated_,
+ sending_packets_as_ect1_);
}
NetworkRouteChange msg;
msg.at_time = env_.clock().CurrentTime();
@@ -629,16 +632,24 @@
packet, pacing_info, transport_overhead_bytes_per_packet_, creation_time);
}
-void RtpTransportControllerSend::
- EnableCongestionControlFeedbackAccordingToRfc8888() {
+void RtpTransportControllerSend::SetPreferredRtcpCcAckType(
+ RtcpFeedbackType preferred_rtcp_cc_ack_type) {
RTC_DCHECK_RUN_ON(&sequence_checker_);
- rfc_8888_feedback_negotiated_ = true;
- sending_packets_as_ect1_ = true;
- RTC_LOG(LS_INFO) << "EnableCongestionControlFeedbackAccordingToRfc8888";
- // TODO: bugs.webrtc.org/447037083 - Implement support for re-enabling
- // transport sequence number feedback on PR-Answer - and possibly stop using
- // Scream.
- packet_router_.ConfigureForRfc8888Feedback(sending_packets_as_ect1_);
+ RTC_DCHECK(preferred_rtcp_cc_ack_type == RtcpFeedbackType::CCFB ||
+ preferred_rtcp_cc_ack_type == RtcpFeedbackType::TRANSPORT_CC);
+ if (preferred_rtcp_cc_ack_type == RtcpFeedbackType::CCFB) {
+ rfc_8888_feedback_negotiated_ = true;
+ sending_packets_as_ect1_ = true;
+ RTC_LOG_F(LS_INFO)
+ << "Sending packets as ECT1(1) and assume RFC 8888 feedback.";
+ } else {
+ rfc_8888_feedback_negotiated_ = false;
+ sending_packets_as_ect1_ = false;
+ RTC_LOG_F(LS_INFO) << "Assume TWCC feedback.";
+ }
+ packet_router_.ConfigureForRtcpFeedback(
+ /*set_transport_seq=*/rfc_8888_feedback_negotiated_,
+ sending_packets_as_ect1_);
}
std::optional<int>
@@ -751,7 +762,9 @@
if (!feedback.transport_supports_ecn ||
!congestion_controller_support_ecn) {
sending_packets_as_ect1_ = false;
- packet_router_.ConfigureForRfc8888Feedback(sending_packets_as_ect1_);
+ packet_router_.ConfigureForRtcpFeedback(
+ /*set_transport_seq=*/rfc_8888_feedback_negotiated_,
+ sending_packets_as_ect1_);
RTC_LOG(LS_INFO) << "Transport is "
<< (!feedback.transport_supports_ecn ? "not " : "")
<< "ECN capable. Congestion Controller does "
diff --git a/call/rtp_transport_controller_send.h b/call/rtp_transport_controller_send.h
index e8a4db0..3ffb9b0 100644
--- a/call/rtp_transport_controller_send.h
+++ b/call/rtp_transport_controller_send.h
@@ -24,6 +24,7 @@
#include "api/environment/environment.h"
#include "api/fec_controller.h"
#include "api/frame_transformer_interface.h"
+#include "api/rtp_parameters.h"
#include "api/scoped_refptr.h"
#include "api/sequence_checker.h"
#include "api/task_queue/pending_task_safety_flag.h"
@@ -144,8 +145,10 @@
return controller_.get();
}
- // Called once it's known that the remote end supports RFC 8888.
- void EnableCongestionControlFeedbackAccordingToRfc8888() override;
+ // Determines what type of RTCP feedback that should be used for congestion
+ // control.
+ void SetPreferredRtcpCcAckType(
+ RtcpFeedbackType preferred_rtcp_cc_ack_type) override;
std::optional<int> ReceivedCongestionControlFeedbackCount() const override;
flat_map<uint32_t, ReceivedCongestionControlFeedbackStats>
diff --git a/call/rtp_transport_controller_send_interface.h b/call/rtp_transport_controller_send_interface.h
index af191d6..5841ca3 100644
--- a/call/rtp_transport_controller_send_interface.h
+++ b/call/rtp_transport_controller_send_interface.h
@@ -22,6 +22,7 @@
#include "api/fec_controller.h"
#include "api/frame_transformer_interface.h"
#include "api/rtp_packet_sender.h"
+#include "api/rtp_parameters.h"
#include "api/scoped_refptr.h"
#include "api/transport/bandwidth_estimation_settings.h"
#include "api/transport/bitrate_settings.h"
@@ -160,7 +161,8 @@
virtual NetworkControllerInterface* GetNetworkController() = 0;
// Called once it's known that the remote end supports RFC 8888.
- virtual void EnableCongestionControlFeedbackAccordingToRfc8888() = 0;
+ virtual void SetPreferredRtcpCcAckType(
+ RtcpFeedbackType preferred_rtcp_cc_ack_type) = 0;
// Count of RFC8888 feedback reports received
virtual std::optional<int> ReceivedCongestionControlFeedbackCount() const = 0;
// Count of transport-cc feedback reports received
diff --git a/call/test/mock_rtp_transport_controller_send.h b/call/test/mock_rtp_transport_controller_send.h
index e1bbeb1..b45b7ee 100644
--- a/call/test/mock_rtp_transport_controller_send.h
+++ b/call/test/mock_rtp_transport_controller_send.h
@@ -20,6 +20,7 @@
#include "absl/strings/string_view.h"
#include "api/fec_controller.h"
#include "api/frame_transformer_interface.h"
+#include "api/rtp_parameters.h"
#include "api/scoped_refptr.h"
#include "api/transport/bandwidth_estimation_settings.h"
#include "api/transport/bitrate_settings.h"
@@ -115,10 +116,7 @@
GetNetworkController,
(),
(override));
- MOCK_METHOD(void,
- EnableCongestionControlFeedbackAccordingToRfc8888,
- (),
- (override));
+ MOCK_METHOD(void, SetPreferredRtcpCcAckType, (RtcpFeedbackType), (override));
MOCK_METHOD(std::optional<int>,
ReceivedCongestionControlFeedbackCount,
(),
diff --git a/modules/congestion_controller/include/receive_side_congestion_controller.h b/modules/congestion_controller/include/receive_side_congestion_controller.h
index 5eb00e2..178c2a7 100644
--- a/modules/congestion_controller/include/receive_side_congestion_controller.h
+++ b/modules/congestion_controller/include/receive_side_congestion_controller.h
@@ -16,6 +16,7 @@
#include "api/environment/environment.h"
#include "api/media_types.h"
+#include "api/rtp_parameters.h"
#include "api/sequence_checker.h"
#include "api/units/data_rate.h"
#include "api/units/time_delta.h"
@@ -46,7 +47,7 @@
~ReceiveSideCongestionController() override = default;
- void EnableSendCongestionControlFeedbackAccordingToRfc8888();
+ void SetPreferredRtcpCcAckType(RtcpFeedbackType preferred_rtcp_cc_ack_type);
void OnReceivedPacket(const RtpPacketReceived& packet, MediaType media_type);
diff --git a/modules/congestion_controller/receive_side_congestion_controller.cc b/modules/congestion_controller/receive_side_congestion_controller.cc
index 7aaa49f..e37c353 100644
--- a/modules/congestion_controller/receive_side_congestion_controller.cc
+++ b/modules/congestion_controller/receive_side_congestion_controller.cc
@@ -17,6 +17,7 @@
#include "api/environment/environment.h"
#include "api/media_types.h"
+#include "api/rtp_parameters.h"
#include "api/sequence_checker.h"
#include "api/units/data_rate.h"
#include "api/units/time_delta.h"
@@ -102,14 +103,19 @@
{&force_send_rfc8888_feedback},
env.field_trials().Lookup("WebRTC-RFC8888CongestionControlFeedback"));
if (force_send_rfc8888_feedback) {
- EnableSendCongestionControlFeedbackAccordingToRfc8888();
+ SetPreferredRtcpCcAckType(RtcpFeedbackType::CCFB);
}
}
-void ReceiveSideCongestionController::
- EnableSendCongestionControlFeedbackAccordingToRfc8888() {
+void ReceiveSideCongestionController::SetPreferredRtcpCcAckType(
+ RtcpFeedbackType preferred_rtcp_cc_ack_type) {
RTC_DCHECK_RUN_ON(&sequence_checker_);
- send_rfc8888_congestion_feedback_ = true;
+ send_rfc8888_congestion_feedback_ =
+ (preferred_rtcp_cc_ack_type == RtcpFeedbackType::CCFB);
+ RTC_LOG_F(LS_INFO) << " Sending "
+ << (send_rfc8888_congestion_feedback_ ? " RFC8888"
+ : " TWCC")
+ << " RTCP feedback.";
}
void ReceiveSideCongestionController::OnReceivedPacket(
diff --git a/modules/congestion_controller/receive_side_congestion_controller_unittest.cc b/modules/congestion_controller/receive_side_congestion_controller_unittest.cc
index 405d3b7..1b2d252 100644
--- a/modules/congestion_controller/receive_side_congestion_controller_unittest.cc
+++ b/modules/congestion_controller/receive_side_congestion_controller_unittest.cc
@@ -17,6 +17,7 @@
#include "api/environment/environment_factory.h"
#include "api/field_trials.h"
#include "api/media_types.h"
+#include "api/rtp_parameters.h"
#include "api/test/network_emulation/create_cross_traffic.h"
#include "api/test/network_emulation/cross_traffic.h"
#include "api/units/data_rate.h"
@@ -27,6 +28,7 @@
#include "modules/rtp_rtcp/source/rtcp_packet.h"
#include "modules/rtp_rtcp/source/rtcp_packet/common_header.h"
#include "modules/rtp_rtcp/source/rtcp_packet/congestion_control_feedback.h"
+#include "modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h"
#include "modules/rtp_rtcp/source/rtp_header_extensions.h"
#include "modules/rtp_rtcp/source/rtp_packet_received.h"
#include "rtc_base/buffer.h"
@@ -104,6 +106,15 @@
rtcp::CongestionControlFeedback::kFeedbackMessageType);
}
+void CheckTwCCFeedback(
+ const std::vector<std::unique_ptr<rtcp::RtcpPacket>>& rtcp_packets) {
+ ASSERT_THAT(rtcp_packets, SizeIs(1));
+ Buffer buffer = rtcp_packets[0]->Build();
+ rtcp::CommonHeader header;
+ EXPECT_TRUE(header.Parse(buffer.data(), buffer.size()));
+ EXPECT_EQ(header.fmt(), rtcp::TransportFeedback::kFeedbackMessageType);
+}
+
TEST(ReceiveSideCongestionControllerTest, SendsRfc8888FeedbackIfForced) {
FieldTrials field_trials = CreateTestFieldTrials(
"WebRTC-RFC8888CongestionControlFeedback/force_send:true/");
@@ -140,7 +151,7 @@
ReceiveSideCongestionController controller(CreateEnvironment(&clock),
rtcp_sender.AsStdFunction(),
remb_sender.AsStdFunction());
- controller.EnableSendCongestionControlFeedbackAccordingToRfc8888();
+ controller.SetPreferredRtcpCcAckType(RtcpFeedbackType::CCFB);
// Expect that RTCP feedback is sent.
EXPECT_CALL(rtcp_sender, Call)
@@ -160,6 +171,37 @@
}
TEST(ReceiveSideCongestionControllerTest,
+ SendsTwccFeedbackIfEnabledAndHaveExtension) {
+ MockFunction<void(std::vector<std::unique_ptr<rtcp::RtcpPacket>>)>
+ rtcp_sender;
+ MockFunction<void(uint64_t, std::vector<uint32_t>)> remb_sender;
+ SimulatedClock clock(123456);
+ ReceiveSideCongestionController controller(CreateEnvironment(&clock),
+ rtcp_sender.AsStdFunction(),
+ remb_sender.AsStdFunction());
+ controller.SetPreferredRtcpCcAckType(RtcpFeedbackType::TRANSPORT_CC);
+
+ // Expect that RTCP feedback is sent.
+ EXPECT_CALL(rtcp_sender, Call)
+ .WillOnce(
+ [&](std::vector<std::unique_ptr<rtcp::RtcpPacket>> rtcp_packets) {
+ CheckTwCCFeedback(rtcp_packets);
+ });
+ // Expect that REMB is not sent.
+ EXPECT_CALL(remb_sender, Call).Times(0);
+
+ RtpHeaderExtensionMap extensions;
+ extensions.Register<TransportSequenceNumber>(1);
+ RtpPacketReceived packet(&extensions);
+ packet.set_arrival_time(clock.CurrentTime());
+ packet.SetExtension<TransportSequenceNumber>(123);
+ controller.OnReceivedPacket(packet, MediaType::VIDEO);
+ TimeDelta next_process = controller.MaybeProcess();
+ clock.AdvanceTime(next_process);
+ next_process = controller.MaybeProcess();
+}
+
+TEST(ReceiveSideCongestionControllerTest,
SendsNoFeedbackIfNotRfcRfc8888EnabledAndNoTransportFeedback) {
MockFunction<void(std::vector<std::unique_ptr<rtcp::RtcpPacket>>)>
rtcp_sender;
diff --git a/modules/pacing/packet_router.cc b/modules/pacing/packet_router.cc
index 58e2cb0..eb6b524 100644
--- a/modules/pacing/packet_router.cc
+++ b/modules/pacing/packet_router.cc
@@ -87,9 +87,10 @@
notify_bwe_callback_ = std::move(callback);
}
-void PacketRouter::ConfigureForRfc8888Feedback(bool send_rtp_packets_as_ect1) {
+void PacketRouter::ConfigureForRtcpFeedback(bool set_transport_seq,
+ bool send_rtp_packets_as_ect1) {
RTC_DCHECK_RUN_ON(&thread_checker_);
- use_cc_feedback_according_to_rfc8888_ = true;
+ set_transport_seq_ = set_transport_seq;
send_rtp_packets_as_ect1_ = send_rtp_packets_as_ect1;
}
@@ -200,8 +201,7 @@
// if the TransportSequenceNumber header extension is negotiated for the
// specific media type. Historically, webrtc only used TransportSequenceNumber
// on video packets.
- if (use_cc_feedback_according_to_rfc8888_ ||
- packet->HasExtension<TransportSequenceNumber>()) {
+ if (set_transport_seq_ || packet->HasExtension<TransportSequenceNumber>()) {
packet->set_transport_sequence_number(transport_seq_++);
}
if (send_rtp_packets_as_ect1_) {
diff --git a/modules/pacing/packet_router.h b/modules/pacing/packet_router.h
index 57f05a7..6321f20 100644
--- a/modules/pacing/packet_router.h
+++ b/modules/pacing/packet_router.h
@@ -56,10 +56,12 @@
absl::AnyInvocable<void(const RtpPacketToSend& packet,
const PacedPacketInfo& pacing_info)> callback);
- // Ensures that PacketRouter generates transport sequence numbers for all RTP
- // packets. If `send_rtp_packets_as_ect1` is true, packets will be requested
- // to be sent as ect1.
- void ConfigureForRfc8888Feedback(bool send_rtp_packets_as_ect1);
+ // If `set_transport_seq` is true, PacketRouter generates transport sequence
+ // numbers for all RTP packets even if transport sequence number header
+ // extension has not been negotiated. If `send_rtp_packets_as_ect1` is true,
+ // packets will be requested to be sent as ect1.
+ void ConfigureForRtcpFeedback(bool set_transport_seq,
+ bool send_rtp_packets_as_ect1);
void AddSendRtpModule(RtpRtcpInterface* rtp_module, bool remb_candidate);
void RemoveSendRtpModule(RtpRtcpInterface* rtp_module);
@@ -121,8 +123,9 @@
RTC_GUARDED_BY(thread_checker_);
uint64_t transport_seq_ RTC_GUARDED_BY(thread_checker_);
- bool use_cc_feedback_according_to_rfc8888_ RTC_GUARDED_BY(thread_checker_) =
- false;
+ // If `set_transport_seq_` is true, a transport sequence number is created per
+ // packet even if it is not sent in a header extension.
+ bool set_transport_seq_ RTC_GUARDED_BY(thread_checker_) = false;
bool send_rtp_packets_as_ect1_ RTC_GUARDED_BY(thread_checker_) = false;
absl::AnyInvocable<void(RtpPacketToSend& packet,
const PacedPacketInfo& pacing_info)>
diff --git a/modules/pacing/packet_router_unittest.cc b/modules/pacing/packet_router_unittest.cc
index 7b9467e..ee85329 100644
--- a/modules/pacing/packet_router_unittest.cc
+++ b/modules/pacing/packet_router_unittest.cc
@@ -409,7 +409,7 @@
}
TEST_F(PacketRouterTest,
- AllocateTransportSequenceNumberWithoutExtensionIfRfc8888Enabled) {
+ AllocateTransportSequenceNumberWithoutExtensionIfConfigured) {
const uint16_t kSsrc1 = 1234;
PacketRouter packet_router;
@@ -423,7 +423,8 @@
EXPECT_CALL(rtp_1, CanSendPacket).WillRepeatedly(Return(true));
packet_router.AddSendRtpModule(&rtp_1, false);
- packet_router.ConfigureForRfc8888Feedback(/*send_rtp_packets_as_ect1=*/false);
+ packet_router.ConfigureForRtcpFeedback(/*set_transport_seq=*/true,
+ /*send_rtp_packets_as_ect1=*/false);
auto packet = BuildRtpPacket(kSsrc1);
EXPECT_CALL(notify_bwe_callback, Call)
@@ -445,7 +446,8 @@
ON_CALL(rtp_1, CanSendPacket).WillByDefault(Return(kSsrc1));
packet_router.AddSendRtpModule(&rtp_1, false);
- packet_router.ConfigureForRfc8888Feedback(/*send_rtp_packets_as_ect1=*/true);
+ packet_router.ConfigureForRtcpFeedback(/*set_transport_seq=*/true,
+ /*send_rtp_packets_as_ect1=*/true);
testing::Sequence s;
EXPECT_CALL(
@@ -458,7 +460,8 @@
.InSequence(s);
packet_router.SendPacket(BuildRtpPacket(kSsrc1), PacedPacketInfo());
- packet_router.ConfigureForRfc8888Feedback(/*send_rtp_packets_as_ect1=*/false);
+ packet_router.ConfigureForRtcpFeedback(/*set_transport_seq=*/true,
+ /*send_rtp_packets_as_ect1=*/false);
packet_router.SendPacket(BuildRtpPacket(kSsrc1), PacedPacketInfo());
packet_router.OnBatchComplete();
diff --git a/pc/pranswer_switch_integrationtest.cc b/pc/pranswer_switch_integrationtest.cc
index ac4ff04..a73d0f2 100644
--- a/pc/pranswer_switch_integrationtest.cc
+++ b/pc/pranswer_switch_integrationtest.cc
@@ -23,6 +23,7 @@
#include "api/rtc_error.h"
#include "api/test/rtc_error_matchers.h"
#include "p2p/test/test_turn_server.h"
+#include "pc/peer_connection.h"
#include "pc/test/fake_rtc_certificate_generator.h"
#include "pc/test/integration_test_helpers.h"
#include "rtc_base/socket_address.h"
@@ -252,10 +253,7 @@
ASSERT_FALSE(HasFailure());
}
-// This test completes, but is disabled because feedback type switching
-// does not work yet.
-// TODO: issues.webrtc.org/448848876 - enable when underlying issue fixed.
-TEST_F(PeerConnectionPrAnswerSwitchTest, DISABLED_MediaWithCcfbFirstThenTwcc) {
+TEST_F(PeerConnectionPrAnswerSwitchTest, MediaWithCcfbFirstThenTwcc) {
SetFieldTrials("WebRTC-RFC8888CongestionControlFeedback/Enabled,offer:true/");
SetFieldTrials("Callee2",
"WebRTC-RFC8888CongestionControlFeedback/Disabled/");
@@ -284,18 +282,20 @@
media_expectations.CalleeExpectsSomeAudio();
media_expectations.CalleeExpectsSomeVideo();
ASSERT_TRUE(ExpectNewFrames(media_expectations));
- auto pc_internal = caller()->pc_internal();
- EXPECT_THAT(
- WaitUntil(
- [&] {
- return pc_internal->FeedbackAccordingToRfc8888CountForTesting();
- },
- Gt(0)),
- IsRtcOk());
+ PeerConnection* caller_pc_internal = caller()->pc_internal();
+ EXPECT_THAT(WaitUntil(
+ [&] {
+ return caller_pc_internal
+ ->FeedbackAccordingToRfc8888CountForTesting();
+ },
+ Gt(0)),
+ IsRtcOk());
// There should be no transport-cc generated.
- EXPECT_THAT(pc_internal->FeedbackAccordingToTransportCcCountForTesting(),
- Eq(0));
- // The final answer does TWCC.
+ EXPECT_THAT(
+ caller_pc_internal->FeedbackAccordingToTransportCcCountForTesting(),
+ Eq(0));
+ // The final answer does TWCC and send audio and video.
+ second_callee->AddAudioVideoTracks();
second_callee->ReceiveSdpMessage(SdpType::kOffer, saved_offer);
EXPECT_THAT(
WaitUntil([&] { return caller()->SignalingStateStable(); }, IsTrue()),
@@ -303,21 +303,32 @@
WaitConnected(/* prAnswer= */ false, caller(), second_callee.get());
ASSERT_FALSE(HasFailure());
- int old_ccfb_count = pc_internal->FeedbackAccordingToRfc8888CountForTesting();
+ int old_ccfb_count =
+ caller_pc_internal->FeedbackAccordingToRfc8888CountForTesting();
int old_twcc_count =
- pc_internal->FeedbackAccordingToTransportCcCountForTesting();
- EXPECT_THAT(
- WaitUntil(
- [&] {
- return pc_internal->FeedbackAccordingToTransportCcCountForTesting();
- },
- Gt(old_twcc_count)),
- IsRtcOk());
+ caller_pc_internal->FeedbackAccordingToTransportCcCountForTesting();
+ EXPECT_THAT(WaitUntil(
+ [&] {
+ return caller_pc_internal
+ ->FeedbackAccordingToTransportCcCountForTesting();
+ },
+ Gt(old_twcc_count)),
+ IsRtcOk());
// These expects are easier to interpret than the WaitUntil log result.
- EXPECT_THAT(pc_internal->FeedbackAccordingToTransportCcCountForTesting(),
- Gt(old_twcc_count));
- EXPECT_THAT(pc_internal->FeedbackAccordingToRfc8888CountForTesting(),
+ EXPECT_THAT(
+ caller_pc_internal->FeedbackAccordingToTransportCcCountForTesting(),
+ Gt(old_twcc_count));
+ EXPECT_THAT(caller_pc_internal->FeedbackAccordingToRfc8888CountForTesting(),
Eq(old_ccfb_count));
+
+ PeerConnection* second_callee_pc_internal = second_callee->pc_internal();
+ EXPECT_THAT(WaitUntil(
+ [&] {
+ return second_callee_pc_internal
+ ->FeedbackAccordingToTransportCcCountForTesting();
+ },
+ Gt(0)),
+ IsRtcOk());
}
} // namespace webrtc