blob: 08994c135d43db0b70f22d62756e90ca4850e257 [file] [log] [blame]
/*
* 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_