/* * Copyright 2023 The WebRTC Project Authors. All rights reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ // This header file provides wrapper for common WebRTC utilities. // Different application may need different implementations of these utilities, // Moreover, single application may need to use WebRTC for multiple purposes, // and thus would need to provide different utilities implementations for // different peer connections. // The main purpose of the `Environment` class below is to propagate references // to those utilities to all WebRTC classes that need them. #ifndef API_ENVIRONMENT_ENVIRONMENT_H_ #define API_ENVIRONMENT_ENVIRONMENT_H_ #include #include "absl/base/nullability.h" #include "api/ref_counted_base.h" #include "api/scoped_refptr.h" #include "rtc_base/system/rtc_export.h" namespace webrtc { // These classes are forward declared to keep Environment dependencies // lightweight. Users who need any of the types below should include their // header explicitely. class Clock; class TaskQueueFactory; class FieldTrialsView; class RtcEventLog; // Contains references to WebRTC utilities. Object of this class should be // passed as a construction parameter and saved by value in each class that // needs it. Most classes shouldn't create a new instance of the `Environment`, // but instead should use a propagated copy. // Usually Environment should be the first parameter in a constructor or a // factory, and the first member in the class. Keeping Environment as the first // member in the class ensures utilities (e.g. clock) are still valid during // destruction of other members. // // Example: // class PeerConnection { // public: // PeerConnection(const Environment& env, ...) // : env_(env), // log_duration_on_destruction_(&env_.clock()), // rtp_manager_(env_, ...), // ... // // const FieldTrialsView& trials() const { return env_.field_trials(); } // // scoped_refptr AddTransceiver(...) { // return make_ref_counted(env_, ...); // } // // private: // const Environment env_; // Stats log_duration_on_destruction_; // RtpTransmissionManager rtp_manager_; // }; // This class is thread safe. class RTC_EXPORT Environment final { public: // Default constructor is deleted in favor of creating this object using // `EnvironmentFactory`. To create the default environment use // `EnvironmentFactory().Create()` or `CreateEnvironment()`. Environment() = delete; Environment(const Environment&) = default; Environment(Environment&&) = default; Environment& operator=(const Environment&) = default; Environment& operator=(Environment&&) = default; ~Environment() = default; // Provides means to alter behavior, mostly for A/B testing new features. // See ../../g3doc/field-trials.md const FieldTrialsView& field_trials() const; // Provides an interface to query current time. // See ../../g3doc/implementation_basics.md#time Clock& clock() const; // Provides a factory for task queues, WebRTC threading primitives. // See ../../g3doc/implementation_basics.md#threads TaskQueueFactory& task_queue_factory() const; // Provides an interface for collecting structured logs. // See ../../logging/g3doc/rtc_event_log.md RtcEventLog& event_log() const; private: friend class EnvironmentFactory; Environment(scoped_refptr storage, absl::Nonnull field_trials, absl::Nonnull clock, absl::Nonnull task_queue_factory, absl::Nonnull event_log) : storage_(std::move(storage)), field_trials_(field_trials), clock_(clock), task_queue_factory_(task_queue_factory), event_log_(event_log) {} // Container that keeps ownership of the utilities below. // Defining this as a RefCountedBase allows `Environment` to share this // storage with another `Environment`, in particular allows `Environment` to // be copyable. It is up to the `EnvironmentFactory` to provide an object that // ensures references to utilties below are valid while object in the // `storage_` is alive. scoped_refptr storage_; absl::Nonnull field_trials_; absl::Nonnull clock_; absl::Nonnull task_queue_factory_; absl::Nonnull event_log_; }; //------------------------------------------------------------------------------ // Implementation details follow //------------------------------------------------------------------------------ inline const FieldTrialsView& Environment::field_trials() const { return *field_trials_; } inline Clock& Environment::clock() const { return *clock_; } inline TaskQueueFactory& Environment::task_queue_factory() const { return *task_queue_factory_; } inline RtcEventLog& Environment::event_log() const { return *event_log_; } } // namespace webrtc #endif // API_ENVIRONMENT_ENVIRONMENT_H_