Revert "FrameCadenceAdapter: align video encoding to metronome"
This reverts commit b39c2a8464c48306a495f14beccf431b91e51efd.
Reason for revert: Breaks downstream build
Original change's description:
> FrameCadenceAdapter: align video encoding to metronome
>
> This CL aligns the video encoding tasks to metronome tick which
> similar with the metronome decoding.
>
> Design doc: https://docs.google.com/document/d/18PvEgS-DehClK6twCSCATOlX-j9acmXd-3vjb0tR9-Y
>
> Bug: b/304158952
> Change-Id: I262bd4a5097fdaeed559b9d7391a059ae86e2d63
> Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/327460
> Reviewed-by: Markus Handell <handellm@webrtc.org>
> Reviewed-by: Harald Alvestrand <hta@webrtc.org>
> Reviewed-by: Henrik Boström <hbos@webrtc.org>
> Commit-Queue: Zhaoliang Ma <zhaoliang.ma@intel.com>
> Cr-Commit-Position: refs/heads/main@{#41469}
Bug: b/304158952
Change-Id: I6f7a3d45cc24b63bc1fe92a93bf5c8d5058f32a8
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/333482
Bot-Commit: rubber-stamper@appspot.gserviceaccount.com <rubber-stamper@appspot.gserviceaccount.com>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Commit-Queue: Björn Terelius <terelius@webrtc.org>
Auto-Submit: Björn Terelius <terelius@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#41471}
diff --git a/api/metronome/test/fake_metronome.cc b/api/metronome/test/fake_metronome.cc
index 37001fe..025f7ce 100644
--- a/api/metronome/test/fake_metronome.cc
+++ b/api/metronome/test/fake_metronome.cc
@@ -49,10 +49,6 @@
FakeMetronome::FakeMetronome(TimeDelta tick_period)
: tick_period_(tick_period) {}
-void FakeMetronome::SetTickPeriod(TimeDelta tick_period) {
- tick_period_ = tick_period;
-}
-
void FakeMetronome::RequestCallOnNextTick(
absl::AnyInvocable<void() &&> callback) {
TaskQueueBase* current = TaskQueueBase::Current();
diff --git a/api/metronome/test/fake_metronome.h b/api/metronome/test/fake_metronome.h
index e1aff4f..73c938e 100644
--- a/api/metronome/test/fake_metronome.h
+++ b/api/metronome/test/fake_metronome.h
@@ -55,14 +55,12 @@
public:
explicit FakeMetronome(TimeDelta tick_period);
- void SetTickPeriod(TimeDelta tick_period);
-
// Metronome implementation.
void RequestCallOnNextTick(absl::AnyInvocable<void() &&> callback) override;
TimeDelta TickPeriod() const override;
private:
- TimeDelta tick_period_;
+ const TimeDelta tick_period_;
std::vector<absl::AnyInvocable<void() &&>> callbacks_;
};
diff --git a/api/peer_connection_interface.h b/api/peer_connection_interface.h
index 3c225eb..c44e741 100644
--- a/api/peer_connection_interface.h
+++ b/api/peer_connection_interface.h
@@ -1442,10 +1442,6 @@
transport_controller_send_factory;
// Metronome used for decoding, must be called on the worker thread.
std::unique_ptr<Metronome> decode_metronome;
- // Metronome used for encoding, must be called on the worker thread.
- // TODO(b/304158952): Consider merging into a single metronome for all codec
- // usage.
- std::unique_ptr<Metronome> encode_metronome;
// Media specific dependencies. Unused when `media_factory == nullptr`.
rtc::scoped_refptr<AudioDeviceModule> adm;
diff --git a/call/call.cc b/call/call.cc
index 7db8cf7..e35502f 100644
--- a/call/call.cc
+++ b/call/call.cc
@@ -889,11 +889,10 @@
VideoSendStream* send_stream = new VideoSendStream(
&env_.clock(), num_cpu_cores_, &env_.task_queue_factory(),
network_thread_, call_stats_->AsRtcpRttStats(), transport_send_.get(),
- config_.encode_metronome, bitrate_allocator_.get(),
- video_send_delay_stats_.get(), &env_.event_log(), std::move(config),
- std::move(encoder_config), suspended_video_send_ssrcs_,
- suspended_video_payload_states_, std::move(fec_controller),
- env_.field_trials());
+ bitrate_allocator_.get(), video_send_delay_stats_.get(),
+ &env_.event_log(), std::move(config), std::move(encoder_config),
+ suspended_video_send_ssrcs_, suspended_video_payload_states_,
+ std::move(fec_controller), env_.field_trials());
for (uint32_t ssrc : ssrcs) {
RTC_DCHECK(video_send_ssrcs_.find(ssrc) == video_send_ssrcs_.end());
diff --git a/call/call_config.h b/call/call_config.h
index 6fd9179..b99c644 100644
--- a/call/call_config.h
+++ b/call/call_config.h
@@ -69,7 +69,6 @@
rtp_transport_controller_send_factory = nullptr;
Metronome* decode_metronome = nullptr;
- Metronome* encode_metronome = nullptr;
// The burst interval of the pacer, see TaskQueuePacedSender constructor.
absl::optional<TimeDelta> pacer_burst_interval;
diff --git a/pc/peer_connection_factory.cc b/pc/peer_connection_factory.cc
index 6bf0ef9..06ca790 100644
--- a/pc/peer_connection_factory.cc
+++ b/pc/peer_connection_factory.cc
@@ -103,8 +103,7 @@
(dependencies->transport_controller_send_factory)
? std::move(dependencies->transport_controller_send_factory)
: std::make_unique<RtpTransportControllerSendFactory>()),
- decode_metronome_(std::move(dependencies->decode_metronome)),
- encode_metronome_(std::move(dependencies->encode_metronome)) {}
+ decode_metronome_(std::move(dependencies->decode_metronome)) {}
PeerConnectionFactory::PeerConnectionFactory(
PeerConnectionFactoryDependencies dependencies)
@@ -120,7 +119,6 @@
worker_thread()->BlockingCall([this] {
RTC_DCHECK_RUN_ON(worker_thread());
decode_metronome_ = nullptr;
- encode_metronome_ = nullptr;
});
}
@@ -346,7 +344,6 @@
call_config.rtp_transport_controller_send_factory =
transport_controller_send_factory_.get();
call_config.decode_metronome = decode_metronome_.get();
- call_config.encode_metronome = encode_metronome_.get();
call_config.pacer_burst_interval = configuration.pacer_burst_interval;
return context_->call_factory()->CreateCall(call_config);
}
diff --git a/pc/peer_connection_factory.h b/pc/peer_connection_factory.h
index a8af9f5..66afebb 100644
--- a/pc/peer_connection_factory.h
+++ b/pc/peer_connection_factory.h
@@ -148,7 +148,6 @@
const std::unique_ptr<RtpTransportControllerSendFactoryInterface>
transport_controller_send_factory_;
std::unique_ptr<Metronome> decode_metronome_ RTC_GUARDED_BY(worker_thread());
- std::unique_ptr<Metronome> encode_metronome_ RTC_GUARDED_BY(worker_thread());
};
} // namespace webrtc
diff --git a/video/BUILD.gn b/video/BUILD.gn
index 21e681c..79edee5 100644
--- a/video/BUILD.gn
+++ b/video/BUILD.gn
@@ -92,7 +92,6 @@
"../api/crypto:frame_decryptor_interface",
"../api/crypto:options",
"../api/environment",
- "../api/metronome",
"../api/task_queue",
"../api/task_queue:pending_task_safety_flag",
"../api/units:data_rate",
@@ -231,7 +230,6 @@
deps = [
"../api:field_trials_view",
"../api:sequence_checker",
- "../api/metronome",
"../api/task_queue",
"../api/task_queue:pending_task_safety_flag",
"../api/units:time_delta",
@@ -255,7 +253,6 @@
absl_deps = [
"//third_party/abseil-cpp/absl/algorithm:container",
"//third_party/abseil-cpp/absl/base:core_headers",
- "//third_party/abseil-cpp/absl/cleanup:cleanup",
]
}
diff --git a/video/frame_cadence_adapter.cc b/video/frame_cadence_adapter.cc
index 929b712..8c881f1 100644
--- a/video/frame_cadence_adapter.cc
+++ b/video/frame_cadence_adapter.cc
@@ -19,7 +19,6 @@
#include "absl/algorithm/container.h"
#include "absl/base/attributes.h"
-#include "absl/cleanup/cleanup.h"
#include "api/sequence_checker.h"
#include "api/task_queue/pending_task_safety_flag.h"
#include "api/task_queue/task_queue_base.h"
@@ -235,81 +234,10 @@
ScopedTaskSafety safety_;
};
-// Implements a frame cadence adapter supporting VSync aligned encoding.
-class VSyncEncodeAdapterMode : public AdapterMode {
- public:
- VSyncEncodeAdapterMode(
- Clock* clock,
- TaskQueueBase* queue,
- rtc::scoped_refptr<PendingTaskSafetyFlag> queue_safety_flag,
- Metronome* metronome,
- TaskQueueBase* worker_queue,
- FrameCadenceAdapterInterface::Callback* callback)
- : clock_(clock),
- queue_(queue),
- queue_safety_flag_(queue_safety_flag),
- callback_(callback),
- metronome_(metronome),
- worker_queue_(worker_queue) {
- queue_sequence_checker_.Detach();
- worker_sequence_checker_.Detach();
- }
-
- // Adapter overrides.
- void OnFrame(Timestamp post_time,
- bool queue_overload,
- const VideoFrame& frame) override;
-
- absl::optional<uint32_t> GetInputFrameRateFps() override {
- RTC_DCHECK_RUN_ON(&queue_sequence_checker_);
- return input_framerate_.Rate(clock_->TimeInMilliseconds());
- }
-
- void UpdateFrameRate() override {
- RTC_DCHECK_RUN_ON(&queue_sequence_checker_);
- input_framerate_.Update(1, clock_->TimeInMilliseconds());
- }
-
- void EncodeAllEnqueuedFrames();
-
- private:
- // Holds input frames coming from the client ready to be encoded.
- struct InputFrameRef {
- InputFrameRef(const VideoFrame& video_frame, Timestamp time_when_posted_us)
- : time_when_posted_us(time_when_posted_us),
- video_frame(std::move(video_frame)) {}
- Timestamp time_when_posted_us;
- const VideoFrame video_frame;
- };
-
- Clock* const clock_;
- TaskQueueBase* queue_;
- RTC_NO_UNIQUE_ADDRESS SequenceChecker queue_sequence_checker_;
- rtc::scoped_refptr<PendingTaskSafetyFlag> queue_safety_flag_;
- // Input frame rate statistics for use when not in zero-hertz mode.
- RateStatistics input_framerate_ RTC_GUARDED_BY(queue_sequence_checker_){
- FrameCadenceAdapterInterface::kFrameRateAveragingWindowSizeMs, 1000};
- FrameCadenceAdapterInterface::Callback* const callback_;
-
- Metronome* metronome_;
- TaskQueueBase* const worker_queue_;
- RTC_NO_UNIQUE_ADDRESS SequenceChecker worker_sequence_checker_;
- // `worker_safety_` protects tasks on the worker queue related to `metronome_`
- // since metronome usage must happen on worker thread.
- ScopedTaskSafetyDetached worker_safety_;
- Timestamp expected_next_tick_ RTC_GUARDED_BY(worker_sequence_checker_) =
- Timestamp::PlusInfinity();
- // Vector of input frames to be encoded.
- std::vector<InputFrameRef> input_queue_
- RTC_GUARDED_BY(worker_sequence_checker_);
-};
-
class FrameCadenceAdapterImpl : public FrameCadenceAdapterInterface {
public:
FrameCadenceAdapterImpl(Clock* clock,
TaskQueueBase* queue,
- Metronome* metronome,
- TaskQueueBase* worker_queue,
const FieldTrialsView& field_trials);
~FrameCadenceAdapterImpl();
@@ -345,10 +273,6 @@
// - zero-hertz mode enabled
bool IsZeroHertzScreenshareEnabled() const RTC_RUN_ON(queue_);
- // Configures current adapter on non-ZeroHertz mode, called when Initialize or
- // MaybeReconfigureAdapters.
- void ConfigureCurrentAdapterWithoutZeroHertz();
-
// Handles adapter creation on configuration changes.
void MaybeReconfigureAdapters(bool was_zero_hertz_enabled) RTC_RUN_ON(queue_);
@@ -359,21 +283,14 @@
// 0 Hz.
const bool zero_hertz_screenshare_enabled_;
- // The three possible modes we're under.
+ // The two possible modes we're under.
absl::optional<PassthroughAdapterMode> passthrough_adapter_;
absl::optional<ZeroHertzAdapterMode> zero_hertz_adapter_;
- // The `vsync_encode_adapter_` must be destroyed on the worker queue since
- // VSync metronome needs to happen on worker thread.
- std::unique_ptr<VSyncEncodeAdapterMode> vsync_encode_adapter_;
// If set, zero-hertz mode has been enabled.
absl::optional<ZeroHertzModeParams> zero_hertz_params_;
// Cache for the current adapter mode.
AdapterMode* current_adapter_mode_ = nullptr;
- // VSync encoding is used when this valid.
- Metronome* const metronome_;
- TaskQueueBase* const worker_queue_;
-
// Timestamp for statistics reporting.
absl::optional<Timestamp> zero_hertz_adapter_created_timestamp_
RTC_GUARDED_BY(queue_);
@@ -703,98 +620,23 @@
}
}
-void VSyncEncodeAdapterMode::OnFrame(Timestamp post_time,
- bool queue_overload,
- const VideoFrame& frame) {
- // We expect `metronome_` and `EncodeAllEnqueuedFrames()` runs on
- // `worker_queue_`.
- if (!worker_queue_->IsCurrent()) {
- worker_queue_->PostTask(SafeTask(
- worker_safety_.flag(), [this, post_time, queue_overload, frame] {
- OnFrame(post_time, queue_overload, frame);
- }));
- return;
- }
-
- RTC_DCHECK_RUN_ON(&worker_sequence_checker_);
- TRACE_EVENT0("webrtc", "VSyncEncodeAdapterMode::OnFrame");
-
- input_queue_.emplace_back(std::move(frame), post_time);
-
- // The `metronome_` tick period maybe throttled in some case, so here we only
- // align encode task to VSync event when `metronome_` tick period is less
- // than 34ms (30Hz).
- static constexpr TimeDelta kMaxAllowedDelay = TimeDelta::Millis(34);
- if (metronome_->TickPeriod() <= kMaxAllowedDelay) {
- // The metronome is ticking frequently enough that it is worth the extra
- // delay.
- metronome_->RequestCallOnNextTick(
- SafeTask(worker_safety_.flag(), [this] { EncodeAllEnqueuedFrames(); }));
- } else {
- // The metronome is ticking too infrequently, encode immediately.
- EncodeAllEnqueuedFrames();
- }
-}
-
-void VSyncEncodeAdapterMode::EncodeAllEnqueuedFrames() {
- RTC_DCHECK_RUN_ON(&worker_sequence_checker_);
- TRACE_EVENT0("webrtc", "VSyncEncodeAdapterMode::EncodeAllEnqueuedFrames");
-
- // Local time in webrtc time base.
- Timestamp post_time = clock_->CurrentTime();
-
- for (auto& input : input_queue_) {
- uint32_t vsync_encode_delay = (post_time - input.time_when_posted_us).ms();
- TRACE_EVENT1("webrtc", "FrameCadenceAdapterImpl::EncodeAllEnqueuedFrames",
- "VSyncEncodeDelay", vsync_encode_delay);
-
- const VideoFrame frame = std::move(input.video_frame);
- queue_->PostTask(SafeTask(queue_safety_flag_, [this, post_time, frame] {
- RTC_DCHECK_RUN_ON(queue_);
-
- // TODO(b/304158952): Support more refined queue overload control.
- callback_->OnFrame(post_time, /*queue_overload=*/false, frame);
- }));
- }
-
- input_queue_.clear();
-}
-
FrameCadenceAdapterImpl::FrameCadenceAdapterImpl(
Clock* clock,
TaskQueueBase* queue,
- Metronome* metronome,
- TaskQueueBase* worker_queue,
const FieldTrialsView& field_trials)
: clock_(clock),
queue_(queue),
zero_hertz_screenshare_enabled_(
- !field_trials.IsDisabled("WebRTC-ZeroHertzScreenshare")),
- metronome_(metronome),
- worker_queue_(worker_queue) {}
+ !field_trials.IsDisabled("WebRTC-ZeroHertzScreenshare")) {}
FrameCadenceAdapterImpl::~FrameCadenceAdapterImpl() {
RTC_DLOG(LS_VERBOSE) << __func__ << " this " << this;
-
- // VSync adapter needs to be destroyed on worker queue when metronome is
- // valid.
- if (metronome_) {
- absl::Cleanup cleanup = [adapter = std::move(vsync_encode_adapter_)] {};
- worker_queue_->PostTask([cleanup = std::move(cleanup)] {});
- }
}
void FrameCadenceAdapterImpl::Initialize(Callback* callback) {
callback_ = callback;
- // Use VSync encode mode if metronome is valid, otherwise passthrough mode
- // would be used.
- if (metronome_) {
- vsync_encode_adapter_ = std::make_unique<VSyncEncodeAdapterMode>(
- clock_, queue_, safety_.flag(), metronome_, worker_queue_, callback_);
- } else {
- passthrough_adapter_.emplace(clock_, callback);
- }
- ConfigureCurrentAdapterWithoutZeroHertz();
+ passthrough_adapter_.emplace(clock_, callback);
+ current_adapter_mode_ = &passthrough_adapter_.value();
}
void FrameCadenceAdapterImpl::SetZeroHertzModeEnabled(
@@ -813,16 +655,9 @@
void FrameCadenceAdapterImpl::UpdateFrameRate() {
RTC_DCHECK_RUN_ON(queue_);
// The frame rate need not be updated for the zero-hertz adapter. The
- // vsync encode and passthrough adapter however uses it. Always pass frames
- // into the vsync encode or passthrough to keep the estimation alive should
- // there be an adapter switch.
- if (metronome_) {
- RTC_CHECK(vsync_encode_adapter_);
- vsync_encode_adapter_->UpdateFrameRate();
- } else {
- RTC_CHECK(passthrough_adapter_);
- passthrough_adapter_->UpdateFrameRate();
- }
+ // passthrough adapter however uses it. Always pass frames into the
+ // passthrough to keep the estimation alive should there be an adapter switch.
+ passthrough_adapter_->UpdateFrameRate();
}
void FrameCadenceAdapterImpl::UpdateLayerQualityConvergence(
@@ -922,17 +757,6 @@
zero_hertz_params_.has_value();
}
-void FrameCadenceAdapterImpl::ConfigureCurrentAdapterWithoutZeroHertz() {
- // Enable VSyncEncodeAdapterMode if metronome is valid.
- if (metronome_) {
- RTC_CHECK(vsync_encode_adapter_);
- current_adapter_mode_ = vsync_encode_adapter_.get();
- } else {
- RTC_CHECK(passthrough_adapter_);
- current_adapter_mode_ = &passthrough_adapter_.value();
- }
-}
-
void FrameCadenceAdapterImpl::MaybeReconfigureAdapters(
bool was_zero_hertz_enabled) {
RTC_DCHECK_RUN_ON(queue_);
@@ -956,7 +780,7 @@
zero_hertz_adapter_ = absl::nullopt;
RTC_LOG(LS_INFO) << "Zero hertz mode disabled.";
}
- ConfigureCurrentAdapterWithoutZeroHertz();
+ current_adapter_mode_ = &passthrough_adapter_.value();
}
}
@@ -965,11 +789,8 @@
std::unique_ptr<FrameCadenceAdapterInterface>
FrameCadenceAdapterInterface::Create(Clock* clock,
TaskQueueBase* queue,
- Metronome* metronome,
- TaskQueueBase* worker_queue,
const FieldTrialsView& field_trials) {
- return std::make_unique<FrameCadenceAdapterImpl>(clock, queue, metronome,
- worker_queue, field_trials);
+ return std::make_unique<FrameCadenceAdapterImpl>(clock, queue, field_trials);
}
} // namespace webrtc
diff --git a/video/frame_cadence_adapter.h b/video/frame_cadence_adapter.h
index ec8e667..2b62bb2 100644
--- a/video/frame_cadence_adapter.h
+++ b/video/frame_cadence_adapter.h
@@ -15,7 +15,6 @@
#include "absl/base/attributes.h"
#include "api/field_trials_view.h"
-#include "api/metronome/metronome.h"
#include "api/task_queue/task_queue_base.h"
#include "api/units/time_delta.h"
#include "api/video/video_frame.h"
@@ -82,8 +81,6 @@
static std::unique_ptr<FrameCadenceAdapterInterface> Create(
Clock* clock,
TaskQueueBase* queue,
- Metronome* metronome,
- TaskQueueBase* worker_queue,
const FieldTrialsView& field_trials);
// Call before using the rest of the API.
diff --git a/video/frame_cadence_adapter_unittest.cc b/video/frame_cadence_adapter_unittest.cc
index 13fc183..0fef240 100644
--- a/video/frame_cadence_adapter_unittest.cc
+++ b/video/frame_cadence_adapter_unittest.cc
@@ -14,7 +14,6 @@
#include <vector>
#include "absl/functional/any_invocable.h"
-#include "api/metronome/test/fake_metronome.h"
#include "api/task_queue/default_task_queue_factory.h"
#include "api/task_queue/task_queue_base.h"
#include "api/task_queue/task_queue_factory.h"
@@ -65,9 +64,8 @@
std::unique_ptr<FrameCadenceAdapterInterface> CreateAdapter(
const FieldTrialsView& field_trials,
Clock* clock) {
- return FrameCadenceAdapterInterface::Create(
- clock, TaskQueueBase::Current(), /*metronome=*/nullptr,
- /*worker_queue=*/nullptr, field_trials);
+ return FrameCadenceAdapterInterface::Create(clock, TaskQueueBase::Current(),
+ field_trials);
}
class MockCallback : public FrameCadenceAdapterInterface::Callback {
@@ -595,8 +593,7 @@
auto queue = time_controller.GetTaskQueueFactory()->CreateTaskQueue(
"queue", TaskQueueFactory::Priority::NORMAL);
auto adapter = FrameCadenceAdapterInterface::Create(
- time_controller.GetClock(), queue.get(), /*metronome=*/nullptr,
- /*worker_queue=*/nullptr, enabler);
+ time_controller.GetClock(), queue.get(), enabler);
queue->PostTask([&adapter, &callback] {
adapter->Initialize(callback.get());
adapter->SetZeroHertzModeEnabled(
@@ -612,82 +609,6 @@
time_controller.AdvanceTime(3 * TimeDelta::Seconds(1) / kMaxFps);
}
-TEST(FrameCadenceAdapterTest, EncodeFramesAreAlignedWithMetronomeTick) {
- ZeroHertzFieldTrialEnabler enabler;
- GlobalSimulatedTimeController time_controller(Timestamp::Zero());
- // Here the metronome interval is 33ms, because the metronome is not
- // infrequent then the encode tasks are aligned with the tick period.
- static constexpr TimeDelta kTickPeriod = TimeDelta::Millis(33);
- auto queue = time_controller.GetTaskQueueFactory()->CreateTaskQueue(
- "queue", TaskQueueFactory::Priority::NORMAL);
- auto worker_queue = time_controller.GetTaskQueueFactory()->CreateTaskQueue(
- "work_queue", TaskQueueFactory::Priority::NORMAL);
- static test::FakeMetronome metronome(kTickPeriod);
- auto adapter = FrameCadenceAdapterInterface::Create(
- time_controller.GetClock(), queue.get(), &metronome, worker_queue.get(),
- enabler);
- MockCallback callback;
- adapter->Initialize(&callback);
- auto frame = CreateFrame();
-
- // `callback->OnFrame()` would not be called if only 32ms went by after
- // `adapter->OnFrame()`.
- EXPECT_CALL(callback, OnFrame(_, false, _)).Times(0);
- adapter->OnFrame(frame);
- time_controller.AdvanceTime(TimeDelta::Millis(32));
- Mock::VerifyAndClearExpectations(&callback);
-
- // `callback->OnFrame()` should be called if 33ms went by after
- // `adapter->OnFrame()`.
- EXPECT_CALL(callback, OnFrame(_, false, _)).Times(1);
- time_controller.AdvanceTime(TimeDelta::Millis(1));
- Mock::VerifyAndClearExpectations(&callback);
-
- // `callback->OnFrame()` would not be called if only 32ms went by after
- // `adapter->OnFrame()`.
- EXPECT_CALL(callback, OnFrame(_, false, _)).Times(0);
- // Send two frame before next tick.
- adapter->OnFrame(frame);
- adapter->OnFrame(frame);
- time_controller.AdvanceTime(TimeDelta::Millis(32));
- Mock::VerifyAndClearExpectations(&callback);
-
- // `callback->OnFrame()` should be called if 33ms went by after
- // `adapter->OnFrame()`.
- EXPECT_CALL(callback, OnFrame(_, false, _)).Times(2);
- time_controller.AdvanceTime(TimeDelta::Millis(1));
- Mock::VerifyAndClearExpectations(&callback);
-
- // Change the metronome tick period to 67ms (15Hz).
- metronome.SetTickPeriod(TimeDelta::Millis(67));
- // Expect the encode would happen immediately.
- EXPECT_CALL(callback, OnFrame(_, false, _)).Times(1);
- adapter->OnFrame(frame);
- time_controller.AdvanceTime(TimeDelta::Zero());
- Mock::VerifyAndClearExpectations(&callback);
-
- // Change the metronome tick period to 16ms (60Hz).
- metronome.SetTickPeriod(TimeDelta::Millis(16));
- // Expect the encode would not happen if only 15ms went by after
- // `adapter->OnFrame()`.
- EXPECT_CALL(callback, OnFrame(_, false, _)).Times(0);
- adapter->OnFrame(frame);
- time_controller.AdvanceTime(TimeDelta::Millis(15));
- Mock::VerifyAndClearExpectations(&callback);
- // `callback->OnFrame()` should be called if 16ms went by after
- // `adapter->OnFrame()`.
- EXPECT_CALL(callback, OnFrame(_, false, _)).Times(1);
- time_controller.AdvanceTime(TimeDelta::Millis(1));
- Mock::VerifyAndClearExpectations(&callback);
-
- rtc::Event finalized;
- queue->PostTask([&] {
- adapter = nullptr;
- finalized.Set();
- });
- finalized.Wait(rtc::Event::kForever);
-}
-
class FrameCadenceAdapterSimulcastLayersParamTest
: public ::testing::TestWithParam<int> {
public:
diff --git a/video/video_send_stream.cc b/video/video_send_stream.cc
index f336a61..b99b08e 100644
--- a/video/video_send_stream.cc
+++ b/video/video_send_stream.cc
@@ -114,7 +114,6 @@
VideoStreamEncoder::BitrateAllocationCallbackType
bitrate_allocation_callback_type,
const FieldTrialsView& field_trials,
- Metronome* metronome,
webrtc::VideoEncoderFactory::EncoderSelectorInterface* encoder_selector) {
std::unique_ptr<TaskQueueBase, TaskQueueDeleter> encoder_queue =
task_queue_factory->CreateTaskQueue("EncoderQueue",
@@ -123,9 +122,8 @@
return std::make_unique<VideoStreamEncoder>(
clock, num_cpu_cores, stats_proxy, encoder_settings,
std::make_unique<OveruseFrameDetector>(stats_proxy),
- FrameCadenceAdapterInterface::Create(
- clock, encoder_queue_ptr, metronome,
- /*worker_queue=*/TaskQueueBase::Current(), field_trials),
+ FrameCadenceAdapterInterface::Create(clock, encoder_queue_ptr,
+ field_trials),
std::move(encoder_queue), bitrate_allocation_callback_type, field_trials,
encoder_selector);
}
@@ -141,7 +139,6 @@
TaskQueueBase* network_queue,
RtcpRttStats* call_stats,
RtpTransportControllerSendInterface* transport,
- Metronome* metronome,
BitrateAllocatorInterface* bitrate_allocator,
SendDelayStats* send_delay_stats,
RtcEventLog* event_log,
@@ -164,7 +161,6 @@
config_.encoder_settings,
GetBitrateAllocationCallbackType(config_, field_trials),
field_trials,
- metronome,
config_.encoder_selector)),
encoder_feedback_(
clock,
diff --git a/video/video_send_stream.h b/video/video_send_stream.h
index ff1bf0c..05970d6 100644
--- a/video/video_send_stream.h
+++ b/video/video_send_stream.h
@@ -18,7 +18,6 @@
#include "api/fec_controller.h"
#include "api/field_trials_view.h"
-#include "api/metronome/metronome.h"
#include "api/sequence_checker.h"
#include "api/task_queue/pending_task_safety_flag.h"
#include "call/bitrate_allocator.h"
@@ -63,7 +62,6 @@
TaskQueueBase* network_queue,
RtcpRttStats* call_stats,
RtpTransportControllerSendInterface* transport,
- Metronome* metronome,
BitrateAllocatorInterface* bitrate_allocator,
SendDelayStats* send_delay_stats,
RtcEventLog* event_log,
diff --git a/video/video_stream_encoder_unittest.cc b/video/video_stream_encoder_unittest.cc
index d752e1b..6fa9908 100644
--- a/video/video_stream_encoder_unittest.cc
+++ b/video/video_stream_encoder_unittest.cc
@@ -875,9 +875,8 @@
"EncoderQueue", TaskQueueFactory::Priority::NORMAL);
TaskQueueBase* encoder_queue_ptr = encoder_queue.get();
std::unique_ptr<FrameCadenceAdapterInterface> cadence_adapter =
- FrameCadenceAdapterInterface::Create(
- time_controller_.GetClock(), encoder_queue_ptr,
- /*metronome=*/nullptr, /*worker_queue=*/nullptr, field_trials_);
+ FrameCadenceAdapterInterface::Create(time_controller_.GetClock(),
+ encoder_queue_ptr, field_trials_);
video_stream_encoder_ = std::make_unique<VideoStreamEncoderUnderTest>(
&time_controller_, std::move(cadence_adapter), std::move(encoder_queue),
stats_proxy_.get(), video_send_config_.encoder_settings,
@@ -9557,7 +9556,7 @@
"WebRTC-ZeroHertzScreenshare/Enabled/");
auto adapter = FrameCadenceAdapterInterface::Create(
factory.GetTimeController()->GetClock(), encoder_queue.get(),
- /*metronome=*/nullptr, /*worker_queue=*/nullptr, field_trials);
+ field_trials);
FrameCadenceAdapterInterface* adapter_ptr = adapter.get();
MockVideoSourceInterface mock_source;