Henrik Boström | b04b2a1 | 2019-12-10 14:14:09 +0100 | [diff] [blame] | 1 | /* |
| 2 | * Copyright 2019 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 "call/adaptation/resource.h" |
| 12 | |
Evan Shrubsole | aa6fbc1 | 2020-02-25 16:26:01 +0100 | [diff] [blame] | 13 | #include "absl/algorithm/container.h" |
Henrik Boström | 48258ac | 2020-02-06 12:49:57 +0100 | [diff] [blame] | 14 | #include "rtc_base/checks.h" |
Henrik Boström | b04b2a1 | 2019-12-10 14:14:09 +0100 | [diff] [blame] | 15 | |
| 16 | namespace webrtc { |
| 17 | |
Henrik Boström | f0eef12 | 2020-05-28 16:22:42 +0200 | [diff] [blame^] | 18 | const char* ResourceUsageStateToString(ResourceUsageState usage_state) { |
| 19 | switch (usage_state) { |
| 20 | case ResourceUsageState::kOveruse: |
| 21 | return "kOveruse"; |
| 22 | case ResourceUsageState::kUnderuse: |
| 23 | return "kUnderuse"; |
| 24 | } |
| 25 | } |
| 26 | |
Henrik Boström | 48258ac | 2020-02-06 12:49:57 +0100 | [diff] [blame] | 27 | ResourceListener::~ResourceListener() {} |
Henrik Boström | b04b2a1 | 2019-12-10 14:14:09 +0100 | [diff] [blame] | 28 | |
Henrik Boström | 381d109 | 2020-05-12 18:49:07 +0200 | [diff] [blame] | 29 | Resource::Resource() |
| 30 | : encoder_queue_(nullptr), |
| 31 | resource_adaptation_queue_(nullptr), |
| 32 | usage_state_(absl::nullopt), |
| 33 | listener_(nullptr) {} |
Henrik Boström | b04b2a1 | 2019-12-10 14:14:09 +0100 | [diff] [blame] | 34 | |
Henrik Boström | c55516d | 2020-05-11 16:29:22 +0200 | [diff] [blame] | 35 | Resource::~Resource() { |
| 36 | RTC_DCHECK(!listener_) |
| 37 | << "There is a listener depending on a Resource being destroyed."; |
| 38 | } |
Henrik Boström | dc4f75f | 2020-04-20 12:04:12 +0200 | [diff] [blame] | 39 | |
Henrik Boström | 381d109 | 2020-05-12 18:49:07 +0200 | [diff] [blame] | 40 | void Resource::Initialize(rtc::TaskQueue* encoder_queue, |
| 41 | rtc::TaskQueue* resource_adaptation_queue) { |
| 42 | RTC_DCHECK(!encoder_queue_); |
| 43 | RTC_DCHECK(encoder_queue); |
| 44 | RTC_DCHECK(!resource_adaptation_queue_); |
| 45 | RTC_DCHECK(resource_adaptation_queue); |
| 46 | encoder_queue_ = encoder_queue; |
| 47 | resource_adaptation_queue_ = resource_adaptation_queue; |
| 48 | } |
| 49 | |
Henrik Boström | dc4f75f | 2020-04-20 12:04:12 +0200 | [diff] [blame] | 50 | void Resource::SetResourceListener(ResourceListener* listener) { |
Henrik Boström | 381d109 | 2020-05-12 18:49:07 +0200 | [diff] [blame] | 51 | RTC_DCHECK(resource_adaptation_queue_); |
| 52 | RTC_DCHECK_RUN_ON(resource_adaptation_queue_); |
Henrik Boström | dc4f75f | 2020-04-20 12:04:12 +0200 | [diff] [blame] | 53 | // If you want to change listener you need to unregister the old listener by |
| 54 | // setting it to null first. |
| 55 | RTC_DCHECK(!listener_ || !listener) << "A listener is already set"; |
| 56 | listener_ = listener; |
Evan Shrubsole | aa6fbc1 | 2020-02-25 16:26:01 +0100 | [diff] [blame] | 57 | } |
Henrik Boström | b04b2a1 | 2019-12-10 14:14:09 +0100 | [diff] [blame] | 58 | |
Henrik Boström | dc4f75f | 2020-04-20 12:04:12 +0200 | [diff] [blame] | 59 | absl::optional<ResourceUsageState> Resource::usage_state() const { |
Henrik Boström | 381d109 | 2020-05-12 18:49:07 +0200 | [diff] [blame] | 60 | RTC_DCHECK(resource_adaptation_queue_); |
| 61 | RTC_DCHECK_RUN_ON(resource_adaptation_queue_); |
Henrik Boström | 48258ac | 2020-02-06 12:49:57 +0100 | [diff] [blame] | 62 | return usage_state_; |
| 63 | } |
| 64 | |
Henrik Boström | dc4f75f | 2020-04-20 12:04:12 +0200 | [diff] [blame] | 65 | void Resource::ClearUsageState() { |
Henrik Boström | 381d109 | 2020-05-12 18:49:07 +0200 | [diff] [blame] | 66 | RTC_DCHECK(resource_adaptation_queue_); |
| 67 | RTC_DCHECK_RUN_ON(resource_adaptation_queue_); |
Henrik Boström | dc4f75f | 2020-04-20 12:04:12 +0200 | [diff] [blame] | 68 | usage_state_ = absl::nullopt; |
| 69 | } |
| 70 | |
Henrik Boström | b613e3a | 2020-04-17 13:48:21 +0200 | [diff] [blame] | 71 | bool Resource::IsAdaptationUpAllowed( |
| 72 | const VideoStreamInputState& input_state, |
| 73 | const VideoSourceRestrictions& restrictions_before, |
| 74 | const VideoSourceRestrictions& restrictions_after, |
Henrik Boström | c55516d | 2020-05-11 16:29:22 +0200 | [diff] [blame] | 75 | rtc::scoped_refptr<Resource> reason_resource) const { |
Henrik Boström | b613e3a | 2020-04-17 13:48:21 +0200 | [diff] [blame] | 76 | return true; |
| 77 | } |
| 78 | |
Henrik Boström | 91aa732 | 2020-04-28 12:24:33 +0200 | [diff] [blame] | 79 | void Resource::OnAdaptationApplied( |
| 80 | const VideoStreamInputState& input_state, |
| 81 | const VideoSourceRestrictions& restrictions_before, |
| 82 | const VideoSourceRestrictions& restrictions_after, |
Henrik Boström | c55516d | 2020-05-11 16:29:22 +0200 | [diff] [blame] | 83 | rtc::scoped_refptr<Resource> reason_resource) {} |
Henrik Boström | 91aa732 | 2020-04-28 12:24:33 +0200 | [diff] [blame] | 84 | |
Henrik Boström | 381d109 | 2020-05-12 18:49:07 +0200 | [diff] [blame] | 85 | rtc::TaskQueue* Resource::encoder_queue() const { |
| 86 | return encoder_queue_; |
| 87 | } |
| 88 | |
| 89 | rtc::TaskQueue* Resource::resource_adaptation_queue() const { |
| 90 | return resource_adaptation_queue_; |
| 91 | } |
| 92 | |
Henrik Boström | 91aa732 | 2020-04-28 12:24:33 +0200 | [diff] [blame] | 93 | void Resource::OnResourceUsageStateMeasured(ResourceUsageState usage_state) { |
Henrik Boström | 381d109 | 2020-05-12 18:49:07 +0200 | [diff] [blame] | 94 | RTC_DCHECK(resource_adaptation_queue_); |
| 95 | RTC_DCHECK_RUN_ON(resource_adaptation_queue_); |
Henrik Boström | 48258ac | 2020-02-06 12:49:57 +0100 | [diff] [blame] | 96 | usage_state_ = usage_state; |
Henrik Boström | dc4f75f | 2020-04-20 12:04:12 +0200 | [diff] [blame] | 97 | if (!listener_) |
Henrik Boström | 91aa732 | 2020-04-28 12:24:33 +0200 | [diff] [blame] | 98 | return; |
Henrik Boström | c55516d | 2020-05-11 16:29:22 +0200 | [diff] [blame] | 99 | listener_->OnResourceUsageStateMeasured(this); |
Henrik Boström | b04b2a1 | 2019-12-10 14:14:09 +0100 | [diff] [blame] | 100 | } |
| 101 | |
| 102 | } // namespace webrtc |