/* * Copyright 2020 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. */ #ifndef VIDEO_ADAPTATION_VIDEO_STREAM_ENCODER_RESOURCE_H_ #define VIDEO_ADAPTATION_VIDEO_STREAM_ENCODER_RESOURCE_H_ #include #include #include "absl/types/optional.h" #include "api/adaptation/resource.h" #include "api/task_queue/task_queue_base.h" #include "call/adaptation/adaptation_constraint.h" #include "call/adaptation/adaptation_listener.h" #include "rtc_base/synchronization/mutex.h" #include "rtc_base/synchronization/sequence_checker.h" namespace webrtc { class VideoStreamEncoderResource : public Resource { public: ~VideoStreamEncoderResource() override; // Registering task queues must be performed as part of initialization. void RegisterEncoderTaskQueue(TaskQueueBase* encoder_queue); // Resource implementation. std::string Name() const override; void SetResourceListener(ResourceListener* listener) override; // Provides a pointer to the adaptation task queue. After this call, all // methods defined in this interface, including // UnregisterAdaptationTaskQueue() MUST be invoked on the adaptation task // queue. Registering the adaptation task queue may, however, happen off the // adaptation task queue. void RegisterAdaptationTaskQueue(TaskQueueBase* resource_adaptation_queue); // Signals that the adaptation task queue is no longer safe to use. No // assumptions must be made as to whether or not tasks in-flight will run. void UnregisterAdaptationTaskQueue(); protected: explicit VideoStreamEncoderResource(std::string name); void OnResourceUsageStateMeasured(ResourceUsageState usage_state); // The caller is responsible for ensuring the task queue is still valid. TaskQueueBase* encoder_queue() const; // Validity of returned pointer is ensured by only allowing this method to be // called on the adaptation task queue. Designed for use with RTC_GUARDED_BY. // For posting from a different queue, use // MaybePostTaskToResourceAdaptationQueue() instead, which only posts if the // task queue is currently registered. TaskQueueBase* resource_adaptation_queue() const; template void MaybePostTaskToResourceAdaptationQueue(Closure&& closure) { MutexLock lock(&lock_); if (!resource_adaptation_queue_) return; resource_adaptation_queue_->PostTask(ToQueuedTask(closure)); } private: mutable Mutex lock_; const std::string name_; // Treated as const after initialization. TaskQueueBase* encoder_queue_; TaskQueueBase* resource_adaptation_queue_ RTC_GUARDED_BY(lock_); mutable Mutex listener_lock_; ResourceListener* listener_ RTC_GUARDED_BY(listener_lock_); }; } // namespace webrtc #endif // VIDEO_ADAPTATION_VIDEO_STREAM_ENCODER_RESOURCE_H_