blob: 935746d1da86aefd0d63453bc3ad581b52adfbf1 [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#ifndef CALL_ADAPTATION_RESOURCE_H_
12#define CALL_ADAPTATION_RESOURCE_H_
13
Evan Shrubsoleaa6fbc12020-02-25 16:26:01 +010014#include <string>
Henrik Boström48258ac2020-02-06 12:49:57 +010015#include <vector>
16
17#include "absl/types/optional.h"
Henrik Boströmb04b2a12019-12-10 14:14:09 +010018
19namespace webrtc {
20
Henrik Boström48258ac2020-02-06 12:49:57 +010021class Resource;
22
Henrik Boströmb04b2a12019-12-10 14:14:09 +010023enum class ResourceUsageState {
24 // Action is needed to minimze the load on this resource.
25 kOveruse,
26 // No action needed for this resource, increasing the load on this resource
27 // is not allowed.
28 kStable,
29 // Increasing the load on this resource is allowed.
30 kUnderuse,
31};
32
Henrik Boström48258ac2020-02-06 12:49:57 +010033enum class ResourceListenerResponse {
34 kNothing,
35 // This response is only applicable to QualityScaler-based resources.
36 // It tells the QualityScaler to increase its QP measurement frequency.
37 //
38 // This is modelled after AdaptationObserverInterface::AdaptDown()'s return
39 // value. The method comment says "Returns false if a downgrade was requested
40 // but the request did not result in a new limiting resolution or fps."
41 // However the actual implementation seems to be: Return false if
42 // !has_input_video_ or if we use balanced degradation preference and we DID
43 // adapt frame rate but the difference between input frame rate and balanced
44 // settings' min fps is less than the balanced settings' min fps diff - in all
45 // other cases, return true whether or not adaptation happened.
46 //
47 // For QualityScaler-based resources, kQualityScalerShouldIncreaseFrequency
48 // maps to "return false" and kNothing maps to "return true".
49 //
50 // TODO(https://crbug.com/webrtc/11222): Remove this enum. Resource
51 // measurements and adaptation decisions need to be separated in order to
52 // support injectable adaptation modules, multi-stream aware adaptation and
53 // decision-making logic based on multiple resources.
54 kQualityScalerShouldIncreaseFrequency,
55};
56
57class ResourceListener {
58 public:
59 virtual ~ResourceListener();
60
61 // Informs the listener of a new measurement of resource usage. This means
62 // that |resource.usage_state()| is now up-to-date.
63 //
64 // The listener may influence the resource that signaled the measurement
65 // according to the returned ResourceListenerResponse enum.
66 virtual ResourceListenerResponse OnResourceUsageStateMeasured(
67 const Resource& resource) = 0;
68};
69
Henrik Boströmb04b2a12019-12-10 14:14:09 +010070// A Resource is something which can be measured as "overused", "stable" or
Henrik Boström48258ac2020-02-06 12:49:57 +010071// "underused". When the resource usage changes, listeners of the resource are
72// informed.
Henrik Boströmb04b2a12019-12-10 14:14:09 +010073//
Henrik Boström48258ac2020-02-06 12:49:57 +010074// Implementations of this interface are responsible for performing resource
75// usage measurements and invoking OnResourceUsageStateMeasured().
Henrik Boströmb04b2a12019-12-10 14:14:09 +010076class Resource {
77 public:
Henrik Boström48258ac2020-02-06 12:49:57 +010078 // By default, usage_state() is kStable until a measurement is made.
79 Resource();
Henrik Boströmb04b2a12019-12-10 14:14:09 +010080 virtual ~Resource();
81
Henrik Boström48258ac2020-02-06 12:49:57 +010082 void RegisterListener(ResourceListener* listener);
Evan Shrubsoleaa6fbc12020-02-25 16:26:01 +010083 void UnregisterListener(ResourceListener* listener);
Henrik Boströmb04b2a12019-12-10 14:14:09 +010084
Henrik Boström48258ac2020-02-06 12:49:57 +010085 ResourceUsageState usage_state() const;
Henrik Boströmb04b2a12019-12-10 14:14:09 +010086
Evan Shrubsoleaa6fbc12020-02-25 16:26:01 +010087 virtual std::string name() const = 0;
88
Henrik Boström48258ac2020-02-06 12:49:57 +010089 protected:
90 // Updates the usage state and informs all registered listeners.
91 // Returns the result of the last listener's OnResourceUsageStateMeasured()
92 // call that was not kNothing, else kNothing.
93 ResourceListenerResponse OnResourceUsageStateMeasured(
94 ResourceUsageState usage_state);
95
96 private:
97 ResourceUsageState usage_state_;
98 std::vector<ResourceListener*> listeners_;
Henrik Boströmb04b2a12019-12-10 14:14:09 +010099};
100
101} // namespace webrtc
102
103#endif // CALL_ADAPTATION_RESOURCE_H_