diff --git a/media/BUILD.gn b/media/BUILD.gn index d5aa58ce50..ffbb4f0907 100644 --- a/media/BUILD.gn +++ b/media/BUILD.gn @@ -595,6 +595,7 @@ if (rtc_include_tests) { "../api/test/video:function_video_factory", "../api/transport:field_trial_based_config", "../api/units:time_delta", + "../api/units:timestamp", "../api/video:builtin_video_bitrate_allocator_factory", "../api/video:video_bitrate_allocation", "../api/video:video_codec_constants", @@ -638,6 +639,7 @@ if (rtc_include_tests) { "../test:test_main", "../test:test_support", "../test:video_test_common", + "../test/time_controller", ] absl_deps = [ "//third_party/abseil-cpp/absl/algorithm:container", diff --git a/media/engine/webrtc_video_engine_unittest.cc b/media/engine/webrtc_video_engine_unittest.cc index 5307f63497..a02c14ea7b 100644 --- a/media/engine/webrtc_video_engine_unittest.cc +++ b/media/engine/webrtc_video_engine_unittest.cc @@ -30,6 +30,7 @@ #include "api/test/video/function_video_decoder_factory.h" #include "api/transport/field_trial_based_config.h" #include "api/units/time_delta.h" +#include "api/units/timestamp.h" #include "api/video/builtin_video_bitrate_allocator_factory.h" #include "api/video/i420_buffer.h" #include "api/video/video_bitrate_allocation.h" @@ -64,6 +65,7 @@ #include "test/field_trial.h" #include "test/frame_forwarder.h" #include "test/gmock.h" +#include "test/time_controller/simulated_time_controller.h" using ::testing::_; using ::testing::Contains; @@ -242,12 +244,13 @@ class WebRtcVideoEngineTest : public ::testing::Test { public: WebRtcVideoEngineTest() : WebRtcVideoEngineTest("") {} explicit WebRtcVideoEngineTest(const std::string& field_trials) - : override_field_trials_( + : time_controller_(webrtc::Timestamp::Millis(4711)), + override_field_trials_( field_trials.empty() ? nullptr : std::make_unique( field_trials)), - task_queue_factory_(webrtc::CreateDefaultTaskQueueFactory()), + task_queue_factory_(time_controller_.CreateTaskQueueFactory()), call_(webrtc::Call::Create([&] { webrtc::Call::Config call_config(&event_log_); call_config.task_queue_factory = task_queue_factory_.get(); @@ -262,11 +265,7 @@ class WebRtcVideoEngineTest : public ::testing::Test { encoder_factory_), std::unique_ptr( decoder_factory_), - field_trials_) { - // Ensure fake clock doesn't return 0, which will cause some initializations - // fail inside RTP senders. - fake_clock_.AdvanceTime(webrtc::TimeDelta::Micros(1)); - } + field_trials_) {} protected: void AssignDefaultAptRtxTypes(); @@ -287,9 +286,7 @@ class WebRtcVideoEngineTest : public ::testing::Test { void ExpectRtpCapabilitySupport(const char* uri, bool supported) const; - // Has to be the first one, so it is initialized before the call or there is a - // race condition in the clock access. - rtc::ScopedFakeClock fake_clock_; + webrtc::GlobalSimulatedTimeController time_controller_; std::unique_ptr override_field_trials_; webrtc::FieldTrialBasedConfig field_trials_; webrtc::RtcEventLogNull event_log_; @@ -560,6 +557,7 @@ TEST_F(WebRtcVideoEngineTest, UseFactoryForVp8WhenSupported) { rtc::kNumMicrosecsPerSec / 30); EXPECT_TRUE(channel->SetVideoSend(kSsrc, nullptr, &frame_forwarder)); frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame()); + time_controller_.AdvanceTime(webrtc::TimeDelta::Zero()); // Sending one frame will have allocate the encoder. ASSERT_TRUE(encoder_factory_->WaitForCreatedVideoEncoders(1)); EXPECT_TRUE_WAIT(encoder_factory_->encoders()[0]->GetNumEncodedFrames() > 0, @@ -810,7 +808,7 @@ TEST_F(WebRtcVideoEngineTest, UsesSimulcastAdapterForVp8Factories) { rtc::kNumMicrosecsPerSec / 60); EXPECT_TRUE(channel->SetVideoSend(ssrcs.front(), nullptr, &frame_forwarder)); frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame()); - + time_controller_.AdvanceTime(webrtc::TimeDelta::Zero()); ASSERT_TRUE(encoder_factory_->WaitForCreatedVideoEncoders(2)); // Verify that encoders are configured for simulcast through adapter @@ -852,6 +850,7 @@ TEST_F(WebRtcVideoEngineTest, ChannelWithH264CanChangeToVp8) { EXPECT_TRUE(channel->SetVideoSend(kSsrc, nullptr, &frame_forwarder)); // Sending one frame will have allocate the encoder. frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame()); + time_controller_.AdvanceTime(webrtc::TimeDelta::Zero()); ASSERT_EQ_WAIT(1u, encoder_factory_->encoders().size(), kTimeout); @@ -861,6 +860,7 @@ TEST_F(WebRtcVideoEngineTest, ChannelWithH264CanChangeToVp8) { // Sending one frame will switch encoder. frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame()); + time_controller_.AdvanceTime(webrtc::TimeDelta::Zero()); EXPECT_EQ_WAIT(1u, encoder_factory_->encoders().size(), kTimeout); } @@ -890,6 +890,7 @@ TEST_F(WebRtcVideoEngineTest, rtc::kNumMicrosecsPerSec / 30); EXPECT_TRUE(channel->SetVideoSend(ssrcs.front(), nullptr, &frame_forwarder)); frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame()); + time_controller_.AdvanceTime(webrtc::TimeDelta::Zero()); ASSERT_TRUE(encoder_factory_->WaitForCreatedVideoEncoders(2)); ASSERT_TRUE(encoder_factory_->encoders()[0]->WaitForInitEncode()); @@ -922,6 +923,7 @@ TEST_F(WebRtcVideoEngineTest, rtc::kNumMicrosecsPerSec / 30); EXPECT_TRUE(channel->SetVideoSend(kSsrc, nullptr, &frame_forwarder)); frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame()); + time_controller_.AdvanceTime(webrtc::TimeDelta::Zero()); ASSERT_TRUE(encoder_factory_->WaitForCreatedVideoEncoders(1)); ASSERT_EQ(1u, encoder_factory_->encoders().size()); ASSERT_TRUE(encoder_factory_->encoders()[0]->WaitForInitEncode()); @@ -956,6 +958,7 @@ TEST_F(WebRtcVideoEngineTest, SimulcastEnabledForH264BehindFieldTrial) { rtc::kNumMicrosecsPerSec / 30); EXPECT_TRUE(channel->SetVideoSend(ssrcs[0], nullptr, &frame_forwarder)); frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame()); + time_controller_.AdvanceTime(webrtc::TimeDelta::Zero()); ASSERT_TRUE(encoder_factory_->WaitForCreatedVideoEncoders(1)); ASSERT_EQ(1u, encoder_factory_->encoders().size()); @@ -1213,9 +1216,7 @@ TEST(WebRtcVideoEngineNewVideoCodecFactoryTest, Vp8) { const webrtc::SdpVideoFormat format("VP8"); EXPECT_CALL(*encoder_factory, QueryVideoEncoder(format)) .WillRepeatedly(Return(codec_info)); - rtc::Event encoder_created; EXPECT_CALL(*encoder_factory, CreateVideoEncoder(format)).WillOnce([&] { - encoder_created.Set(); return std::make_unique(nullptr); }); @@ -1226,7 +1227,9 @@ TEST(WebRtcVideoEngineNewVideoCodecFactoryTest, Vp8) { // Create a call. webrtc::RtcEventLogNull event_log; - auto task_queue_factory = webrtc::CreateDefaultTaskQueueFactory(); + webrtc::GlobalSimulatedTimeController time_controller( + webrtc::Timestamp::Millis(4711)); + auto task_queue_factory = time_controller.CreateTaskQueueFactory(); webrtc::Call::Config call_config(&event_log); webrtc::FieldTrialBasedConfig field_trials; call_config.trials = &field_trials; @@ -1253,7 +1256,7 @@ TEST(WebRtcVideoEngineNewVideoCodecFactoryTest, Vp8) { EXPECT_TRUE(send_channel->SetVideoSend(send_ssrc, nullptr, &frame_forwarder)); // Sending one frame will allocate the encoder. frame_forwarder.IncomingCapturedFrame(frame_source.GetFrame()); - encoder_created.Wait(kTimeout); + time_controller.AdvanceTime(webrtc::TimeDelta::Zero()); // Create recv channel. const int recv_ssrc = 321; @@ -2570,7 +2573,7 @@ class WebRtcVideoChannelTest : public WebRtcVideoEngineTest { int64_t packet_time_us) { channel_->OnPacketReceived(packet, packet_time_us); rtc::Thread::Current()->ProcessMessages(0); - fake_clock_.AdvanceTime( + time_controller_.AdvanceTime( webrtc::TimeDelta::Millis(kUnsignalledReceiveStreamCooldownMs)); } @@ -4014,7 +4017,7 @@ TEST_F(WebRtcVideoChannelTest, EstimatesNtpStartTimeCorrectly) { // This timestamp is kInitialTimestamp (-1) + kFrameOffsetMs * 90, which // triggers a constant-overflow warning, hence we're calculating it explicitly // here. - fake_clock_.AdvanceTime(webrtc::TimeDelta::Millis(kFrameOffsetMs)); + time_controller_.AdvanceTime(webrtc::TimeDelta::Millis(kFrameOffsetMs)); video_frame.set_timestamp(kFrameOffsetMs * 90 - 1); video_frame.set_ntp_time_ms(kInitialNtpTimeMs + kFrameOffsetMs); stream->InjectFrame(video_frame); @@ -6744,7 +6747,7 @@ TEST_F(WebRtcVideoChannelTest, UnsignalledSsrcHasACooldown) { channel_->OnPacketReceived(packet.Buffer(), /* packet_time_us */ -1); } rtc::Thread::Current()->ProcessMessages(0); - fake_clock_.AdvanceTime( + time_controller_.AdvanceTime( webrtc::TimeDelta::Millis(kUnsignalledReceiveStreamCooldownMs - 1)); // We now have an unsignalled receive stream for kSsrc1. @@ -6768,7 +6771,7 @@ TEST_F(WebRtcVideoChannelTest, UnsignalledSsrcHasACooldown) { // After 500 ms, kSsrc2 should trigger a new unsignalled receive stream that // replaces the old one. - fake_clock_.AdvanceTime(webrtc::TimeDelta::Millis(1)); + time_controller_.AdvanceTime(webrtc::TimeDelta::Millis(1)); { // Receive a packet for kSsrc2. RtpPacket packet;