Propagate environment into OveruseFrameDetector
Thus use propagated instead of global field trials.
Bug: webrtc:10335
Change-Id: I6b1923cc90a2054efc4d878a425b99536d60885c
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/346560
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Reviewed-by: Åsa Persson <asapersson@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#42041}
diff --git a/video/adaptation/BUILD.gn b/video/adaptation/BUILD.gn
index d206909..75bd0d2 100644
--- a/video/adaptation/BUILD.gn
+++ b/video/adaptation/BUILD.gn
@@ -38,6 +38,7 @@
"../../api:scoped_refptr",
"../../api:sequence_checker",
"../../api/adaptation:resource_adaptation_api",
+ "../../api/environment",
"../../api/task_queue:task_queue",
"../../api/units:data_rate",
"../../api/units:time_delta",
@@ -65,7 +66,6 @@
"../../rtc_base/synchronization:mutex",
"../../rtc_base/system:no_unique_address",
"../../rtc_base/task_utils:repeating_task",
- "../../system_wrappers:field_trial",
"../../system_wrappers:system_wrappers",
"../../video:video_stream_encoder_interface",
"../../video/config:encoder_config",
@@ -92,6 +92,8 @@
":video_adaptation",
"../../api:field_trials_view",
"../../api:scoped_refptr",
+ "../../api/environment",
+ "../../api/environment:environment_factory",
"../../api/task_queue:task_queue",
"../../api/units:time_delta",
"../../api/units:timestamp",
@@ -111,9 +113,7 @@
"../../rtc_base:rtc_numerics",
"../../rtc_base:task_queue_for_test",
"../../rtc_base:threading",
- "../../test:field_trial",
"../../test:rtc_expect_death",
- "../../test:scoped_key_value_config",
"../../test:test_support",
"../../test/time_controller:time_controller",
]
diff --git a/video/adaptation/overuse_frame_detector.cc b/video/adaptation/overuse_frame_detector.cc
index 2edbbe2..2397b55 100644
--- a/video/adaptation/overuse_frame_detector.cc
+++ b/video/adaptation/overuse_frame_detector.cc
@@ -20,13 +20,14 @@
#include <string>
#include <utility>
+#include "api/environment/environment.h"
+#include "api/field_trials_view.h"
#include "api/video/video_frame.h"
#include "rtc_base/checks.h"
#include "rtc_base/logging.h"
#include "rtc_base/numerics/exp_filter.h"
#include "rtc_base/time_utils.h"
#include "rtc_base/trace_event.h"
-#include "system_wrappers/include/field_trial.h"
#if defined(WEBRTC_MAC) && !defined(WEBRTC_IOS)
#include <mach/mach.h>
@@ -431,7 +432,8 @@
} // namespace
std::unique_ptr<OveruseFrameDetector::ProcessingUsage>
-OveruseFrameDetector::CreateProcessingUsage(const CpuOveruseOptions& options) {
+OveruseFrameDetector::CreateProcessingUsage(const FieldTrialsView& field_trials,
+ const CpuOveruseOptions& options) {
std::unique_ptr<ProcessingUsage> instance;
if (options.filter_time_ms > 0) {
instance = std::make_unique<SendProcessingUsage2>(options);
@@ -439,7 +441,7 @@
instance = std::make_unique<SendProcessingUsage1>(options);
}
std::string toggling_interval =
- field_trial::FindFullName("WebRTC-ForceSimulatedOveruseIntervalMs");
+ field_trials.Lookup("WebRTC-ForceSimulatedOveruseIntervalMs");
if (!toggling_interval.empty()) {
int normal_period_ms = 0;
int overuse_period_ms = 0;
@@ -466,8 +468,10 @@
}
OveruseFrameDetector::OveruseFrameDetector(
+ const Environment& env,
CpuOveruseMetricsObserver* metrics_observer)
- : metrics_observer_(metrics_observer),
+ : env_(env),
+ metrics_observer_(metrics_observer),
num_process_times_(0),
// TODO(bugs.webrtc.org/9078): Use absl::optional
last_capture_time_us_(-1),
@@ -481,7 +485,7 @@
current_rampup_delay_ms_(kStandardRampUpDelayMs) {
task_checker_.Detach();
ParseFieldTrial({&filter_time_constant_},
- field_trial::FindFullName("WebRTC-CpuLoadEstimator"));
+ env_.field_trials().Lookup("WebRTC-CpuLoadEstimator"));
}
OveruseFrameDetector::~OveruseFrameDetector() {}
@@ -644,7 +648,7 @@
}
// Force reset with next frame.
num_pixels_ = 0;
- usage_ = CreateProcessingUsage(options);
+ usage_ = CreateProcessingUsage(env_.field_trials(), options);
}
bool OveruseFrameDetector::IsOverusing(int usage_percent) {
diff --git a/video/adaptation/overuse_frame_detector.h b/video/adaptation/overuse_frame_detector.h
index f39cee0..e1729a0 100644
--- a/video/adaptation/overuse_frame_detector.h
+++ b/video/adaptation/overuse_frame_detector.h
@@ -15,6 +15,7 @@
#include <memory>
#include "absl/types/optional.h"
+#include "api/environment/environment.h"
#include "api/field_trials_view.h"
#include "api/sequence_checker.h"
#include "api/task_queue/task_queue_base.h"
@@ -73,7 +74,8 @@
// check for overuse.
class OveruseFrameDetector {
public:
- explicit OveruseFrameDetector(CpuOveruseMetricsObserver* metrics_observer);
+ OveruseFrameDetector(const Environment& env,
+ CpuOveruseMetricsObserver* metrics_observer);
virtual ~OveruseFrameDetector();
OveruseFrameDetector(const OveruseFrameDetector&) = delete;
@@ -144,8 +146,10 @@
void ResetAll(int num_pixels);
static std::unique_ptr<ProcessingUsage> CreateProcessingUsage(
+ const FieldTrialsView& field_trials,
const CpuOveruseOptions& options);
+ const Environment env_;
RTC_NO_UNIQUE_ADDRESS SequenceChecker task_checker_;
// Owned by the task queue from where StartCheckForOveruse is called.
RepeatingTaskHandle check_overuse_task_ RTC_GUARDED_BY(task_checker_);
diff --git a/video/adaptation/overuse_frame_detector_unittest.cc b/video/adaptation/overuse_frame_detector_unittest.cc
index 7ae9735..3c6ce57 100644
--- a/video/adaptation/overuse_frame_detector_unittest.cc
+++ b/video/adaptation/overuse_frame_detector_unittest.cc
@@ -12,6 +12,8 @@
#include <memory>
+#include "api/environment/environment.h"
+#include "api/environment/environment_factory.h"
#include "api/video/encoded_image.h"
#include "api/video/i420_buffer.h"
#include "api/video/video_adaptation_reason.h"
@@ -22,7 +24,6 @@
#include "rtc_base/task_queue_for_test.h"
#include "test/gmock.h"
#include "test/gtest.h"
-#include "test/scoped_key_value_config.h"
namespace webrtc {
@@ -61,8 +62,9 @@
class OveruseFrameDetectorUnderTest : public OveruseFrameDetector {
public:
explicit OveruseFrameDetectorUnderTest(
+ const Environment& env,
CpuOveruseMetricsObserver* metrics_observer)
- : OveruseFrameDetector(metrics_observer) {}
+ : OveruseFrameDetector(env, metrics_observer) {}
~OveruseFrameDetectorUnderTest() {}
using OveruseFrameDetector::CheckForOveruse;
@@ -75,7 +77,8 @@
void SetUp() override {
observer_ = &mock_observer_;
options_.min_process_count = 0;
- overuse_detector_ = std::make_unique<OveruseFrameDetectorUnderTest>(this);
+ overuse_detector_ = std::make_unique<OveruseFrameDetectorUnderTest>(
+ CreateEnvironment(), this);
// Unfortunately, we can't call SetOptions here, since that would break
// single-threading requirements in the RunOnTqNormalUsage test.
}
diff --git a/video/video_send_stream_impl.cc b/video/video_send_stream_impl.cc
index 6f146e3..52e437a 100644
--- a/video/video_send_stream_impl.cc
+++ b/video/video_send_stream_impl.cc
@@ -355,7 +355,7 @@
TaskQueueBase* encoder_queue_ptr = encoder_queue.get();
return std::make_unique<VideoStreamEncoder>(
env, num_cpu_cores, stats_proxy, encoder_settings,
- std::make_unique<OveruseFrameDetector>(stats_proxy),
+ std::make_unique<OveruseFrameDetector>(env, stats_proxy),
FrameCadenceAdapterInterface::Create(
&env.clock(), encoder_queue_ptr, metronome,
/*worker_queue=*/TaskQueueBase::Current(), env.field_trials()),
diff --git a/video/video_stream_encoder_unittest.cc b/video/video_stream_encoder_unittest.cc
index 6769a28..31c6ca5 100644
--- a/video/video_stream_encoder_unittest.cc
+++ b/video/video_stream_encoder_unittest.cc
@@ -227,8 +227,9 @@
class CpuOveruseDetectorProxy : public OveruseFrameDetector {
public:
- explicit CpuOveruseDetectorProxy(CpuOveruseMetricsObserver* metrics_observer)
- : OveruseFrameDetector(metrics_observer),
+ CpuOveruseDetectorProxy(const Environment& env,
+ CpuOveruseMetricsObserver* metrics_observer)
+ : OveruseFrameDetector(env, metrics_observer),
last_target_framerate_fps_(-1),
framerate_updated_event_(true /* manual_reset */,
false /* initially_signaled */) {}
@@ -389,6 +390,7 @@
class VideoStreamEncoderUnderTest : public VideoStreamEncoder {
public:
VideoStreamEncoderUnderTest(
+ const Environment& env,
TimeController* time_controller,
std::unique_ptr<FrameCadenceAdapterInterface> cadence_adapter,
std::unique_ptr<webrtc::TaskQueueBase, webrtc::TaskQueueDeleter>
@@ -397,16 +399,15 @@
const VideoStreamEncoderSettings& settings,
VideoStreamEncoder::BitrateAllocationCallbackType
allocation_callback_type,
- const FieldTrialsView& field_trials,
int num_cores)
: VideoStreamEncoder(
- CreateEnvironment(&field_trials, time_controller->GetClock()),
+ env,
num_cores,
stats_proxy,
settings,
std::unique_ptr<OveruseFrameDetector>(
overuse_detector_proxy_ =
- new CpuOveruseDetectorProxy(stats_proxy)),
+ new CpuOveruseDetectorProxy(env, stats_proxy)),
std::move(cadence_adapter),
std::move(encoder_queue),
allocation_callback_type),
@@ -710,13 +711,14 @@
std::unique_ptr<FrameCadenceAdapterInterface> zero_hertz_adapter,
std::unique_ptr<TaskQueueBase, TaskQueueDeleter> encoder_queue,
const FieldTrialsView* field_trials = nullptr) {
+ Environment env = CreateEnvironment(&field_trials_, field_trials,
+ time_controller_.GetClock());
auto result = std::make_unique<AdaptedVideoStreamEncoder>(
- CreateEnvironment(&field_trials_, field_trials,
- time_controller_.GetClock()),
+ env,
/*number_of_cores=*/1,
/*stats_proxy=*/stats_proxy_.get(), encoder_settings_,
- std::make_unique<CpuOveruseDetectorProxy>(
- /*stats_proxy=*/nullptr),
+ std::make_unique<CpuOveruseDetectorProxy>(env,
+ /*stats_proxy=*/nullptr),
std::move(zero_hertz_adapter), std::move(encoder_queue),
VideoStreamEncoder::BitrateAllocationCallbackType::
kVideoBitrateAllocation);
@@ -886,7 +888,7 @@
if (video_stream_encoder_)
video_stream_encoder_->Stop();
- auto encoder_queue = GetTaskQueueFactory()->CreateTaskQueue(
+ auto encoder_queue = env_.task_queue_factory().CreateTaskQueue(
"EncoderQueue", TaskQueueFactory::Priority::NORMAL);
TaskQueueBase* encoder_queue_ptr = encoder_queue.get();
std::unique_ptr<FrameCadenceAdapterInterface> cadence_adapter =
@@ -894,9 +896,10 @@
time_controller_.GetClock(), encoder_queue_ptr,
/*metronome=*/nullptr, /*worker_queue=*/nullptr, 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,
- allocation_callback_type, field_trials_, num_cores);
+ env_, &time_controller_, std::move(cadence_adapter),
+ std::move(encoder_queue), stats_proxy_.get(),
+ video_send_config_.encoder_settings, allocation_callback_type,
+ num_cores);
video_stream_encoder_->SetSink(&sink_, /*rotation_applied=*/false);
video_stream_encoder_->SetSource(
&video_source_, webrtc::DegradationPreference::MAINTAIN_FRAMERATE);
@@ -1627,12 +1630,12 @@
int64_t CurrentTimeMs() { return clock()->CurrentTime().ms(); }
protected:
- virtual TaskQueueFactory* GetTaskQueueFactory() {
- return time_controller_.GetTaskQueueFactory();
- }
-
test::ScopedKeyValueConfig field_trials_;
GlobalSimulatedTimeController time_controller_{Timestamp::Micros(1234)};
+ const Environment env_ =
+ CreateEnvironment(&field_trials_,
+ time_controller_.GetClock(),
+ time_controller_.GetTaskQueueFactory());
VideoSendStream::Config video_send_config_;
VideoEncoderConfig video_encoder_config_;
int codec_width_;
@@ -9428,7 +9431,7 @@
// simply be deleted.
VideoStreamEncoder encoder(
env, 1, &stats_proxy, encoder_settings,
- std::make_unique<CpuOveruseDetectorProxy>(&stats_proxy),
+ std::make_unique<CpuOveruseDetectorProxy>(env, &stats_proxy),
std::move(adapter), std::move(encoder_queue),
VideoStreamEncoder::BitrateAllocationCallbackType::
kVideoBitrateAllocation);