xref: /aosp_15_r20/external/webrtc/call/adaptation/video_stream_adapter.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker  *  Copyright 2020 The WebRTC Project Authors. All rights reserved.
3*d9f75844SAndroid Build Coastguard Worker  *
4*d9f75844SAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker  */
10*d9f75844SAndroid Build Coastguard Worker 
11*d9f75844SAndroid Build Coastguard Worker #ifndef CALL_ADAPTATION_VIDEO_STREAM_ADAPTER_H_
12*d9f75844SAndroid Build Coastguard Worker #define CALL_ADAPTATION_VIDEO_STREAM_ADAPTER_H_
13*d9f75844SAndroid Build Coastguard Worker 
14*d9f75844SAndroid Build Coastguard Worker #include <memory>
15*d9f75844SAndroid Build Coastguard Worker #include <utility>
16*d9f75844SAndroid Build Coastguard Worker #include <vector>
17*d9f75844SAndroid Build Coastguard Worker 
18*d9f75844SAndroid Build Coastguard Worker #include "absl/types/optional.h"
19*d9f75844SAndroid Build Coastguard Worker #include "absl/types/variant.h"
20*d9f75844SAndroid Build Coastguard Worker #include "api/adaptation/resource.h"
21*d9f75844SAndroid Build Coastguard Worker #include "api/field_trials_view.h"
22*d9f75844SAndroid Build Coastguard Worker #include "api/rtp_parameters.h"
23*d9f75844SAndroid Build Coastguard Worker #include "api/video/video_adaptation_counters.h"
24*d9f75844SAndroid Build Coastguard Worker #include "call/adaptation/adaptation_constraint.h"
25*d9f75844SAndroid Build Coastguard Worker #include "call/adaptation/degradation_preference_provider.h"
26*d9f75844SAndroid Build Coastguard Worker #include "call/adaptation/video_source_restrictions.h"
27*d9f75844SAndroid Build Coastguard Worker #include "call/adaptation/video_stream_input_state.h"
28*d9f75844SAndroid Build Coastguard Worker #include "call/adaptation/video_stream_input_state_provider.h"
29*d9f75844SAndroid Build Coastguard Worker #include "modules/video_coding/utility/quality_scaler.h"
30*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/experiments/balanced_degradation_settings.h"
31*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/system/no_unique_address.h"
32*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/thread_annotations.h"
33*d9f75844SAndroid Build Coastguard Worker #include "video/video_stream_encoder_observer.h"
34*d9f75844SAndroid Build Coastguard Worker 
35*d9f75844SAndroid Build Coastguard Worker namespace webrtc {
36*d9f75844SAndroid Build Coastguard Worker 
37*d9f75844SAndroid Build Coastguard Worker // The listener is responsible for carrying out the reconfiguration of the video
38*d9f75844SAndroid Build Coastguard Worker // source such that the VideoSourceRestrictions are fulfilled.
39*d9f75844SAndroid Build Coastguard Worker class VideoSourceRestrictionsListener {
40*d9f75844SAndroid Build Coastguard Worker  public:
41*d9f75844SAndroid Build Coastguard Worker   virtual ~VideoSourceRestrictionsListener();
42*d9f75844SAndroid Build Coastguard Worker 
43*d9f75844SAndroid Build Coastguard Worker   // The `restrictions` are filtered by degradation preference but not the
44*d9f75844SAndroid Build Coastguard Worker   // `adaptation_counters`, which are currently only reported for legacy stats
45*d9f75844SAndroid Build Coastguard Worker   // calculation purposes.
46*d9f75844SAndroid Build Coastguard Worker   virtual void OnVideoSourceRestrictionsUpdated(
47*d9f75844SAndroid Build Coastguard Worker       VideoSourceRestrictions restrictions,
48*d9f75844SAndroid Build Coastguard Worker       const VideoAdaptationCounters& adaptation_counters,
49*d9f75844SAndroid Build Coastguard Worker       rtc::scoped_refptr<Resource> reason,
50*d9f75844SAndroid Build Coastguard Worker       const VideoSourceRestrictions& unfiltered_restrictions) = 0;
51*d9f75844SAndroid Build Coastguard Worker };
52*d9f75844SAndroid Build Coastguard Worker 
53*d9f75844SAndroid Build Coastguard Worker class VideoStreamAdapter;
54*d9f75844SAndroid Build Coastguard Worker 
55*d9f75844SAndroid Build Coastguard Worker extern const int kMinFrameRateFps;
56*d9f75844SAndroid Build Coastguard Worker 
57*d9f75844SAndroid Build Coastguard Worker VideoSourceRestrictions FilterRestrictionsByDegradationPreference(
58*d9f75844SAndroid Build Coastguard Worker     VideoSourceRestrictions source_restrictions,
59*d9f75844SAndroid Build Coastguard Worker     DegradationPreference degradation_preference);
60*d9f75844SAndroid Build Coastguard Worker 
61*d9f75844SAndroid Build Coastguard Worker int GetLowerResolutionThan(int pixel_count);
62*d9f75844SAndroid Build Coastguard Worker int GetHigherResolutionThan(int pixel_count);
63*d9f75844SAndroid Build Coastguard Worker 
64*d9f75844SAndroid Build Coastguard Worker // Either represents the next VideoSourceRestrictions the VideoStreamAdapter
65*d9f75844SAndroid Build Coastguard Worker // will take, or provides a Status code indicating the reason for not adapting
66*d9f75844SAndroid Build Coastguard Worker // if the adaptation is not valid.
67*d9f75844SAndroid Build Coastguard Worker class Adaptation final {
68*d9f75844SAndroid Build Coastguard Worker  public:
69*d9f75844SAndroid Build Coastguard Worker   enum class Status {
70*d9f75844SAndroid Build Coastguard Worker     // Applying this adaptation will have an effect. All other Status codes
71*d9f75844SAndroid Build Coastguard Worker     // indicate that adaptation is not possible and why.
72*d9f75844SAndroid Build Coastguard Worker     kValid,
73*d9f75844SAndroid Build Coastguard Worker     // Cannot adapt. The minimum or maximum adaptation has already been reached.
74*d9f75844SAndroid Build Coastguard Worker     // There are no more steps to take.
75*d9f75844SAndroid Build Coastguard Worker     kLimitReached,
76*d9f75844SAndroid Build Coastguard Worker     // Cannot adapt. The resolution or frame rate requested by a recent
77*d9f75844SAndroid Build Coastguard Worker     // adaptation has not yet been reflected in the input resolution or frame
78*d9f75844SAndroid Build Coastguard Worker     // rate; adaptation is refused to avoid "double-adapting".
79*d9f75844SAndroid Build Coastguard Worker     kAwaitingPreviousAdaptation,
80*d9f75844SAndroid Build Coastguard Worker     // Not enough input.
81*d9f75844SAndroid Build Coastguard Worker     kInsufficientInput,
82*d9f75844SAndroid Build Coastguard Worker     // Adaptation disabled via degradation preference.
83*d9f75844SAndroid Build Coastguard Worker     kAdaptationDisabled,
84*d9f75844SAndroid Build Coastguard Worker     // Adaptation up was rejected by a VideoAdaptationConstraint.
85*d9f75844SAndroid Build Coastguard Worker     kRejectedByConstraint,
86*d9f75844SAndroid Build Coastguard Worker   };
87*d9f75844SAndroid Build Coastguard Worker 
88*d9f75844SAndroid Build Coastguard Worker   static const char* StatusToString(Status status);
89*d9f75844SAndroid Build Coastguard Worker 
90*d9f75844SAndroid Build Coastguard Worker   Status status() const;
91*d9f75844SAndroid Build Coastguard Worker   const VideoStreamInputState& input_state() const;
92*d9f75844SAndroid Build Coastguard Worker   const VideoSourceRestrictions& restrictions() const;
93*d9f75844SAndroid Build Coastguard Worker   const VideoAdaptationCounters& counters() const;
94*d9f75844SAndroid Build Coastguard Worker 
95*d9f75844SAndroid Build Coastguard Worker  private:
96*d9f75844SAndroid Build Coastguard Worker   friend class VideoStreamAdapter;
97*d9f75844SAndroid Build Coastguard Worker 
98*d9f75844SAndroid Build Coastguard Worker   // Constructs with a valid adaptation. Status is kValid.
99*d9f75844SAndroid Build Coastguard Worker   Adaptation(int validation_id,
100*d9f75844SAndroid Build Coastguard Worker              VideoSourceRestrictions restrictions,
101*d9f75844SAndroid Build Coastguard Worker              VideoAdaptationCounters counters,
102*d9f75844SAndroid Build Coastguard Worker              VideoStreamInputState input_state);
103*d9f75844SAndroid Build Coastguard Worker   // Constructor when adaptation is not valid. Status MUST NOT be kValid.
104*d9f75844SAndroid Build Coastguard Worker   Adaptation(int validation_id, Status invalid_status);
105*d9f75844SAndroid Build Coastguard Worker 
106*d9f75844SAndroid Build Coastguard Worker   // An Adaptation can become invalidated if the state of VideoStreamAdapter is
107*d9f75844SAndroid Build Coastguard Worker   // modified before the Adaptation is applied. To guard against this, this ID
108*d9f75844SAndroid Build Coastguard Worker   // has to match VideoStreamAdapter::adaptation_validation_id_ when applied.
109*d9f75844SAndroid Build Coastguard Worker   // TODO(https://crbug.com/webrtc/11700): Remove the validation_id_.
110*d9f75844SAndroid Build Coastguard Worker   const int validation_id_;
111*d9f75844SAndroid Build Coastguard Worker   const Status status_;
112*d9f75844SAndroid Build Coastguard Worker   // Input state when adaptation was made.
113*d9f75844SAndroid Build Coastguard Worker   const VideoStreamInputState input_state_;
114*d9f75844SAndroid Build Coastguard Worker   const VideoSourceRestrictions restrictions_;
115*d9f75844SAndroid Build Coastguard Worker   const VideoAdaptationCounters counters_;
116*d9f75844SAndroid Build Coastguard Worker };
117*d9f75844SAndroid Build Coastguard Worker 
118*d9f75844SAndroid Build Coastguard Worker // Owns the VideoSourceRestriction for a single stream and is responsible for
119*d9f75844SAndroid Build Coastguard Worker // adapting it up or down when told to do so. This class serves the following
120*d9f75844SAndroid Build Coastguard Worker // purposes:
121*d9f75844SAndroid Build Coastguard Worker // 1. Keep track of a stream's restrictions.
122*d9f75844SAndroid Build Coastguard Worker // 2. Provide valid ways to adapt up or down the stream's restrictions.
123*d9f75844SAndroid Build Coastguard Worker // 3. Modify the stream's restrictions in one of the valid ways.
124*d9f75844SAndroid Build Coastguard Worker class VideoStreamAdapter {
125*d9f75844SAndroid Build Coastguard Worker  public:
126*d9f75844SAndroid Build Coastguard Worker   VideoStreamAdapter(VideoStreamInputStateProvider* input_state_provider,
127*d9f75844SAndroid Build Coastguard Worker                      VideoStreamEncoderObserver* encoder_stats_observer,
128*d9f75844SAndroid Build Coastguard Worker                      const FieldTrialsView& field_trials);
129*d9f75844SAndroid Build Coastguard Worker   ~VideoStreamAdapter();
130*d9f75844SAndroid Build Coastguard Worker 
131*d9f75844SAndroid Build Coastguard Worker   VideoSourceRestrictions source_restrictions() const;
132*d9f75844SAndroid Build Coastguard Worker   const VideoAdaptationCounters& adaptation_counters() const;
133*d9f75844SAndroid Build Coastguard Worker   void ClearRestrictions();
134*d9f75844SAndroid Build Coastguard Worker 
135*d9f75844SAndroid Build Coastguard Worker   void AddRestrictionsListener(
136*d9f75844SAndroid Build Coastguard Worker       VideoSourceRestrictionsListener* restrictions_listener);
137*d9f75844SAndroid Build Coastguard Worker   void RemoveRestrictionsListener(
138*d9f75844SAndroid Build Coastguard Worker       VideoSourceRestrictionsListener* restrictions_listener);
139*d9f75844SAndroid Build Coastguard Worker   void AddAdaptationConstraint(AdaptationConstraint* adaptation_constraint);
140*d9f75844SAndroid Build Coastguard Worker   void RemoveAdaptationConstraint(AdaptationConstraint* adaptation_constraint);
141*d9f75844SAndroid Build Coastguard Worker 
142*d9f75844SAndroid Build Coastguard Worker   // TODO(hbos): Setting the degradation preference should not clear
143*d9f75844SAndroid Build Coastguard Worker   // restrictions! This is not defined in the spec and is unexpected, there is a
144*d9f75844SAndroid Build Coastguard Worker   // tiny risk that people would discover and rely on this behavior.
145*d9f75844SAndroid Build Coastguard Worker   void SetDegradationPreference(DegradationPreference degradation_preference);
146*d9f75844SAndroid Build Coastguard Worker 
147*d9f75844SAndroid Build Coastguard Worker   // Returns an adaptation that we are guaranteed to be able to apply, or a
148*d9f75844SAndroid Build Coastguard Worker   // status code indicating the reason why we cannot adapt.
149*d9f75844SAndroid Build Coastguard Worker   Adaptation GetAdaptationUp();
150*d9f75844SAndroid Build Coastguard Worker   Adaptation GetAdaptationDown();
151*d9f75844SAndroid Build Coastguard Worker   Adaptation GetAdaptationTo(const VideoAdaptationCounters& counters,
152*d9f75844SAndroid Build Coastguard Worker                              const VideoSourceRestrictions& restrictions);
153*d9f75844SAndroid Build Coastguard Worker   // Tries to adapt the resolution one step. This is used for initial frame
154*d9f75844SAndroid Build Coastguard Worker   // dropping. Does nothing if the degradation preference is not BALANCED or
155*d9f75844SAndroid Build Coastguard Worker   // MAINTAIN_FRAMERATE. In the case of BALANCED, it will try twice to reduce
156*d9f75844SAndroid Build Coastguard Worker   // the resolution. If it fails twice it gives up.
157*d9f75844SAndroid Build Coastguard Worker   Adaptation GetAdaptDownResolution();
158*d9f75844SAndroid Build Coastguard Worker 
159*d9f75844SAndroid Build Coastguard Worker   // Updates source_restrictions() the Adaptation.
160*d9f75844SAndroid Build Coastguard Worker   void ApplyAdaptation(const Adaptation& adaptation,
161*d9f75844SAndroid Build Coastguard Worker                        rtc::scoped_refptr<Resource> resource);
162*d9f75844SAndroid Build Coastguard Worker 
163*d9f75844SAndroid Build Coastguard Worker   struct RestrictionsWithCounters {
164*d9f75844SAndroid Build Coastguard Worker     VideoSourceRestrictions restrictions;
165*d9f75844SAndroid Build Coastguard Worker     VideoAdaptationCounters counters;
166*d9f75844SAndroid Build Coastguard Worker   };
167*d9f75844SAndroid Build Coastguard Worker 
168*d9f75844SAndroid Build Coastguard Worker   static absl::optional<uint32_t> GetSingleActiveLayerPixels(
169*d9f75844SAndroid Build Coastguard Worker       const VideoCodec& codec);
170*d9f75844SAndroid Build Coastguard Worker 
171*d9f75844SAndroid Build Coastguard Worker  private:
172*d9f75844SAndroid Build Coastguard Worker   void BroadcastVideoRestrictionsUpdate(
173*d9f75844SAndroid Build Coastguard Worker       const VideoStreamInputState& input_state,
174*d9f75844SAndroid Build Coastguard Worker       const rtc::scoped_refptr<Resource>& resource);
175*d9f75844SAndroid Build Coastguard Worker 
176*d9f75844SAndroid Build Coastguard Worker   bool HasSufficientInputForAdaptation(const VideoStreamInputState& input_state)
177*d9f75844SAndroid Build Coastguard Worker       const RTC_RUN_ON(&sequence_checker_);
178*d9f75844SAndroid Build Coastguard Worker 
179*d9f75844SAndroid Build Coastguard Worker   using RestrictionsOrState =
180*d9f75844SAndroid Build Coastguard Worker       absl::variant<RestrictionsWithCounters, Adaptation::Status>;
181*d9f75844SAndroid Build Coastguard Worker   RestrictionsOrState GetAdaptationUpStep(
182*d9f75844SAndroid Build Coastguard Worker       const VideoStreamInputState& input_state) const
183*d9f75844SAndroid Build Coastguard Worker       RTC_RUN_ON(&sequence_checker_);
184*d9f75844SAndroid Build Coastguard Worker   RestrictionsOrState GetAdaptationDownStep(
185*d9f75844SAndroid Build Coastguard Worker       const VideoStreamInputState& input_state,
186*d9f75844SAndroid Build Coastguard Worker       const RestrictionsWithCounters& current_restrictions) const
187*d9f75844SAndroid Build Coastguard Worker       RTC_RUN_ON(&sequence_checker_);
188*d9f75844SAndroid Build Coastguard Worker   RestrictionsOrState GetAdaptDownResolutionStepForBalanced(
189*d9f75844SAndroid Build Coastguard Worker       const VideoStreamInputState& input_state) const
190*d9f75844SAndroid Build Coastguard Worker       RTC_RUN_ON(&sequence_checker_);
191*d9f75844SAndroid Build Coastguard Worker   RestrictionsOrState AdaptIfFpsDiffInsufficient(
192*d9f75844SAndroid Build Coastguard Worker       const VideoStreamInputState& input_state,
193*d9f75844SAndroid Build Coastguard Worker       const RestrictionsWithCounters& restrictions) const
194*d9f75844SAndroid Build Coastguard Worker       RTC_RUN_ON(&sequence_checker_);
195*d9f75844SAndroid Build Coastguard Worker 
196*d9f75844SAndroid Build Coastguard Worker   Adaptation GetAdaptationUp(const VideoStreamInputState& input_state) const
197*d9f75844SAndroid Build Coastguard Worker       RTC_RUN_ON(&sequence_checker_);
198*d9f75844SAndroid Build Coastguard Worker   Adaptation GetAdaptationDown(const VideoStreamInputState& input_state) const
199*d9f75844SAndroid Build Coastguard Worker       RTC_RUN_ON(&sequence_checker_);
200*d9f75844SAndroid Build Coastguard Worker 
201*d9f75844SAndroid Build Coastguard Worker   static RestrictionsOrState DecreaseResolution(
202*d9f75844SAndroid Build Coastguard Worker       const VideoStreamInputState& input_state,
203*d9f75844SAndroid Build Coastguard Worker       const RestrictionsWithCounters& current_restrictions);
204*d9f75844SAndroid Build Coastguard Worker   static RestrictionsOrState IncreaseResolution(
205*d9f75844SAndroid Build Coastguard Worker       const VideoStreamInputState& input_state,
206*d9f75844SAndroid Build Coastguard Worker       const RestrictionsWithCounters& current_restrictions);
207*d9f75844SAndroid Build Coastguard Worker   // Framerate methods are member functions because they need internal state
208*d9f75844SAndroid Build Coastguard Worker   // if the degradation preference is BALANCED.
209*d9f75844SAndroid Build Coastguard Worker   RestrictionsOrState DecreaseFramerate(
210*d9f75844SAndroid Build Coastguard Worker       const VideoStreamInputState& input_state,
211*d9f75844SAndroid Build Coastguard Worker       const RestrictionsWithCounters& current_restrictions) const
212*d9f75844SAndroid Build Coastguard Worker       RTC_RUN_ON(&sequence_checker_);
213*d9f75844SAndroid Build Coastguard Worker   RestrictionsOrState IncreaseFramerate(
214*d9f75844SAndroid Build Coastguard Worker       const VideoStreamInputState& input_state,
215*d9f75844SAndroid Build Coastguard Worker       const RestrictionsWithCounters& current_restrictions) const
216*d9f75844SAndroid Build Coastguard Worker       RTC_RUN_ON(&sequence_checker_);
217*d9f75844SAndroid Build Coastguard Worker 
218*d9f75844SAndroid Build Coastguard Worker   struct RestrictionsOrStateVisitor;
219*d9f75844SAndroid Build Coastguard Worker   Adaptation RestrictionsOrStateToAdaptation(
220*d9f75844SAndroid Build Coastguard Worker       RestrictionsOrState step_or_state,
221*d9f75844SAndroid Build Coastguard Worker       const VideoStreamInputState& input_state) const
222*d9f75844SAndroid Build Coastguard Worker       RTC_RUN_ON(&sequence_checker_);
223*d9f75844SAndroid Build Coastguard Worker 
224*d9f75844SAndroid Build Coastguard Worker   RTC_NO_UNIQUE_ADDRESS SequenceChecker sequence_checker_
225*d9f75844SAndroid Build Coastguard Worker       RTC_GUARDED_BY(&sequence_checker_);
226*d9f75844SAndroid Build Coastguard Worker   // Gets the input state which is the basis of all adaptations.
227*d9f75844SAndroid Build Coastguard Worker   // Thread safe.
228*d9f75844SAndroid Build Coastguard Worker   VideoStreamInputStateProvider* input_state_provider_;
229*d9f75844SAndroid Build Coastguard Worker   // Used to signal when min pixel limit has been reached.
230*d9f75844SAndroid Build Coastguard Worker   VideoStreamEncoderObserver* const encoder_stats_observer_;
231*d9f75844SAndroid Build Coastguard Worker   // Decides the next adaptation target in DegradationPreference::BALANCED.
232*d9f75844SAndroid Build Coastguard Worker   const BalancedDegradationSettings balanced_settings_;
233*d9f75844SAndroid Build Coastguard Worker   // To guard against applying adaptations that have become invalidated, an
234*d9f75844SAndroid Build Coastguard Worker   // Adaptation that is applied has to have a matching validation ID.
235*d9f75844SAndroid Build Coastguard Worker   int adaptation_validation_id_ RTC_GUARDED_BY(&sequence_checker_);
236*d9f75844SAndroid Build Coastguard Worker   // When deciding the next target up or down, different strategies are used
237*d9f75844SAndroid Build Coastguard Worker   // depending on the DegradationPreference.
238*d9f75844SAndroid Build Coastguard Worker   // https://w3c.github.io/mst-content-hint/#dom-rtcdegradationpreference
239*d9f75844SAndroid Build Coastguard Worker   DegradationPreference degradation_preference_
240*d9f75844SAndroid Build Coastguard Worker       RTC_GUARDED_BY(&sequence_checker_);
241*d9f75844SAndroid Build Coastguard Worker   // Used to avoid adapting twice. Stores the resolution at the time of the last
242*d9f75844SAndroid Build Coastguard Worker   // adaptation.
243*d9f75844SAndroid Build Coastguard Worker   // TODO(hbos): Can we implement a more general "cooldown" mechanism of
244*d9f75844SAndroid Build Coastguard Worker   // resources intead? If we already have adapted it seems like we should wait
245*d9f75844SAndroid Build Coastguard Worker   // a while before adapting again, so that we are not acting on usage
246*d9f75844SAndroid Build Coastguard Worker   // measurements that are made obsolete/unreliable by an "ongoing" adaptation.
247*d9f75844SAndroid Build Coastguard Worker   struct AwaitingFrameSizeChange {
248*d9f75844SAndroid Build Coastguard Worker     AwaitingFrameSizeChange(bool pixels_increased, int frame_size);
249*d9f75844SAndroid Build Coastguard Worker     const bool pixels_increased;
250*d9f75844SAndroid Build Coastguard Worker     const int frame_size_pixels;
251*d9f75844SAndroid Build Coastguard Worker   };
252*d9f75844SAndroid Build Coastguard Worker   absl::optional<AwaitingFrameSizeChange> awaiting_frame_size_change_
253*d9f75844SAndroid Build Coastguard Worker       RTC_GUARDED_BY(&sequence_checker_);
254*d9f75844SAndroid Build Coastguard Worker   // The previous restrictions value. Starts as unrestricted.
255*d9f75844SAndroid Build Coastguard Worker   VideoSourceRestrictions last_video_source_restrictions_
256*d9f75844SAndroid Build Coastguard Worker       RTC_GUARDED_BY(&sequence_checker_);
257*d9f75844SAndroid Build Coastguard Worker   VideoSourceRestrictions last_filtered_restrictions_
258*d9f75844SAndroid Build Coastguard Worker       RTC_GUARDED_BY(&sequence_checker_);
259*d9f75844SAndroid Build Coastguard Worker 
260*d9f75844SAndroid Build Coastguard Worker   std::vector<VideoSourceRestrictionsListener*> restrictions_listeners_
261*d9f75844SAndroid Build Coastguard Worker       RTC_GUARDED_BY(&sequence_checker_);
262*d9f75844SAndroid Build Coastguard Worker   std::vector<AdaptationConstraint*> adaptation_constraints_
263*d9f75844SAndroid Build Coastguard Worker       RTC_GUARDED_BY(&sequence_checker_);
264*d9f75844SAndroid Build Coastguard Worker 
265*d9f75844SAndroid Build Coastguard Worker   RestrictionsWithCounters current_restrictions_
266*d9f75844SAndroid Build Coastguard Worker       RTC_GUARDED_BY(&sequence_checker_);
267*d9f75844SAndroid Build Coastguard Worker };
268*d9f75844SAndroid Build Coastguard Worker 
269*d9f75844SAndroid Build Coastguard Worker }  // namespace webrtc
270*d9f75844SAndroid Build Coastguard Worker 
271*d9f75844SAndroid Build Coastguard Worker #endif  // CALL_ADAPTATION_VIDEO_STREAM_ADAPTER_H_
272