blob: 7d83c4db75150ed8633bcbb95cec09e24f35eedf [file] [log] [blame]
Henrik Boströmb04b2a12019-12-10 14:14:09 +01001/*
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 Shrubsoleaa6fbc12020-02-25 16:26:01 +010013#include "absl/algorithm/container.h"
Henrik Boström48258ac2020-02-06 12:49:57 +010014#include "rtc_base/checks.h"
Henrik Boströmb04b2a12019-12-10 14:14:09 +010015
16namespace webrtc {
17
Henrik Boströmf0eef122020-05-28 16:22:42 +020018const 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öm48258ac2020-02-06 12:49:57 +010027ResourceListener::~ResourceListener() {}
Henrik Boströmb04b2a12019-12-10 14:14:09 +010028
Henrik Boström381d1092020-05-12 18:49:07 +020029Resource::Resource()
30 : encoder_queue_(nullptr),
31 resource_adaptation_queue_(nullptr),
32 usage_state_(absl::nullopt),
33 listener_(nullptr) {}
Henrik Boströmb04b2a12019-12-10 14:14:09 +010034
Henrik Boströmc55516d2020-05-11 16:29:22 +020035Resource::~Resource() {
36 RTC_DCHECK(!listener_)
37 << "There is a listener depending on a Resource being destroyed.";
38}
Henrik Boströmdc4f75f2020-04-20 12:04:12 +020039
Henrik Boström381d1092020-05-12 18:49:07 +020040void 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ömdc4f75f2020-04-20 12:04:12 +020050void Resource::SetResourceListener(ResourceListener* listener) {
Henrik Boström381d1092020-05-12 18:49:07 +020051 RTC_DCHECK(resource_adaptation_queue_);
52 RTC_DCHECK_RUN_ON(resource_adaptation_queue_);
Henrik Boströmdc4f75f2020-04-20 12:04:12 +020053 // 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 Shrubsoleaa6fbc12020-02-25 16:26:01 +010057}
Henrik Boströmb04b2a12019-12-10 14:14:09 +010058
Henrik Boströmdc4f75f2020-04-20 12:04:12 +020059absl::optional<ResourceUsageState> Resource::usage_state() const {
Henrik Boström381d1092020-05-12 18:49:07 +020060 RTC_DCHECK(resource_adaptation_queue_);
61 RTC_DCHECK_RUN_ON(resource_adaptation_queue_);
Henrik Boström48258ac2020-02-06 12:49:57 +010062 return usage_state_;
63}
64
Henrik Boströmdc4f75f2020-04-20 12:04:12 +020065void Resource::ClearUsageState() {
Henrik Boström381d1092020-05-12 18:49:07 +020066 RTC_DCHECK(resource_adaptation_queue_);
67 RTC_DCHECK_RUN_ON(resource_adaptation_queue_);
Henrik Boströmdc4f75f2020-04-20 12:04:12 +020068 usage_state_ = absl::nullopt;
69}
70
Henrik Boströmb613e3a2020-04-17 13:48:21 +020071bool Resource::IsAdaptationUpAllowed(
72 const VideoStreamInputState& input_state,
73 const VideoSourceRestrictions& restrictions_before,
74 const VideoSourceRestrictions& restrictions_after,
Henrik Boströmc55516d2020-05-11 16:29:22 +020075 rtc::scoped_refptr<Resource> reason_resource) const {
Henrik Boströmb613e3a2020-04-17 13:48:21 +020076 return true;
77}
78
Henrik Boström91aa7322020-04-28 12:24:33 +020079void Resource::OnAdaptationApplied(
80 const VideoStreamInputState& input_state,
81 const VideoSourceRestrictions& restrictions_before,
82 const VideoSourceRestrictions& restrictions_after,
Henrik Boströmc55516d2020-05-11 16:29:22 +020083 rtc::scoped_refptr<Resource> reason_resource) {}
Henrik Boström91aa7322020-04-28 12:24:33 +020084
Henrik Boström381d1092020-05-12 18:49:07 +020085rtc::TaskQueue* Resource::encoder_queue() const {
86 return encoder_queue_;
87}
88
89rtc::TaskQueue* Resource::resource_adaptation_queue() const {
90 return resource_adaptation_queue_;
91}
92
Henrik Boström91aa7322020-04-28 12:24:33 +020093void Resource::OnResourceUsageStateMeasured(ResourceUsageState usage_state) {
Henrik Boström381d1092020-05-12 18:49:07 +020094 RTC_DCHECK(resource_adaptation_queue_);
95 RTC_DCHECK_RUN_ON(resource_adaptation_queue_);
Henrik Boström48258ac2020-02-06 12:49:57 +010096 usage_state_ = usage_state;
Henrik Boströmdc4f75f2020-04-20 12:04:12 +020097 if (!listener_)
Henrik Boström91aa7322020-04-28 12:24:33 +020098 return;
Henrik Boströmc55516d2020-05-11 16:29:22 +020099 listener_->OnResourceUsageStateMeasured(this);
Henrik Boströmb04b2a12019-12-10 14:14:09 +0100100}
101
102} // namespace webrtc