Enable RFC 8888 feedback if negotiated

This will turn on RFC 8888 feedback messages if "ack ccfb" is negotiated.

This should eliminate the need for the "force" flag in the field trial.

Bug: webrtc:42225697
Change-Id: Iec7a894c244a417a8499200861550a33f89966a2
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/367400
Reviewed-by: Per Kjellander <perkj@webrtc.org>
Commit-Queue: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#43398}
This commit is contained in:
Harald Alvestrand 2024-11-13 11:54:41 +00:00 committed by WebRTC LUCI CQ
parent d4a3002b9b
commit 0c6d31919e
19 changed files with 182 additions and 44 deletions

View File

@ -734,13 +734,19 @@ if (rtc_include_tests) {
]
deps = [
":rtp_interfaces",
"../api:fec_controller_api",
"../api:frame_transformer_interface",
"../api:libjingle_peerconnection_api",
"../api:scoped_refptr",
"../api/crypto:frame_encryptor_interface",
"../api/crypto:options",
"../api/transport:bandwidth_estimation_settings",
"../api/transport:bitrate_settings",
"../api/transport:network_control",
"../api/units:timestamp",
"../modules/pacing",
"../modules/rtp_rtcp",
"../modules/rtp_rtcp:rtp_rtcp_format",
"../rtc_base:network_route",
"../rtc_base:rate_limiter",
"../rtc_base/network:sent_packet",

View File

@ -278,6 +278,9 @@ class Call final : public webrtc::Call,
Stats GetStats() const override;
void EnableSendCongestionControlFeedbackAccordingToRfc8888() override;
int FeedbackAccordingToRfc8888Count() override;
const FieldTrialsView& trials() const override;
TaskQueueBase* network_thread() const override;
@ -1189,6 +1192,14 @@ Call::Stats Call::GetStats() const {
return stats;
}
void Call::EnableSendCongestionControlFeedbackAccordingToRfc8888() {
receive_side_cc_.EnableSendCongestionControlFeedbackAccordingToRfc8888();
}
int Call::FeedbackAccordingToRfc8888Count() {
return transport_send_->ReceivedCongestionControlFeedbackCount();
}
const FieldTrialsView& Call::trials() const {
return env_.field_trials();
}

View File

@ -153,6 +153,9 @@ class Call {
virtual void SetClientBitratePreferences(
const BitrateSettings& preferences) = 0;
virtual void EnableSendCongestionControlFeedbackAccordingToRfc8888() = 0;
virtual int FeedbackAccordingToRfc8888Count() = 0;
virtual const FieldTrialsView& trials() const = 0;
virtual TaskQueueBase* network_thread() const = 0;

View File

@ -656,6 +656,7 @@ void RtpTransportControllerSend::OnCongestionControlFeedback(
Timestamp receive_time,
const rtcp::CongestionControlFeedback& feedback) {
RTC_DCHECK_RUN_ON(&sequence_checker_);
++feedback_count_;
// TODO: bugs.webrtc.org/42225697 - update feedback demuxer for RFC 8888.
// Suggest feedback_demuxer_.OnTransportFeedback use TransportPacketFeedback
// instead. See usage in OnTransportFeedback.

View File

@ -142,6 +142,11 @@ class RtpTransportControllerSend final
return controller_.get();
}
int ReceivedCongestionControlFeedbackCount() const override {
RTC_DCHECK_RUN_ON(&sequence_checker_);
return feedback_count_;
}
private:
void MaybeCreateControllers() RTC_RUN_ON(sequence_checker_);
void UpdateNetworkAvailability() RTC_RUN_ON(sequence_checker_);
@ -228,6 +233,8 @@ class RtpTransportControllerSend final
DataSize congestion_window_size_ RTC_GUARDED_BY(sequence_checker_);
bool is_congested_ RTC_GUARDED_BY(sequence_checker_);
// Count of feedback messages received.
int feedback_count_ RTC_GUARDED_BY(sequence_checker_) = 0;
// Protected by internal locks.
RateLimiter retransmission_rate_limiter_;

View File

@ -161,6 +161,8 @@ class RtpTransportControllerSendInterface {
virtual void EnsureStarted() = 0;
virtual NetworkControllerInterface* GetNetworkController() = 0;
// Count of RFC8888 feedback reports received
virtual int ReceivedCongestionControlFeedbackCount() const = 0;
};
} // namespace webrtc

View File

@ -11,22 +11,28 @@
#ifndef CALL_TEST_MOCK_RTP_TRANSPORT_CONTROLLER_SEND_H_
#define CALL_TEST_MOCK_RTP_TRANSPORT_CONTROLLER_SEND_H_
#include <cstddef>
#include <cstdint>
#include <map>
#include <memory>
#include <string>
#include <vector>
#include <optional>
#include "absl/strings/string_view.h"
#include "api/crypto/crypto_options.h"
#include "api/crypto/frame_encryptor_interface.h"
#include "api/fec_controller.h"
#include "api/frame_transformer_interface.h"
#include "api/scoped_refptr.h"
#include "api/transport/bandwidth_estimation_settings.h"
#include "api/transport/bitrate_settings.h"
#include "api/transport/network_control.h"
#include "api/transport/network_types.h"
#include "api/units/timestamp.h"
#include "call/rtp_config.h"
#include "call/rtp_transport_controller_send_interface.h"
#include "modules/pacing/packet_router.h"
#include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
#include "modules/rtp_rtcp/source/rtp_rtcp_interface.h"
#include "rtc_base/network/sent_packet.h"
#include "rtc_base/network_route.h"
#include "rtc_base/rate_limiter.h"
#include "test/gmock.h"
namespace webrtc {
@ -109,6 +115,10 @@ class MockRtpTransportControllerSend
GetNetworkController,
(),
(override));
MOCK_METHOD(int,
ReceivedCongestionControlFeedbackCount,
(),
(const, override));
};
} // namespace webrtc
#endif // CALL_TEST_MOCK_RTP_TRANSPORT_CONTROLLER_SEND_H_

