1 /*
2  *  Copyright 2020 The WebRTC Project Authors. All rights reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #include "video/adaptation/video_stream_encoder_resource.h"
12 
13 #include <algorithm>
14 #include <utility>
15 
16 namespace webrtc {
17 
VideoStreamEncoderResource(std::string name)18 VideoStreamEncoderResource::VideoStreamEncoderResource(std::string name)
19     : lock_(),
20       name_(std::move(name)),
21       encoder_queue_(nullptr),
22       resource_adaptation_queue_(nullptr),
23       listener_(nullptr) {}
24 
~VideoStreamEncoderResource()25 VideoStreamEncoderResource::~VideoStreamEncoderResource() {
26   RTC_DCHECK(!listener_)
27       << "There is a listener depending on a VideoStreamEncoderResource being "
28       << "destroyed.";
29 }
30 
RegisterEncoderTaskQueue(TaskQueueBase * encoder_queue)31 void VideoStreamEncoderResource::RegisterEncoderTaskQueue(
32     TaskQueueBase* encoder_queue) {
33   RTC_DCHECK(!encoder_queue_);
34   RTC_DCHECK(encoder_queue);
35   encoder_queue_ = encoder_queue;
36 }
37 
RegisterAdaptationTaskQueue(TaskQueueBase * resource_adaptation_queue)38 void VideoStreamEncoderResource::RegisterAdaptationTaskQueue(
39     TaskQueueBase* resource_adaptation_queue) {
40   MutexLock lock(&lock_);
41   RTC_DCHECK(!resource_adaptation_queue_);
42   RTC_DCHECK(resource_adaptation_queue);
43   resource_adaptation_queue_ = resource_adaptation_queue;
44 }
45 
UnregisterAdaptationTaskQueue()46 void VideoStreamEncoderResource::UnregisterAdaptationTaskQueue() {
47   MutexLock lock(&lock_);
48   RTC_DCHECK(resource_adaptation_queue_);
49   RTC_DCHECK_RUN_ON(resource_adaptation_queue_);
50   resource_adaptation_queue_ = nullptr;
51 }
52 
SetResourceListener(ResourceListener * listener)53 void VideoStreamEncoderResource::SetResourceListener(
54     ResourceListener* listener) {
55   // If you want to change listener you need to unregister the old listener by
56   // setting it to null first.
57   MutexLock crit(&listener_lock_);
58   RTC_DCHECK(!listener_ || !listener) << "A listener is already set";
59   listener_ = listener;
60 }
61 
Name() const62 std::string VideoStreamEncoderResource::Name() const {
63   return name_;
64 }
65 
OnResourceUsageStateMeasured(ResourceUsageState usage_state)66 void VideoStreamEncoderResource::OnResourceUsageStateMeasured(
67     ResourceUsageState usage_state) {
68   MutexLock crit(&listener_lock_);
69   if (listener_) {
70     listener_->OnResourceUsageStateMeasured(this, usage_state);
71   }
72 }
73 
encoder_queue() const74 TaskQueueBase* VideoStreamEncoderResource::encoder_queue() const {
75   return encoder_queue_;
76 }
77 
resource_adaptation_queue() const78 TaskQueueBase* VideoStreamEncoderResource::resource_adaptation_queue() const {
79   MutexLock lock(&lock_);
80   RTC_DCHECK(resource_adaptation_queue_);
81   RTC_DCHECK_RUN_ON(resource_adaptation_queue_);
82   return resource_adaptation_queue_;
83 }
84 
85 }  // namespace webrtc
86