WebRtcVideoEngineTest: use simulated time.
Bug: chromium:1255737
Change-Id: I6036ae5af4b3f0e7bd04352b055935f501ecc52b
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/237341
Commit-Queue: Markus Handell <handellm@webrtc.org>
Reviewed-by: Niels Moller <nisse@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#35316}
diff --git a/media/BUILD.gn b/media/BUILD.gn
index d5aa58c..ffbb4f0 100644
--- a/media/BUILD.gn
+++ b/media/BUILD.gn
@@ -595,6 +595,7 @@
"../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 @@
"../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 5307f63..a02c14e 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 @@
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<webrtc::test::ScopedFieldTrials>(
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 @@
encoder_factory_),
std::unique_ptr<cricket::FakeWebRtcVideoDecoderFactory>(
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 @@
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<webrtc::test::ScopedFieldTrials> override_field_trials_;
webrtc::FieldTrialBasedConfig field_trials_;
webrtc::RtcEventLogNull event_log_;
@@ -560,6 +557,7 @@
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 @@
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 @@
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 @@
// 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 @@
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 @@
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 @@
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 @@
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<FakeWebRtcVideoEncoder>(nullptr);
});
@@ -1226,7 +1227,9 @@
// 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 @@
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 @@
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 @@
// 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 @@
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 @@
// 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;