diff --git a/modules/rtp_rtcp/BUILD.gn b/modules/rtp_rtcp/BUILD.gn index 0b9caefb19..8297e2ed49 100644 --- a/modules/rtp_rtcp/BUILD.gn +++ b/modules/rtp_rtcp/BUILD.gn @@ -295,7 +295,6 @@ rtc_library("rtp_rtcp") { "../../api/rtc_event_log", "../../api/task_queue", "../../api/task_queue:pending_task_safety_flag", - "../../api/transport:field_trial_based_config", "../../api/transport:network_control", "../../api/transport/rtp:dependency_descriptor", "../../api/transport/rtp:rtp_source", @@ -728,7 +727,6 @@ if (rtc_include_tests) { "../../test:mock_transport", "../../test:rtp_test_utils", "../../test:run_loop", - "../../test:scoped_key_value_config", "../../test:test_support", "../../test/time_controller:time_controller", "../video_coding:codec_globals_headers", diff --git a/modules/rtp_rtcp/source/rtcp_receiver.cc b/modules/rtp_rtcp/source/rtcp_receiver.cc index 38222473f4..6116470735 100644 --- a/modules/rtp_rtcp/source/rtcp_receiver.cc +++ b/modules/rtp_rtcp/source/rtcp_receiver.cc @@ -26,8 +26,9 @@ #include "absl/algorithm/container.h" #include "absl/base/attributes.h" #include "api/array_view.h" +#include "api/environment/environment.h" +#include "api/field_trials_view.h" #include "api/sequence_checker.h" -#include "api/transport/field_trial_based_config.h" #include "api/transport/network_types.h" #include "api/units/data_rate.h" #include "api/units/time_delta.h" @@ -157,11 +158,12 @@ struct RTCPReceiver::PacketInformation { std::unique_ptr loss_notification; }; -RTCPReceiver::RTCPReceiver(const RtpRtcpInterface::Configuration& config, +RTCPReceiver::RTCPReceiver(const Environment& env, + const RtpRtcpInterface::Configuration& config, ModuleRtpRtcpImpl2* owner) - : clock_(config.clock), + : env_(env), receiver_only_(config.receiver_only), - enable_congestion_controller_feedback_(FieldTrialBasedConfig().IsEnabled( + enable_congestion_controller_feedback_(env_.field_trials().IsEnabled( "WebRTC-RFC8888CongestionControlFeedback")), rtp_rtcp_(owner), registered_ssrcs_(false, config), @@ -182,15 +184,16 @@ RTCPReceiver::RTCPReceiver(const RtpRtcpInterface::Configuration& config, report_block_data_observer_(config.report_block_data_observer), packet_type_counter_observer_(config.rtcp_packet_type_counter_observer), num_skipped_packets_(0), - last_skipped_packets_warning_(clock_->CurrentTime()) { + last_skipped_packets_warning_(env_.clock().CurrentTime()) { RTC_DCHECK(owner); } -RTCPReceiver::RTCPReceiver(const RtpRtcpInterface::Configuration& config, +RTCPReceiver::RTCPReceiver(const Environment& env, + const RtpRtcpInterface::Configuration& config, ModuleRtpRtcp* owner) - : clock_(config.clock), + : env_(env), receiver_only_(config.receiver_only), - enable_congestion_controller_feedback_(FieldTrialBasedConfig().IsEnabled( + enable_congestion_controller_feedback_(env_.field_trials().IsEnabled( "WebRTC-RFC8888CongestionControlFeedback")), rtp_rtcp_(owner), registered_ssrcs_(true, config), @@ -211,7 +214,7 @@ RTCPReceiver::RTCPReceiver(const RtpRtcpInterface::Configuration& config, report_block_data_observer_(config.report_block_data_observer), packet_type_counter_observer_(config.rtcp_packet_type_counter_observer), num_skipped_packets_(0), - last_skipped_packets_warning_(clock_->CurrentTime()) { + last_skipped_packets_warning_(env_.clock().CurrentTime()) { RTC_DCHECK(owner); // Dear reader - if you're here because of this log statement and are // wondering what this is about, chances are that you are using an instance @@ -337,7 +340,7 @@ std::optional RTCPReceiver::OnPeriodicRttUpdate(Timestamp newer_than, } // Check for expired timers and if so, log and reset. - Timestamp now = clock_->CurrentTime(); + Timestamp now = env_.clock().CurrentTime(); if (RtcpRrTimeoutLocked(now)) { RTC_LOG_F(LS_WARNING) << "Timeout: No RTCP RR received."; } else if (RtcpRrSequenceNumberTimeoutLocked(now)) { @@ -371,7 +374,7 @@ RTCPReceiver::ConsumeReceivedXrReferenceTimeInfo() { std::vector last_xr_rtis; last_xr_rtis.reserve(last_xr_rtis_size); - const uint32_t now_ntp = CompactNtp(clock_->CurrentNtpTime()); + const uint32_t now_ntp = CompactNtp(env_.clock().CurrentNtpTime()); for (size_t i = 0; i < last_xr_rtis_size; ++i) { RrtrInformation& rrtr = received_rrtrs_.front(); @@ -497,7 +500,7 @@ bool RTCPReceiver::ParseCompoundPacket(rtc::ArrayView packet, } if (num_skipped_packets_ > 0) { - const Timestamp now = clock_->CurrentTime(); + const Timestamp now = env_.clock().CurrentTime(); if (now - last_skipped_packets_warning_ >= kMaxWarningLogInterval) { last_skipped_packets_warning_ = now; RTC_LOG(LS_WARNING) @@ -550,7 +553,7 @@ bool RTCPReceiver::HandleSenderReport(const CommonHeader& rtcp_block, remote_sender_.last_remote_timestamp = sender_report.ntp(); remote_sender_.last_remote_rtp_timestamp = sender_report.rtp_timestamp(); - remote_sender_.last_arrival_timestamp = clock_->CurrentNtpTime(); + remote_sender_.last_arrival_timestamp = env_.clock().CurrentNtpTime(); remote_sender_.packets_sent = sender_report.sender_packet_count(); remote_sender_.bytes_sent = sender_report.sender_octet_count(); remote_sender_.reports_count++; @@ -605,7 +608,7 @@ void RTCPReceiver::HandleReportBlock(const ReportBlock& report_block, if (!registered_ssrcs_.contains(report_block.source_ssrc())) return; - Timestamp now = clock_->CurrentTime(); + Timestamp now = env_.clock().CurrentTime(); last_received_rb_ = now; ReportBlockData* report_block_data = @@ -616,7 +619,7 @@ void RTCPReceiver::HandleReportBlock(const ReportBlock& report_block, // the last RR was sent from the remote side. last_increased_sequence_number_ = last_received_rb_; } - NtpTime now_ntp = clock_->ConvertTimestampToNtpTime(now); + NtpTime now_ntp = env_.clock().ConvertTimestampToNtpTime(now); // Number of seconds since 1900 January 1 00:00 GMT (see // https://tools.ietf.org/html/rfc868). report_block_data->SetReportBlock( @@ -653,14 +656,14 @@ RTCPReceiver::TmmbrInformation* RTCPReceiver::FindOrCreateTmmbrInfo( // Create or find receive information. TmmbrInformation* tmmbr_info = &tmmbr_infos_[remote_ssrc]; // Update that this remote is alive. - tmmbr_info->last_time_received = clock_->CurrentTime(); + tmmbr_info->last_time_received = env_.clock().CurrentTime(); return tmmbr_info; } void RTCPReceiver::UpdateTmmbrRemoteIsAlive(uint32_t remote_ssrc) { auto tmmbr_it = tmmbr_infos_.find(remote_ssrc); if (tmmbr_it != tmmbr_infos_.end()) - tmmbr_it->second.last_time_received = clock_->CurrentTime(); + tmmbr_it->second.last_time_received = env_.clock().CurrentTime(); } RTCPReceiver::TmmbrInformation* RTCPReceiver::GetTmmbrInformation( @@ -677,18 +680,18 @@ RTCPReceiver::TmmbrInformation* RTCPReceiver::GetTmmbrInformation( // the worker thread and thus no locking is needed. bool RTCPReceiver::RtcpRrTimeout() { MutexLock lock(&rtcp_receiver_lock_); - return RtcpRrTimeoutLocked(clock_->CurrentTime()); + return RtcpRrTimeoutLocked(env_.clock().CurrentTime()); } bool RTCPReceiver::RtcpRrSequenceNumberTimeout() { MutexLock lock(&rtcp_receiver_lock_); - return RtcpRrSequenceNumberTimeoutLocked(clock_->CurrentTime()); + return RtcpRrSequenceNumberTimeoutLocked(env_.clock().CurrentTime()); } bool RTCPReceiver::UpdateTmmbrTimers() { MutexLock lock(&rtcp_receiver_lock_); - Timestamp timeout = clock_->CurrentTime() - kTmmbrTimeoutInterval; + Timestamp timeout = env_.clock().CurrentTime() - kTmmbrTimeoutInterval; if (oldest_tmmbr_info_ >= timeout) return false; @@ -846,7 +849,8 @@ bool RTCPReceiver::HandleXr(const CommonHeader& rtcp_block, void RTCPReceiver::HandleXrReceiveReferenceTime(uint32_t sender_ssrc, const rtcp::Rrtr& rrtr) { uint32_t received_remote_mid_ntp_time = CompactNtp(rrtr.ntp()); - uint32_t local_receive_mid_ntp_time = CompactNtp(clock_->CurrentNtpTime()); + uint32_t local_receive_mid_ntp_time = + CompactNtp(env_.clock().CurrentNtpTime()); auto it = received_rrtrs_ssrc_it_.find(sender_ssrc); if (it != received_rrtrs_ssrc_it_.end()) { @@ -886,7 +890,7 @@ void RTCPReceiver::HandleXrDlrrReportBlock(uint32_t sender_ssrc, } uint32_t delay_ntp = rti.delay_since_last_rr; - uint32_t now_ntp = CompactNtp(clock_->CurrentNtpTime()); + uint32_t now_ntp = CompactNtp(env_.clock().CurrentNtpTime()); uint32_t rtt_ntp = now_ntp - delay_ntp - send_time_ntp; TimeDelta rtt = CompactNtpRttToTimeDelta(rtt_ntp); @@ -1029,7 +1033,7 @@ bool RTCPReceiver::HandleFir(const CommonHeader& rtcp_block, if (fir.requests().empty()) return true; - const Timestamp now = clock_->CurrentTime(); + const Timestamp now = env_.clock().CurrentTime(); for (const rtcp::Fir::Request& fir_request : fir.requests()) { // Is it our sender that is requested to generate a new keyframe. if (local_media_ssrc() != fir_request.ssrc) @@ -1100,7 +1104,7 @@ void RTCPReceiver::NotifyTmmbrUpdated() { uint64_t bitrate_bps = TMMBRHelp::CalcMinBitrateBps(bounding); if (bitrate_bps < std::numeric_limits::max()) { network_link_rtcp_observer_->OnReceiverEstimatedMaxBitrate( - clock_->CurrentTime(), DataRate::BitsPerSec(bitrate_bps)); + env_.clock().CurrentTime(), DataRate::BitsPerSec(bitrate_bps)); } } @@ -1162,7 +1166,7 @@ void RTCPReceiver::TriggerCallbacksFromRtcpPacket( } if (network_link_rtcp_observer_) { - Timestamp now = clock_->CurrentTime(); + Timestamp now = env_.clock().CurrentTime(); if (packet_information.packet_type_flags & kRtcpRemb) { network_link_rtcp_observer_->OnReceiverEstimatedMaxBitrate( now, DataRate::BitsPerSec( @@ -1218,7 +1222,7 @@ std::vector RTCPReceiver::TmmbrReceived() { MutexLock lock(&rtcp_receiver_lock_); std::vector candidates; - Timestamp now = clock_->CurrentTime(); + Timestamp now = env_.clock().CurrentTime(); for (auto& kv : tmmbr_infos_) { for (auto it = kv.second.tmmbr.begin(); it != kv.second.tmmbr.end();) { diff --git a/modules/rtp_rtcp/source/rtcp_receiver.h b/modules/rtp_rtcp/source/rtcp_receiver.h index 05b5c547b2..766a808044 100644 --- a/modules/rtp_rtcp/source/rtcp_receiver.h +++ b/modules/rtp_rtcp/source/rtcp_receiver.h @@ -20,6 +20,7 @@ #include "absl/container/inlined_vector.h" #include "api/array_view.h" +#include "api/environment/environment.h" #include "api/sequence_checker.h" #include "api/units/time_delta.h" #include "api/units/timestamp.h" @@ -36,7 +37,6 @@ #include "rtc_base/synchronization/mutex.h" #include "rtc_base/system/no_unique_address.h" #include "rtc_base/thread_annotations.h" -#include "system_wrappers/include/clock.h" namespace webrtc { @@ -95,10 +95,12 @@ class RTCPReceiver final { int round_trip_time_measurements_ = 0; }; - RTCPReceiver(const RtpRtcpInterface::Configuration& config, + RTCPReceiver(const Environment& env, + const RtpRtcpInterface::Configuration& config, ModuleRtpRtcp* owner); - RTCPReceiver(const RtpRtcpInterface::Configuration& config, + RTCPReceiver(const Environment& env, + const RtpRtcpInterface::Configuration& config, ModuleRtpRtcpImpl2* owner); ~RTCPReceiver(); @@ -356,7 +358,7 @@ class RTCPReceiver final { bool RtcpRrSequenceNumberTimeoutLocked(Timestamp now) RTC_EXCLUSIVE_LOCKS_REQUIRED(rtcp_receiver_lock_); - Clock* const clock_; + const Environment env_; const bool receiver_only_; const bool enable_congestion_controller_feedback_; ModuleRtpRtcp* const rtp_rtcp_; diff --git a/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc b/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc index 7b8a15f1c4..31e5d343ff 100644 --- a/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc +++ b/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc @@ -10,24 +10,35 @@ #include "modules/rtp_rtcp/source/rtcp_receiver.h" +#include +#include #include +#include #include +#include #include +#include +#include "absl/strings/string_view.h" #include "api/array_view.h" +#include "api/environment/environment_factory.h" +#include "api/units/data_rate.h" #include "api/units/time_delta.h" #include "api/units/timestamp.h" #include "api/video/video_bitrate_allocation.h" #include "api/video/video_bitrate_allocator.h" +#include "api/video/video_codec_constants.h" #include "modules/rtp_rtcp/include/report_block_data.h" +#include "modules/rtp_rtcp/include/rtcp_statistics.h" +#include "modules/rtp_rtcp/include/rtp_rtcp_defines.h" #include "modules/rtp_rtcp/mocks/mock_network_link_rtcp_observer.h" #include "modules/rtp_rtcp/source/byte_io.h" #include "modules/rtp_rtcp/source/ntp_time_util.h" -#include "modules/rtp_rtcp/source/rtcp_packet.h" #include "modules/rtp_rtcp/source/rtcp_packet/app.h" #include "modules/rtp_rtcp/source/rtcp_packet/bye.h" #include "modules/rtp_rtcp/source/rtcp_packet/compound_packet.h" #include "modules/rtp_rtcp/source/rtcp_packet/congestion_control_feedback.h" +#include "modules/rtp_rtcp/source/rtcp_packet/dlrr.h" #include "modules/rtp_rtcp/source/rtcp_packet/extended_reports.h" #include "modules/rtp_rtcp/source/rtcp_packet/fir.h" #include "modules/rtp_rtcp/source/rtcp_packet/nack.h" @@ -35,17 +46,21 @@ #include "modules/rtp_rtcp/source/rtcp_packet/rapid_resync_request.h" #include "modules/rtp_rtcp/source/rtcp_packet/receiver_report.h" #include "modules/rtp_rtcp/source/rtcp_packet/remb.h" +#include "modules/rtp_rtcp/source/rtcp_packet/rtpfb.h" #include "modules/rtp_rtcp/source/rtcp_packet/sdes.h" #include "modules/rtp_rtcp/source/rtcp_packet/sender_report.h" #include "modules/rtp_rtcp/source/rtcp_packet/tmmbr.h" #include "modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h" +#include "modules/rtp_rtcp/source/rtp_rtcp_interface.h" #include "rtc_base/arraysize.h" -#include "rtc_base/fake_clock.h" +#include "rtc_base/buffer.h" #include "rtc_base/random.h" +#include "rtc_base/time_utils.h" +#include "system_wrappers/include/clock.h" #include "system_wrappers/include/ntp_time.h" +#include "test/explicit_key_value_config.h" #include "test/gmock.h" #include "test/gtest.h" -#include "test/scoped_key_value_config.h" namespace webrtc { namespace { @@ -66,7 +81,7 @@ using ::testing::SizeIs; using ::testing::StrEq; using ::testing::StrictMock; using ::testing::UnorderedElementsAre; -using ::webrtc::test::ScopedKeyValueConfig; +using ::webrtc::test::ExplicitKeyValueConfig; class MockRtcpPacketTypeCounterObserver : public RtcpPacketTypeCounterObserver { public: @@ -143,9 +158,8 @@ constexpr TimeDelta kEpsilon = TimeDelta::Millis(1); } // namespace struct ReceiverMocks { - ReceiverMocks() : clock(1335900000) {} - - SimulatedClock clock; + SimulatedClock clock{1335900000}; + std::string field_trials; // Callbacks to packet_type_counter_observer are frequent but most of the time // are not interesting. NiceMock packet_type_counter_observer; @@ -154,28 +168,30 @@ struct ReceiverMocks { StrictMock bitrate_allocation_observer; StrictMock rtp_rtcp_impl; NiceMock network_link_rtcp_observer; + + RtpRtcpInterface::Configuration config = { + .receiver_only = false, + .intra_frame_callback = &intra_frame_observer, + .rtcp_loss_notification_observer = &rtcp_loss_notification_observer, + .network_link_rtcp_observer = &network_link_rtcp_observer, + .bitrate_allocation_observer = &bitrate_allocation_observer, + .rtcp_packet_type_counter_observer = &packet_type_counter_observer, + .rtcp_report_interval_ms = kRtcpIntervalMs, + .local_media_ssrc = kReceiverMainSsrc, + .rtx_send_ssrc = kReceiverExtraSsrc}; }; -RtpRtcpInterface::Configuration DefaultConfiguration(ReceiverMocks* mocks) { - RtpRtcpInterface::Configuration config; - config.clock = &mocks->clock; - config.receiver_only = false; - config.rtcp_packet_type_counter_observer = - &mocks->packet_type_counter_observer; - config.network_link_rtcp_observer = &mocks->network_link_rtcp_observer; - config.intra_frame_callback = &mocks->intra_frame_observer; - config.rtcp_loss_notification_observer = - &mocks->rtcp_loss_notification_observer; - config.bitrate_allocation_observer = &mocks->bitrate_allocation_observer; - config.rtcp_report_interval_ms = kRtcpIntervalMs; - config.local_media_ssrc = kReceiverMainSsrc; - config.rtx_send_ssrc = kReceiverExtraSsrc; - return config; +RTCPReceiver Create(ReceiverMocks& mocks) { + return RTCPReceiver( + CreateEnvironment( + &mocks.clock, + std::make_unique(mocks.field_trials)), + mocks.config, &mocks.rtp_rtcp_impl); } TEST(RtcpReceiverTest, BrokenPacketIsIgnored) { ReceiverMocks mocks; - RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl); + RTCPReceiver receiver = Create(mocks); const uint8_t bad_packet[] = {0, 0, 0, 0}; EXPECT_CALL(mocks.packet_type_counter_observer, RtcpPacketTypesCounterUpdated) @@ -185,7 +201,7 @@ TEST(RtcpReceiverTest, BrokenPacketIsIgnored) { TEST(RtcpReceiverTest, InvalidFeedbackPacketIsIgnored) { ReceiverMocks mocks; - RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl); + RTCPReceiver receiver = Create(mocks); // Too short feedback packet. const uint8_t bad_packet[] = {0x81, rtcp::Rtpfb::kPacketType, 0, 0}; @@ -197,7 +213,7 @@ TEST(RtcpReceiverTest, InvalidFeedbackPacketIsIgnored) { TEST(RtcpReceiverTest, InjectSrPacket) { ReceiverMocks mocks; - RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl); + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); EXPECT_FALSE(receiver.GetSenderReportStats()); @@ -213,7 +229,7 @@ TEST(RtcpReceiverTest, InjectSrPacket) { TEST(RtcpReceiverTest, InjectSrPacketFromUnknownSender) { ReceiverMocks mocks; - RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl); + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); rtcp::SenderReport sr; @@ -230,7 +246,7 @@ TEST(RtcpReceiverTest, InjectSrPacketFromUnknownSender) { TEST(RtcpReceiverTest, InjectSrPacketCalculatesRTT) { ReceiverMocks mocks; - RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl); + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); const TimeDelta kRtt = TimeDelta::Millis(123); @@ -259,7 +275,7 @@ TEST(RtcpReceiverTest, InjectSrPacketCalculatesRTT) { TEST(RtcpReceiverTest, InjectSrPacketCalculatesNegativeRTTAsOneMs) { ReceiverMocks mocks; - RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl); + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); const TimeDelta kRtt = TimeDelta::Millis(-13); @@ -289,7 +305,7 @@ TEST(RtcpReceiverTest, InjectSrPacketCalculatesNegativeRTTAsOneMs) { TEST(RtcpReceiverTest, TwoReportBlocksWithLastOneWithoutLastSrCalculatesRtt) { ReceiverMocks mocks; - RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl); + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); const TimeDelta kRtt = TimeDelta::Millis(125); @@ -317,7 +333,7 @@ TEST(RtcpReceiverTest, TwoReportBlocksWithLastOneWithoutLastSrCalculatesRtt) { TEST(RtcpReceiverTest, InjectRrPacket) { ReceiverMocks mocks; - RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl); + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); rtcp::ReceiverReport rr; @@ -331,7 +347,7 @@ TEST(RtcpReceiverTest, InjectRrPacket) { TEST(RtcpReceiverTest, InjectRrPacketWithReportBlockNotToUsIgnored) { ReceiverMocks mocks; - RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl); + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); rtcp::ReportBlock rb; @@ -350,7 +366,7 @@ TEST(RtcpReceiverTest, InjectRrPacketWithReportBlockNotToUsIgnored) { TEST(RtcpReceiverTest, InjectRrPacketWithOneReportBlock) { ReceiverMocks mocks; - RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl); + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); Timestamp now = mocks.clock.CurrentTime(); @@ -371,7 +387,7 @@ TEST(RtcpReceiverTest, InjectRrPacketWithOneReportBlock) { TEST(RtcpReceiverTest, InjectSrPacketWithOneReportBlock) { ReceiverMocks mocks; - RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl); + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); Timestamp now = mocks.clock.CurrentTime(); @@ -395,7 +411,7 @@ TEST(RtcpReceiverTest, InjectRrPacketWithTwoReportBlocks) { const uint32_t kCumLost[] = {13, 555}; const uint8_t kFracLost[] = {20, 11}; ReceiverMocks mocks; - RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl); + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); Timestamp now = mocks.clock.CurrentTime(); @@ -473,7 +489,7 @@ TEST(RtcpReceiverTest, const int32_t kCumLost[] = {13, 555}; const uint8_t kFracLost[] = {20, 11}; ReceiverMocks mocks; - RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl); + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); rtcp::ReportBlock rb1; @@ -525,7 +541,7 @@ TEST(RtcpReceiverTest, TEST(RtcpReceiverTest, NotifiesNetworkLinkObserverOnReportBlocks) { ReceiverMocks mocks; - RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl); + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); rtcp::ReportBlock rb1; @@ -559,9 +575,8 @@ TEST(RtcpReceiverTest, GetRtt) { const uint32_t kSentCompactNtp = 0x1234; const uint32_t kDelayCompactNtp = 0x222; ReceiverMocks mocks; - RtpRtcpInterface::Configuration config = DefaultConfiguration(&mocks); - config.network_link_rtcp_observer = &mocks.network_link_rtcp_observer; - RTCPReceiver receiver(config, &mocks.rtp_rtcp_impl); + mocks.config.network_link_rtcp_observer = &mocks.network_link_rtcp_observer; + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); // No report block received. @@ -591,7 +606,7 @@ TEST(RtcpReceiverTest, GetRtt) { // App packets are ignored. TEST(RtcpReceiverTest, InjectApp) { ReceiverMocks mocks; - RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl); + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); rtcp::App app; @@ -606,9 +621,8 @@ TEST(RtcpReceiverTest, InjectApp) { TEST(RtcpReceiverTest, InjectSdesWithOneChunk) { ReceiverMocks mocks; MockCnameCallbackImpl callback; - RtpRtcpInterface::Configuration config = DefaultConfiguration(&mocks); - config.rtcp_cname_callback = &callback; - RTCPReceiver receiver(config, &mocks.rtp_rtcp_impl); + mocks.config.rtcp_cname_callback = &callback; + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); const char kCname[] = "alice@host"; @@ -621,7 +635,7 @@ TEST(RtcpReceiverTest, InjectSdesWithOneChunk) { TEST(RtcpReceiverTest, InjectByePacketRemovesReportBlocks) { ReceiverMocks mocks; - RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl); + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); rtcp::ReportBlock rb1; @@ -655,7 +669,7 @@ TEST(RtcpReceiverTest, InjectByePacketRemovesReportBlocks) { TEST(RtcpReceiverTest, InjectByePacketRemovesReferenceTimeInfo) { ReceiverMocks mocks; - RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl); + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); rtcp::ExtendedReports xr; @@ -674,7 +688,7 @@ TEST(RtcpReceiverTest, InjectByePacketRemovesReferenceTimeInfo) { TEST(RtcpReceiverTest, InjectPliPacket) { ReceiverMocks mocks; - RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl); + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); rtcp::Pli pli; @@ -691,7 +705,7 @@ TEST(RtcpReceiverTest, InjectPliPacket) { TEST(RtcpReceiverTest, PliPacketNotToUsIgnored) { ReceiverMocks mocks; - RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl); + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); rtcp::Pli pli; @@ -707,7 +721,7 @@ TEST(RtcpReceiverTest, PliPacketNotToUsIgnored) { TEST(RtcpReceiverTest, InjectFirPacket) { ReceiverMocks mocks; - RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl); + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); rtcp::Fir fir; @@ -724,7 +738,7 @@ TEST(RtcpReceiverTest, InjectFirPacket) { TEST(RtcpReceiverTest, FirPacketNotToUsIgnored) { ReceiverMocks mocks; - RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl); + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); rtcp::Fir fir; @@ -736,7 +750,7 @@ TEST(RtcpReceiverTest, FirPacketNotToUsIgnored) { TEST(RtcpReceiverTest, ExtendedReportsPacketWithZeroReportBlocksIgnored) { ReceiverMocks mocks; - RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl); + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); rtcp::ExtendedReports xr; @@ -747,7 +761,7 @@ TEST(RtcpReceiverTest, ExtendedReportsPacketWithZeroReportBlocksIgnored) { TEST(RtcpReceiverTest, InjectExtendedReportsReceiverReferenceTimePacket) { ReceiverMocks mocks; - RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl); + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); const NtpTime kNtp(0x10203, 0x40506); @@ -772,10 +786,9 @@ TEST(RtcpReceiverTest, InjectExtendedReportsReceiverReferenceTimePacket) { TEST(RtcpReceiverTest, ExtendedReportsDlrrPacketNotToUsIgnored) { ReceiverMocks mocks; - auto config = DefaultConfiguration(&mocks); // Allow calculate rtt using dlrr/rrtr, simulating media receiver side. - config.non_sender_rtt_measurement = true; - RTCPReceiver receiver(config, &mocks.rtp_rtcp_impl); + mocks.config.non_sender_rtt_measurement = true; + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); rtcp::ExtendedReports xr; @@ -794,9 +807,8 @@ TEST(RtcpReceiverTest, ExtendedReportsDlrrPacketNotToUsIgnored) { TEST(RtcpReceiverTest, InjectExtendedReportsDlrrPacketWithSubBlock) { ReceiverMocks mocks; - auto config = DefaultConfiguration(&mocks); - config.non_sender_rtt_measurement = true; - RTCPReceiver receiver(config, &mocks.rtp_rtcp_impl); + mocks.config.non_sender_rtt_measurement = true; + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); const uint32_t kLastRR = 0x12345; @@ -822,9 +834,8 @@ TEST(RtcpReceiverTest, InjectExtendedReportsDlrrPacketWithSubBlock) { TEST(RtcpReceiverTest, InjectExtendedReportsDlrrPacketWithMultipleSubBlocks) { ReceiverMocks mocks; - auto config = DefaultConfiguration(&mocks); - config.non_sender_rtt_measurement = true; - RTCPReceiver receiver(config, &mocks.rtp_rtcp_impl); + mocks.config.non_sender_rtt_measurement = true; + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); const uint32_t kLastRR = 0x12345; @@ -851,9 +862,8 @@ TEST(RtcpReceiverTest, InjectExtendedReportsDlrrPacketWithMultipleSubBlocks) { TEST(RtcpReceiverTest, InjectExtendedReportsPacketWithMultipleReportBlocks) { ReceiverMocks mocks; - auto config = DefaultConfiguration(&mocks); - config.non_sender_rtt_measurement = true; - RTCPReceiver receiver(config, &mocks.rtp_rtcp_impl); + mocks.config.non_sender_rtt_measurement = true; + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); rtcp::Rrtr rrtr; @@ -872,9 +882,8 @@ TEST(RtcpReceiverTest, InjectExtendedReportsPacketWithMultipleReportBlocks) { TEST(RtcpReceiverTest, InjectExtendedReportsPacketWithUnknownReportBlock) { ReceiverMocks mocks; - auto config = DefaultConfiguration(&mocks); - config.non_sender_rtt_measurement = true; - RTCPReceiver receiver(config, &mocks.rtp_rtcp_impl); + mocks.config.non_sender_rtt_measurement = true; + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); rtcp::Rrtr rrtr; @@ -904,9 +913,8 @@ TEST(RtcpReceiverTest, InjectExtendedReportsPacketWithUnknownReportBlock) { TEST(RtcpReceiverTest, TestExtendedReportsRrRttInitiallyFalse) { ReceiverMocks mocks; - auto config = DefaultConfiguration(&mocks); - config.non_sender_rtt_measurement = true; - RTCPReceiver receiver(config, &mocks.rtp_rtcp_impl); + mocks.config.non_sender_rtt_measurement = true; + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); EXPECT_FALSE(receiver.GetAndResetXrRrRtt()); @@ -919,9 +927,8 @@ TEST(RtcpReceiverTest, TestExtendedReportsRrRttInitiallyFalse) { TEST(RtcpReceiverTest, RttCalculatedAfterExtendedReportsDlrr) { ReceiverMocks mocks; - auto config = DefaultConfiguration(&mocks); - config.non_sender_rtt_measurement = true; - RTCPReceiver receiver(config, &mocks.rtp_rtcp_impl); + mocks.config.non_sender_rtt_measurement = true; + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); Random rand(0x0123456789abcdef); @@ -951,9 +958,8 @@ TEST(RtcpReceiverTest, RttCalculatedAfterExtendedReportsDlrr) { // the config struct. TEST(RtcpReceiverTest, SetterEnablesReceiverRtt) { ReceiverMocks mocks; - auto config = DefaultConfiguration(&mocks); - config.non_sender_rtt_measurement = false; - RTCPReceiver receiver(config, &mocks.rtp_rtcp_impl); + mocks.config.non_sender_rtt_measurement = false; + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); receiver.SetNonSenderRttMeasurement(true); @@ -984,9 +990,8 @@ TEST(RtcpReceiverTest, SetterEnablesReceiverRtt) { // the config struct. TEST(RtcpReceiverTest, DoesntCalculateRttOnReceivedDlrr) { ReceiverMocks mocks; - auto config = DefaultConfiguration(&mocks); - config.non_sender_rtt_measurement = true; - RTCPReceiver receiver(config, &mocks.rtp_rtcp_impl); + mocks.config.non_sender_rtt_measurement = true; + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); receiver.SetNonSenderRttMeasurement(false); @@ -1015,9 +1020,8 @@ TEST(RtcpReceiverTest, DoesntCalculateRttOnReceivedDlrr) { TEST(RtcpReceiverTest, XrDlrrCalculatesNegativeRttAsOneMillisecond) { ReceiverMocks mocks; - auto config = DefaultConfiguration(&mocks); - config.non_sender_rtt_measurement = true; - RTCPReceiver receiver(config, &mocks.rtp_rtcp_impl); + mocks.config.non_sender_rtt_measurement = true; + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); Random rand(0x0123456789abcdef); @@ -1046,9 +1050,8 @@ TEST(RtcpReceiverTest, XrDlrrCalculatesNegativeRttAsOneMillisecond) { // Test receiver RTT stats with multiple measurements. TEST(RtcpReceiverTest, ReceiverRttWithMultipleMeasurements) { ReceiverMocks mocks; - auto config = DefaultConfiguration(&mocks); - config.non_sender_rtt_measurement = true; - RTCPReceiver receiver(config, &mocks.rtp_rtcp_impl); + mocks.config.non_sender_rtt_measurement = true; + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); Random rand(0x0123456789abcdef); @@ -1101,9 +1104,8 @@ TEST(RtcpReceiverTest, ReceiverRttWithMultipleMeasurements) { // https://www.w3.org/TR/webrtc-stats/#dom-rtcremoteoutboundrtpstreamstats-roundtriptime. TEST(RtcpReceiverTest, ReceiverRttResetOnSrWithoutXr) { ReceiverMocks mocks; - auto config = DefaultConfiguration(&mocks); - config.non_sender_rtt_measurement = true; - RTCPReceiver receiver(config, &mocks.rtp_rtcp_impl); + mocks.config.non_sender_rtt_measurement = true; + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); Random rand(0x0123456789abcdef); @@ -1145,9 +1147,8 @@ TEST(RtcpReceiverTest, ReceiverRttResetOnSrWithoutXr) { // https://www.w3.org/TR/webrtc-stats/#dom-rtcremoteoutboundrtpstreamstats-roundtriptime. TEST(RtcpReceiverTest, ReceiverRttResetOnDlrrWithZeroTimestamp) { ReceiverMocks mocks; - auto config = DefaultConfiguration(&mocks); - config.non_sender_rtt_measurement = true; - RTCPReceiver receiver(config, &mocks.rtp_rtcp_impl); + mocks.config.non_sender_rtt_measurement = true; + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); Random rand(0x0123456789abcdef); @@ -1184,9 +1185,8 @@ TEST(RtcpReceiverTest, ReceiverRttResetOnDlrrWithZeroTimestamp) { // Check that the receiver RTT works correctly when the remote SSRC changes. TEST(RtcpReceiverTest, ReceiverRttWithMultipleRemoteSsrcs) { ReceiverMocks mocks; - auto config = DefaultConfiguration(&mocks); - config.non_sender_rtt_measurement = false; - RTCPReceiver receiver(config, &mocks.rtp_rtcp_impl); + mocks.config.non_sender_rtt_measurement = false; + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); receiver.SetNonSenderRttMeasurement(true); @@ -1238,7 +1238,7 @@ TEST(RtcpReceiverTest, ReceiverRttWithMultipleRemoteSsrcs) { TEST(RtcpReceiverTest, ConsumeReceivedXrReferenceTimeInfoInitiallyEmpty) { ReceiverMocks mocks; - RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl); + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); EXPECT_THAT(receiver.ConsumeReceivedXrReferenceTimeInfo(), IsEmpty()); @@ -1246,7 +1246,7 @@ TEST(RtcpReceiverTest, ConsumeReceivedXrReferenceTimeInfoInitiallyEmpty) { TEST(RtcpReceiverTest, ConsumeReceivedXrReferenceTimeInfo) { ReceiverMocks mocks; - RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl); + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); const NtpTime kNtp(0x10203, 0x40506); @@ -1273,7 +1273,7 @@ TEST(RtcpReceiverTest, ConsumeReceivedXrReferenceTimeInfo) { TEST(RtcpReceiverTest, ReceivedRrtrFromSameSsrcUpdatesReceivedReferenceTimeInfo) { ReceiverMocks mocks; - RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl); + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); const NtpTime kNtp1(0x10203, 0x40506); @@ -1303,7 +1303,7 @@ TEST(RtcpReceiverTest, TEST(RtcpReceiverTest, StoresLastReceivedRrtrPerSsrc) { ReceiverMocks mocks; - RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl); + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); const size_t kNumBufferedReports = 1; @@ -1335,7 +1335,7 @@ TEST(RtcpReceiverTest, StoresLastReceivedRrtrPerSsrc) { TEST(RtcpReceiverTest, ReceiveReportTimeout) { ReceiverMocks mocks; - RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl); + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); const uint16_t kSequenceNumber = 1234; @@ -1407,7 +1407,7 @@ TEST(RtcpReceiverTest, ReceiveReportTimeout) { TEST(RtcpReceiverTest, TmmbrReceivedWithNoIncomingPacket) { ReceiverMocks mocks; - RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl); + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); EXPECT_THAT(receiver.TmmbrReceived(), IsEmpty()); @@ -1415,7 +1415,7 @@ TEST(RtcpReceiverTest, TmmbrReceivedWithNoIncomingPacket) { TEST(RtcpReceiverTest, TmmbrPacketAccepted) { ReceiverMocks mocks; - RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl); + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); const DataRate kBitrate = DataRate::BitsPerSec(30'000); @@ -1443,7 +1443,7 @@ TEST(RtcpReceiverTest, TmmbrPacketAccepted) { TEST(RtcpReceiverTest, TmmbrPacketNotForUsIgnored) { ReceiverMocks mocks; - RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl); + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); const uint32_t kBitrateBps = 30000; @@ -1467,7 +1467,7 @@ TEST(RtcpReceiverTest, TmmbrPacketNotForUsIgnored) { TEST(RtcpReceiverTest, TmmbrPacketZeroRateIgnored) { ReceiverMocks mocks; - RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl); + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); auto tmmbr = std::make_unique(); @@ -1489,7 +1489,7 @@ TEST(RtcpReceiverTest, TmmbrPacketZeroRateIgnored) { TEST(RtcpReceiverTest, TmmbrThreeConstraintsTimeOut) { ReceiverMocks mocks; - RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl); + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); // Inject 3 packets "from" kSenderSsrc, kSenderSsrc+1, kSenderSsrc+2. @@ -1531,9 +1531,8 @@ TEST(RtcpReceiverTest, VerifyBlockAndTimestampObtainedFromReportBlockDataObserver) { ReceiverMocks mocks; MockReportBlockDataObserverImpl observer; - RtpRtcpInterface::Configuration config = DefaultConfiguration(&mocks); - config.report_block_data_observer = &observer; - RTCPReceiver receiver(config, &mocks.rtp_rtcp_impl); + mocks.config.report_block_data_observer = &observer; + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); const uint8_t kFractionLoss = 3; @@ -1574,9 +1573,8 @@ TEST(RtcpReceiverTest, TEST(RtcpReceiverTest, VerifyRttObtainedFromReportBlockDataObserver) { ReceiverMocks mocks; MockReportBlockDataObserverImpl observer; - RtpRtcpInterface::Configuration config = DefaultConfiguration(&mocks); - config.report_block_data_observer = &observer; - RTCPReceiver receiver(config, &mocks.rtp_rtcp_impl); + mocks.config.report_block_data_observer = &observer; + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); // To avoid issues with rounding due to different way to represent time units, @@ -1620,7 +1618,7 @@ TEST(RtcpReceiverTest, VerifyRttObtainedFromReportBlockDataObserver) { TEST(RtcpReceiverTest, GetReportBlockDataAfterOneReportBlock) { ReceiverMocks mocks; - RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl); + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); const uint16_t kSequenceNumber = 1234; @@ -1644,7 +1642,7 @@ TEST(RtcpReceiverTest, GetReportBlockDataAfterOneReportBlock) { TEST(RtcpReceiverTest, GetReportBlockDataAfterTwoReportBlocksOfSameSsrc) { ReceiverMocks mocks; - RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl); + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); const uint16_t kSequenceNumber1 = 1234; @@ -1682,7 +1680,7 @@ TEST(RtcpReceiverTest, GetReportBlockDataAfterTwoReportBlocksOfSameSsrc) { TEST(RtcpReceiverTest, GetReportBlockDataAfterTwoReportBlocksOfDifferentSsrcs) { ReceiverMocks mocks; - RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl); + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); const uint16_t kSequenceNumber1 = 1234; @@ -1722,12 +1720,11 @@ TEST(RtcpReceiverTest, GetReportBlockDataAfterTwoReportBlocksOfDifferentSsrcs) { TEST(RtcpReceiverTest, NotifiesNetworkLinkObserverOnTransportFeedback) { ReceiverMocks mocks; - RtpRtcpInterface::Configuration config = DefaultConfiguration(&mocks); - RTCPReceiver receiver(config, &mocks.rtp_rtcp_impl); + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); rtcp::TransportFeedback packet; - packet.SetMediaSsrc(config.local_media_ssrc); + packet.SetMediaSsrc(mocks.config.local_media_ssrc); packet.SetSenderSsrc(kSenderSsrc); packet.SetBase(123, Timestamp::Millis(1)); packet.AddReceivedPacket(123, Timestamp::Millis(1)); @@ -1744,11 +1741,9 @@ TEST(RtcpReceiverTest, NotifiesNetworkLinkObserverOnTransportFeedback) { } TEST(RtcpReceiverTest, NotifiesNetworkLinkObserverOnCongestionControlFeedback) { - ScopedKeyValueConfig trials( - "WebRTC-RFC8888CongestionControlFeedback/Enabled/"); ReceiverMocks mocks; - RtpRtcpInterface::Configuration config = DefaultConfiguration(&mocks); - RTCPReceiver receiver(config, &mocks.rtp_rtcp_impl); + mocks.field_trials = "WebRTC-RFC8888CongestionControlFeedback/Enabled/"; + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); rtcp::CongestionControlFeedback packet({{ @@ -1767,11 +1762,9 @@ TEST(RtcpReceiverTest, NotifiesNetworkLinkObserverOnCongestionControlFeedback) { } TEST(RtcpReceiverTest, HandlesInvalidCongestionControlFeedback) { - ScopedKeyValueConfig trials( - "WebRTC-RFC8888CongestionControlFeedback/Enabled/"); ReceiverMocks mocks; - RtpRtcpInterface::Configuration config = DefaultConfiguration(&mocks); - RTCPReceiver receiver(config, &mocks.rtp_rtcp_impl); + mocks.field_trials = "WebRTC-RFC8888CongestionControlFeedback/Enabled/"; + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); rtcp::CongestionControlFeedback packet({{ @@ -1794,12 +1787,11 @@ TEST(RtcpReceiverTest, HandlesInvalidCongestionControlFeedback) { TEST(RtcpReceiverTest, NotifiesNetworkLinkObserverOnTransportFeedbackOnRtxSsrc) { ReceiverMocks mocks; - RtpRtcpInterface::Configuration config = DefaultConfiguration(&mocks); - RTCPReceiver receiver(config, &mocks.rtp_rtcp_impl); + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); rtcp::TransportFeedback packet; - packet.SetMediaSsrc(*config.rtx_send_ssrc); + packet.SetMediaSsrc(*mocks.config.rtx_send_ssrc); packet.SetSenderSsrc(kSenderSsrc); packet.SetBase(1, Timestamp::Millis(1)); packet.AddReceivedPacket(1, Timestamp::Millis(1)); @@ -1811,7 +1803,7 @@ TEST(RtcpReceiverTest, TEST(RtcpReceiverTest, DoesNotNotifyNetworkLinkObserverOnTransportFeedbackForUnregistedSsrc) { ReceiverMocks mocks; - RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl); + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); rtcp::TransportFeedback packet; @@ -1826,7 +1818,7 @@ TEST(RtcpReceiverTest, TEST(RtcpReceiverTest, NotifiesNetworkLinkObserverOnRemb) { ReceiverMocks mocks; - RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl); + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); rtcp::Remb remb; @@ -1841,7 +1833,7 @@ TEST(RtcpReceiverTest, NotifiesNetworkLinkObserverOnRemb) { TEST(RtcpReceiverTest, HandlesInvalidTransportFeedback) { ReceiverMocks mocks; - RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl); + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); // Send a compound packet with a TransportFeedback followed by something else. @@ -1875,7 +1867,7 @@ TEST(RtcpReceiverTest, HandlesInvalidTransportFeedback) { TEST(RtcpReceiverTest, Nack) { ReceiverMocks mocks; - RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl); + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); const uint16_t kNackList1[] = {1, 2, 3, 5}; @@ -1930,7 +1922,7 @@ TEST(RtcpReceiverTest, Nack) { TEST(RtcpReceiverTest, NackNotForUsIgnored) { ReceiverMocks mocks; - RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl); + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); const uint16_t kNackList1[] = {1, 2, 3, 5}; @@ -1949,7 +1941,7 @@ TEST(RtcpReceiverTest, NackNotForUsIgnored) { TEST(RtcpReceiverTest, ForceSenderReport) { ReceiverMocks mocks; - RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl); + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); rtcp::RapidResyncRequest rr; @@ -1962,7 +1954,7 @@ TEST(RtcpReceiverTest, ForceSenderReport) { TEST(RtcpReceiverTest, ReceivesTargetBitrate) { ReceiverMocks mocks; - RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl); + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); VideoBitrateAllocation expected_allocation; @@ -1996,7 +1988,7 @@ TEST(RtcpReceiverTest, ReceivesTargetBitrate) { TEST(RtcpReceiverTest, HandlesIncorrectTargetBitrate) { ReceiverMocks mocks; - RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl); + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); VideoBitrateAllocation expected_allocation; @@ -2019,7 +2011,7 @@ TEST(RtcpReceiverTest, HandlesIncorrectTargetBitrate) { TEST(RtcpReceiverTest, ChangeLocalMediaSsrc) { ReceiverMocks mocks; // Construct a receiver with `kReceiverMainSsrc` (default) local media ssrc. - RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl); + RTCPReceiver receiver = Create(mocks); receiver.SetRemoteSSRC(kSenderSsrc); constexpr uint32_t kSecondarySsrc = kReceiverMainSsrc + 1; diff --git a/modules/rtp_rtcp/source/rtp_rtcp_impl.cc b/modules/rtp_rtcp/source/rtp_rtcp_impl.cc index a2d963ada2..600230b328 100644 --- a/modules/rtp_rtcp/source/rtp_rtcp_impl.cc +++ b/modules/rtp_rtcp/source/rtp_rtcp_impl.cc @@ -90,7 +90,7 @@ ModuleRtpRtcpImpl::ModuleRtpRtcpImpl(const Environment& env, : env_(env), rtcp_sender_( RTCPSender::Configuration::FromRtpRtcpConfiguration(configuration)), - rtcp_receiver_(configuration, this), + rtcp_receiver_(env_, configuration, this), last_bitrate_process_time_(env_.clock().TimeInMilliseconds()), last_rtt_process_time_(env_.clock().TimeInMilliseconds()), packet_overhead_(28), // IPV4 UDP. diff --git a/modules/rtp_rtcp/source/rtp_rtcp_impl2.cc b/modules/rtp_rtcp/source/rtp_rtcp_impl2.cc index 43ae7d5dc4..cc61ad4d71 100644 --- a/modules/rtp_rtcp/source/rtp_rtcp_impl2.cc +++ b/modules/rtp_rtcp/source/rtp_rtcp_impl2.cc @@ -116,7 +116,7 @@ ModuleRtpRtcpImpl2::ModuleRtpRtcpImpl2(TagConfigurationIncludesEnvironment, [this](TimeDelta duration) { ScheduleRtcpSendEvaluation(duration); })), - rtcp_receiver_(configuration, this), + rtcp_receiver_(env_, configuration, this), packet_overhead_(28), // IPV4 UDP. nack_last_time_sent_full_ms_(0), nack_last_seq_number_sent_(0), diff --git a/test/fuzzers/BUILD.gn b/test/fuzzers/BUILD.gn index 34b765b964..09faca4cc2 100644 --- a/test/fuzzers/BUILD.gn +++ b/test/fuzzers/BUILD.gn @@ -224,11 +224,14 @@ webrtc_fuzzer_test("rtp_video_frame_assembler_fuzzer") { webrtc_fuzzer_test("rtcp_receiver_fuzzer") { sources = [ "rtcp_receiver_fuzzer.cc" ] deps = [ + "../../api:array_view", + "../../api/environment", + "../../api/environment:environment_factory", "../../modules/rtp_rtcp", "../../modules/rtp_rtcp:rtp_rtcp_format", "../../rtc_base:checks", "../../system_wrappers", - "../../system_wrappers:field_trial", + "../../test:explicit_key_value_config", ] seed_corpus = "corpora/rtcp-corpus" } diff --git a/test/fuzzers/rtcp_receiver_fuzzer.cc b/test/fuzzers/rtcp_receiver_fuzzer.cc index 5dedf58260..f4987523ee 100644 --- a/test/fuzzers/rtcp_receiver_fuzzer.cc +++ b/test/fuzzers/rtcp_receiver_fuzzer.cc @@ -7,11 +7,19 @@ * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ + +#include +#include +#include + +#include "api/array_view.h" +#include "api/environment/environment_factory.h" +#include "modules/rtp_rtcp/include/report_block_data.h" #include "modules/rtp_rtcp/source/rtcp_packet/tmmb_item.h" #include "modules/rtp_rtcp/source/rtcp_receiver.h" #include "modules/rtp_rtcp/source/rtp_rtcp_interface.h" #include "system_wrappers/include/clock.h" -#include "system_wrappers/include/field_trial.h" +#include "test/explicit_key_value_config.h" namespace webrtc { namespace { @@ -37,17 +45,17 @@ void FuzzOneInput(const uint8_t* data, size_t size) { if (size > kMaxInputLenBytes) { return; } - field_trial::InitFieldTrialsFromString( + test::ExplicitKeyValueConfig field_trials( "WebRTC-RFC8888CongestionControlFeedback/Enabled/"); NullModuleRtpRtcp rtp_rtcp_module; SimulatedClock clock(1234); RtpRtcpInterface::Configuration config; - config.clock = &clock; config.rtcp_report_interval_ms = kRtcpIntervalMs; config.local_media_ssrc = 1; - RTCPReceiver receiver(config, &rtp_rtcp_module); + RTCPReceiver receiver(CreateEnvironment(&clock, &field_trials), config, + &rtp_rtcp_module); receiver.IncomingPacket(rtc::MakeArrayView(data, size)); }