aboutsummaryrefslogtreecommitdiff
path: root/video/adaptation/video_stream_encoder_resource.h
diff options
context:
space:
mode:
Diffstat (limited to 'video/adaptation/video_stream_encoder_resource.h')
-rw-r--r--video/adaptation/video_stream_encoder_resource.h81
1 files changed, 81 insertions, 0 deletions
diff --git a/video/adaptation/video_stream_encoder_resource.h b/video/adaptation/video_stream_encoder_resource.h
new file mode 100644
index 0000000000..08994c135d
--- /dev/null
+++ b/video/adaptation/video_stream_encoder_resource.h
@@ -0,0 +1,81 @@
+/*
+ * 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 <string>
+#include <vector>
+
+#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 <typename Closure>
+ 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_