View File

@ -469,6 +469,8 @@ class FakeCall final : public webrtc::Call, public webrtc::PacketReceiver {
const webrtc::FieldTrialsView& trials() const override {
return env_.field_trials();
}
void EnableSendCongestionControlFeedbackAccordingToRfc8888() override {}
int FeedbackAccordingToRfc8888Count() { return 0; }
private:
webrtc::AudioSendStream* CreateAudioSendStream(

View File

@ -18,6 +18,7 @@ rtc_library("congestion_controller") {
]
deps = [
"..:module_api",
"../../api:rtp_parameters",
"../../api:sequence_checker",
"../../api/environment",
@ -28,6 +29,7 @@ rtc_library("congestion_controller") {
"../../api/units:timestamp",
"../../rtc_base:logging",
"../../rtc_base:macromagic",
"../../rtc_base/experiments:field_trial_parser",
"../../rtc_base/synchronization:mutex",
"../pacing",
"../remote_bitrate_estimator",
@ -56,6 +58,7 @@ if (rtc_include_tests && !build_with_chromium) {
"../../api/units:data_size",
"../../api/units:time_delta",
"../../api/units:timestamp",
"../../rtc_base:buffer",
"../../system_wrappers",
"../../test:explicit_key_value_config",
"../../test:test_support",

View File

@ -11,15 +11,19 @@
#ifndef MODULES_CONGESTION_CONTROLLER_INCLUDE_RECEIVE_SIDE_CONGESTION_CONTROLLER_H_
#define MODULES_CONGESTION_CONTROLLER_INCLUDE_RECEIVE_SIDE_CONGESTION_CONTROLLER_H_
#include <cstdint>
#include <memory>
#include "absl/base/nullability.h"
#include "api/environment/environment.h"
#include "api/media_types.h"
#include "api/sequence_checker.h"
#include "api/transport/network_control.h"
#include "api/units/data_rate.h"
#include "api/units/data_size.h"
#include "api/units/time_delta.h"
#include "modules/congestion_controller/remb_throttler.h"
#include "modules/include/module_common_types.h"
#include "modules/remote_bitrate_estimator/congestion_control_feedback_generator.h"
#include "modules/remote_bitrate_estimator/transport_sequence_number_feedback_generator.h"
#include "modules/rtp_rtcp/source/rtp_packet_received.h"
@ -44,7 +48,7 @@ class ReceiveSideCongestionController : public CallStatsObserver {
~ReceiveSideCongestionController() override = default;
void EnablSendCongestionControlFeedbackAccordingToRfc8888();
void EnableSendCongestionControlFeedbackAccordingToRfc8888();
void OnReceivedPacket(const RtpPacketReceived& packet, MediaType media_type);

View File

@ -11,6 +11,7 @@
#include "modules/congestion_controller/include/receive_side_congestion_controller.h"
#include <algorithm>
#include <cstdint>
#include <memory>
#include <utility>
@ -18,13 +19,21 @@
#include "api/environment/environment.h"
#include "api/media_types.h"
#include "api/sequence_checker.h"
#include "api/transport/network_control.h"
#include "api/units/data_rate.h"
#include "api/units/data_size.h"
#include "api/units/time_delta.h"
#include "api/units/timestamp.h"
#include "modules/congestion_controller/remb_throttler.h"
#include "modules/remote_bitrate_estimator/congestion_control_feedback_generator.h"
#include "modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_send_time.h"
#include "modules/remote_bitrate_estimator/remote_bitrate_estimator_single_stream.h"
#include "modules/remote_bitrate_estimator/transport_sequence_number_feedback_generator.h"
#include "modules/rtp_rtcp/source/rtp_header_extensions.h"
#include "modules/rtp_rtcp/source/rtp_packet_received.h"
#include "rtc_base/experiments/field_trial_parser.h"
#include "rtc_base/logging.h"
#include "rtc_base/synchronization/mutex.h"
namespace webrtc {
@ -96,12 +105,12 @@ ReceiveSideCongestionController::ReceiveSideCongestionController(
{&force_send_rfc8888_feedback},
env.field_trials().Lookup("WebRTC-RFC8888CongestionControlFeedback"));
if (force_send_rfc8888_feedback) {
EnablSendCongestionControlFeedbackAccordingToRfc8888();
EnableSendCongestionControlFeedbackAccordingToRfc8888();
}
}
void ReceiveSideCongestionController::
EnablSendCongestionControlFeedbackAccordingToRfc8888() {
EnableSendCongestionControlFeedbackAccordingToRfc8888() {
RTC_DCHECK_RUN_ON(&sequence_checker_);
send_rfc8888_congestion_feedback_ = true;
}

View File

@ -10,6 +10,7 @@
#include "modules/congestion_controller/include/receive_side_congestion_controller.h"
#include <cstdint>
#include <memory>
#include <vector>
@ -22,13 +23,18 @@
#include "api/units/time_delta.h"
#include "api/units/timestamp.h"
#include "modules/rtp_rtcp/include/rtp_header_extension_map.h"
#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/rtp_header_extensions.h"
#include "modules/rtp_rtcp/source/rtp_packet_received.h"
#include "rtc_base/buffer.h"
#include "system_wrappers/include/clock.h"
#include "test/explicit_key_value_config.h"
#include "test/gmock.h"
#include "test/gtest.h"
#include "test/scenario/scenario.h"
#include "test/scenario/scenario_config.h"
namespace webrtc {
namespace test {
@ -133,7 +139,7 @@ TEST(ReceiveSideCongestionControllerTest, SendsRfc8888FeedbackIfEnabled) {
ReceiveSideCongestionController controller(
CreateEnvironment(&clock), rtcp_sender.AsStdFunction(),
remb_sender.AsStdFunction(), nullptr);
controller.EnablSendCongestionControlFeedbackAccordingToRfc8888();
controller.EnableSendCongestionControlFeedbackAccordingToRfc8888();
// Expect that RTCP feedback is sent.
EXPECT_CALL(rtcp_sender, Call)

View File

@ -1128,6 +1128,7 @@ rtc_source_set("peer_connection") {
"../api/transport:bitrate_settings",
"../api/transport:datagram_transport_interface",
"../api/transport:enums",
"../api/transport:network_control",
"../api/units:time_delta",
"../api/video:video_codec_constants",
"../call:call_interfaces",
@ -2567,6 +2568,7 @@ if (rtc_include_tests && !build_with_chromium) {
"../api:ice_transport_interface",
"../api:libjingle_logging_api",
"../api:libjingle_peerconnection_api",
"../api:make_ref_counted",
"../api:media_stream_interface",
"../api:mock_async_dns_resolver",
"../api:mock_rtp",
@ -2577,6 +2579,7 @@ if (rtc_include_tests && !build_with_chromium) {
"../api:rtp_sender_interface",
"../api:rtp_transceiver_direction",
"../api:scoped_refptr",
"../api:sequence_checker",
"../api/audio:audio_device",
"../api/audio:audio_mixer_api",
"../api/audio:audio_processing",
@ -2584,6 +2587,7 @@ if (rtc_include_tests && !build_with_chromium) {
"../api/crypto:frame_decryptor_interface",
"../api/crypto:frame_encryptor_interface",
"../api/crypto:options",
"../api/metronome",
"../api/rtc_event_log",
"../api/rtc_event_log:rtc_event_log_factory",
"../api/task_queue",
@ -2630,6 +2634,8 @@ if (rtc_include_tests && !build_with_chromium) {
"../rtc_base:rtc_json",
"../rtc_base:safe_conversions",
"../rtc_base:socket_address",
"../rtc_base:socket_factory",
"../rtc_base:socket_server",
"../rtc_base:ssl",
"../rtc_base:ssl_adapter",
"../rtc_base:task_queue_for_test",
@ -2647,6 +2653,7 @@ if (rtc_include_tests && !build_with_chromium) {
"../test/pc/sctp:fake_sctp_transport",
"../test/time_controller",
"//third_party/abseil-cpp/absl/algorithm:container",
"//third_party/abseil-cpp/absl/functional:any_invocable",
"//third_party/abseil-cpp/absl/memory",
"//third_party/abseil-cpp/absl/strings:string_view",
]

View File

@ -66,4 +66,21 @@ TEST_F(PeerConnectionCongestionControlTest, ReceiveOfferSetsCcfbFlag) {
}
}
TEST_F(PeerConnectionCongestionControlTest, CcfbGetsUsed) {
test::ScopedFieldTrials trials(
"WebRTC-RFC8888CongestionControlFeedback/Enabled/");
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->FeedbackAccordingToRfc8888CountForTesting() > 0,
kDefaultTimeout);
}
} // namespace webrtc

View File

@ -3031,6 +3031,13 @@ void PeerConnection::RequestUsagePatternReportForTesting() {
/* delay_ms= */ 0);
}
int PeerConnection::FeedbackAccordingToRfc8888CountForTesting() const {
return worker_thread()->BlockingCall([this]() {
RTC_DCHECK_RUN_ON(worker_thread());
return call_->FeedbackAccordingToRfc8888Count();
});
}
std::function<void(const rtc::CopyOnWriteBuffer& packet,
int64_t packet_time_us)>
PeerConnection::InitializeRtcpCallback() {

View File

@ -21,8 +21,10 @@
#include <string>
#include <vector>
#include "absl/strings/string_view.h"
#include "api/adaptation/resource.h"
#include "api/async_dns_resolver.h"
#include "api/audio/audio_device.h"
#include "api/candidate.h"
#include "api/crypto/crypto_options.h"
#include "api/data_channel_interface.h"
@ -35,8 +37,8 @@
#include "api/media_types.h"
#include "api/peer_connection_interface.h"
#include "api/rtc_error.h"
#include "api/rtc_event_log/rtc_event_log.h"
#include "api/rtc_event_log_output.h"
#include "api/rtp_parameters.h"
#include "api/rtp_receiver_interface.h"
#include "api/rtp_sender_interface.h"
#include "api/rtp_transceiver_interface.h"
@ -47,11 +49,14 @@
#include "api/set_remote_description_observer_interface.h"
#include "api/stats/rtc_stats_collector_callback.h"
#include "api/task_queue/pending_task_safety_flag.h"
#include "api/transport/bandwidth_estimation_settings.h"
#include "api/transport/bitrate_settings.h"
#include "api/transport/data_channel_transport_interface.h"
#include "api/transport/enums.h"
#include "api/transport/network_control.h"
#include "api/turn_customizer.h"
#include "call/call.h"
#include "call/payload_type_picker.h"
#include "modules/rtp_rtcp/source/rtp_packet_received.h"
#include "p2p/base/ice_transport_internal.h"
#include "p2p/base/port.h"
@ -70,7 +75,6 @@
#include "pc/rtp_transceiver.h"
#include "pc/rtp_transmission_manager.h"
#include "pc/rtp_transport_internal.h"
#include "pc/sctp_data_channel.h"
#include "pc/sdp_offer_answer.h"
#include "pc/session_description.h"
#include "pc/transceiver_list.h"
@ -438,6 +442,7 @@ class PeerConnection : public PeerConnectionInternal,
return_histogram_very_quickly_ = true;
}
void RequestUsagePatternReportForTesting();
int FeedbackAccordingToRfc8888CountForTesting() const;
NetworkControllerInterface* GetNetworkController() override {
if (!worker_thread()->IsCurrent()) {

View File

@ -4892,6 +4892,8 @@ RTCError SdpOfferAnswerHandler::PushdownMediaDescription(
std::vector<
std::pair<cricket::ChannelInterface*, const MediaContentDescription*>>
channels;
bool use_ccfb = false;
bool seen_ccfb = false;
for (const auto& transceiver : rtp_transceivers) {
const ContentInfo* content_info =
FindMediaSectionForTransceiver(transceiver, sdesc);
@ -4904,6 +4906,17 @@ RTCError SdpOfferAnswerHandler::PushdownMediaDescription(
if (!content_desc) {
continue;
}
// RFC 8888 says that the ccfb must be consistent across the description.
if (seen_ccfb) {
if (use_ccfb != content_desc->rtcp_fb_ack_ccfb()) {
RTC_LOG(LS_ERROR)
<< "Warning: Inconsistent CCFB flag - CCFB turned off";
use_ccfb = false;
}
} else {
use_ccfb = content_desc->rtcp_fb_ack_ccfb();
seen_ccfb = true;
}
transceiver->OnNegotiationUpdate(type, content_desc);
channels.push_back(std::make_pair(channel, content_desc));
@ -4930,6 +4943,17 @@ RTCError SdpOfferAnswerHandler::PushdownMediaDescription(
LOG_AND_RETURN_ERROR(RTCErrorType::INVALID_PARAMETER, error);
}
}
// If local and remote are both set, we assume that it's safe to trigger
// CCFB.
if (context_->env().field_trials().IsEnabled(
"WebRTC-RFC8888CongestionControlFeedback")) {
if (use_ccfb && local_description() && remote_description()) {
// The call and the congestion controller live on the worker thread.
context_->worker_thread()->PostTask([call = pc_->call_ptr()] {
call->EnableSendCongestionControlFeedbackAccordingToRfc8888();
});
}
}
}
// Need complete offer/answer with an SCTP m= section before starting SCTP,
// according to https://tools.ietf.org/html/draft-ietf-mmusic-sctp-sdp-19

View File

@ -10,7 +10,37 @@
#include "pc/test/integration_test_helpers.h"
#include <cstddef>
#include <cstdint>
#include <memory>
#include <string>
#include <utility>
#include <vector>
#include "absl/functional/any_invocable.h"
#include "api/audio/builtin_audio_processing_builder.h"
#include "api/enable_media_with_defaults.h"
#include "api/jsep.h"
#include "api/peer_connection_interface.h"
#include "api/rtc_event_log/rtc_event_log_factory.h"
#include "api/sequence_checker.h"
#include "api/stats/rtcstats_objects.h"
#include "api/task_queue/default_task_queue_factory.h"
#include "api/task_queue/pending_task_safety_flag.h"
#include "api/task_queue/task_queue_base.h"
#include "api/transport/field_trial_based_config.h"
#include "api/units/time_delta.h"
#include "logging/rtc_event_log/fake_rtc_event_log_factory.h"
#include "p2p/base/basic_packet_socket_factory.h"
#include "p2p/base/port_allocator.h"
#include "p2p/client/basic_port_allocator.h"
#include "pc/peer_connection_factory.h"
#include "pc/test/fake_audio_capture_module.h"
#include "rtc_base/checks.h"
#include "rtc_base/fake_network.h"
#include "rtc_base/socket_server.h"
#include "rtc_base/thread.h"
#include "test/gtest.h"
namespace webrtc {

View File

@ -18,7 +18,6 @@
#include <algorithm>
#include <functional>
#include <limits>
#include <list>
#include <map>
#include <memory>
#include <optional>
@ -27,66 +26,47 @@
#include <utility>
#include <vector>
#include "absl/algorithm/container.h"
#include "absl/functional/any_invocable.h"
#include "absl/memory/memory.h"
#include "absl/strings/string_view.h"
#include "api/audio/audio_device.h"
#include "api/audio/audio_processing.h"
#include "api/audio_options.h"
#include "api/candidate.h"
#include "api/crypto/crypto_options.h"
#include "api/data_channel_interface.h"
#include "api/enable_media_with_defaults.h"
#include "api/field_trials_view.h"
#include "api/ice_transport_interface.h"
#include "api/jsep.h"
#include "api/make_ref_counted.h"
#include "api/media_stream_interface.h"
#include "api/media_types.h"
#include "api/metronome/metronome.h"
#include "api/peer_connection_interface.h"
#include "api/rtc_error.h"
#include "api/rtc_event_log/rtc_event_log_factory.h"
#include "api/rtc_event_log/rtc_event_log_factory_interface.h"
#include "api/rtc_event_log_output.h"
#include "api/rtp_parameters.h"
#include "api/rtp_receiver_interface.h"
#include "api/rtp_sender_interface.h"
#include "api/rtp_transceiver_interface.h"
#include "api/scoped_refptr.h"
#include "api/stats/rtc_stats.h"
#include "api/sequence_checker.h"
#include "api/stats/rtc_stats_report.h"
#include "api/stats/rtcstats_objects.h"
#include "api/task_queue/default_task_queue_factory.h"
#include "api/task_queue/pending_task_safety_flag.h"
#include "api/task_queue/task_queue_factory.h"
#include "api/test/mock_async_dns_resolver.h"
#include "api/transport/field_trial_based_config.h"
#include "api/uma_metrics.h"
#include "api/units/time_delta.h"
#include "api/video/video_rotation.h"
#include "api/video_codecs/sdp_video_format.h"
#include "api/video_codecs/video_decoder_factory.h"
#include "api/video_codecs/video_encoder_factory.h"
#include "call/call.h"
#include "logging/rtc_event_log/fake_rtc_event_log_factory.h"
#include "media/base/media_engine.h"
#include "media/base/stream_params.h"
#include "media/engine/fake_webrtc_video_engine.h"
#include "p2p/base/fake_ice_transport.h"
#include "p2p/base/ice_transport_internal.h"
#include "p2p/base/p2p_constants.h"
#include "p2p/base/port.h"
#include "p2p/base/port_allocator.h"
#include "p2p/base/port_interface.h"
#include "p2p/base/test_stun_server.h"
#include "p2p/base/test_turn_customizer.h"
#include "p2p/base/test_turn_server.h"
#include "p2p/client/basic_port_allocator.h"
#include "pc/dtmf_sender.h"
#include "pc/local_audio_source.h"
#include "pc/media_session.h"
#include "pc/peer_connection.h"
#include "pc/peer_connection_factory.h"
#include "pc/peer_connection_proxy.h"
#include "pc/rtp_media_utils.h"
#include "pc/session_description.h"
#include "pc/test/fake_audio_capture_module.h"
#include "pc/test/fake_periodic_video_source.h"
@ -97,28 +77,23 @@
#include "pc/video_track_source.h"
#include "rtc_base/checks.h"
#include "rtc_base/crypto_random.h"
#include "rtc_base/event.h"
#include "rtc_base/fake_clock.h"
#include "rtc_base/fake_mdns_responder.h"
#include "rtc_base/fake_network.h"
#include "rtc_base/firewall_socket_server.h"
#include "rtc_base/gunit.h"
#include "rtc_base/ip_address.h"
#include "rtc_base/logging.h"
#include "rtc_base/mdns_responder_interface.h"
#include "rtc_base/numerics/safe_conversions.h"
#include "rtc_base/rtc_certificate_generator.h"
#include "rtc_base/socket_address.h"
#include "rtc_base/socket_factory.h"
#include "rtc_base/socket_server.h"
#include "rtc_base/ssl_stream_adapter.h"
#include "rtc_base/task_queue_for_test.h"
#include "rtc_base/task_utils/repeating_task.h"
#include "rtc_base/test_certificate_verifier.h"
#include "rtc_base/thread.h"
#include "rtc_base/thread_annotations.h"
#include "rtc_base/time_utils.h"
#include "rtc_base/virtual_socket_server.h"
#include "system_wrappers/include/metrics.h"
#include "test/gmock.h"
#include "test/gtest.h"
#include "test/scoped_key_value_config.h"
namespace webrtc {
@ -266,6 +241,15 @@ class PeerConnectionIntegrationWrapper : public PeerConnectionObserver,
PeerConnectionInterface* pc() const { return peer_connection_.get(); }
// Return the PC implementation, so that non-public interfaces
// can be used in tests.
PeerConnection* pc_internal() const {
auto* pci =
static_cast<PeerConnectionProxyWithInternal<PeerConnectionInterface>*>(
pc());
return static_cast<PeerConnection*>(pci->internal());
}
// If a signaling message receiver is set (via ConnectFakeSignaling), this
// will set the whole offer/answer exchange in motion. Just need to wait for
// the signaling state to reach "stable".