[Adaptation] Remove deg.prefs from ResourceAdaptationProcessor

Changes in effective degradation preference is now done directly
on the VideoStreamAdapter. This means that the
DegradationPreferenceListener class can be removed.

Bug: webrtc:11700
Change-Id: I9ce4b627de0279df5ef2e5a38435a6d352fbb135
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/178609
Reviewed-by: Ilya Nikolaevskiy <ilnik@webrtc.org>
Reviewed-by: Henrik Boström <hbos@webrtc.org>
Commit-Queue: Evan Shrubsole <eshr@google.com>
Cr-Commit-Position: refs/heads/master@{#31642}
diff --git a/call/adaptation/BUILD.gn b/call/adaptation/BUILD.gn
index 6aa82e5..94944d6 100644
--- a/call/adaptation/BUILD.gn
+++ b/call/adaptation/BUILD.gn
@@ -16,8 +16,6 @@
     "adaptation_listener.h",
     "broadcast_resource_listener.cc",
     "broadcast_resource_listener.h",
-    "degradation_preference_listener.cc",
-    "degradation_preference_listener.h",
     "degradation_preference_provider.cc",
     "degradation_preference_provider.h",
     "encoder_settings.cc",
diff --git a/call/adaptation/degradation_preference_listener.cc b/call/adaptation/degradation_preference_listener.cc
deleted file mode 100644
index 3425e59..0000000
--- a/call/adaptation/degradation_preference_listener.cc
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- *  Copyright 2020 The WebRTC Project Authors. All rights reserved.
- *
- *  Use of this source code is governed by a BSD-style license
- *  that can be found in the LICENSE file in the root of the source
- *  tree. An additional intellectual property rights grant can be found
- *  in the file PATENTS.  All contributing project authors may
- *  be found in the AUTHORS file in the root of the source tree.
- */
-
-#include "call/adaptation/degradation_preference_listener.h"
-
-namespace webrtc {
-
-DegradationPreferenceListener::~DegradationPreferenceListener() = default;
-
-}  // namespace webrtc
diff --git a/call/adaptation/degradation_preference_listener.h b/call/adaptation/degradation_preference_listener.h
deleted file mode 100644
index d085b22..0000000
--- a/call/adaptation/degradation_preference_listener.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- *  Copyright 2020 The WebRTC Project Authors. All rights reserved.
- *
- *  Use of this source code is governed by a BSD-style license
- *  that can be found in the LICENSE file in the root of the source
- *  tree. An additional intellectual property rights grant can be found
- *  in the file PATENTS.  All contributing project authors may
- *  be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef CALL_ADAPTATION_DEGRADATION_PREFERENCE_LISTENER_H_
-#define CALL_ADAPTATION_DEGRADATION_PREFERENCE_LISTENER_H_
-
-#include "api/rtp_parameters.h"
-
-namespace webrtc {
-
-class DegradationPreferenceListener {
- public:
-  virtual ~DegradationPreferenceListener();
-
-  virtual void OnDegradationPreferenceUpdated(
-      DegradationPreference degradation_preference) = 0;
-};
-
-}  // namespace webrtc
-
-#endif  // CALL_ADAPTATION_DEGRADATION_PREFERENCE_LISTENER_H_
diff --git a/call/adaptation/resource_adaptation_processor.cc b/call/adaptation/resource_adaptation_processor.cc
index 414132d..dd273ac 100644
--- a/call/adaptation/resource_adaptation_processor.cc
+++ b/call/adaptation/resource_adaptation_processor.cc
@@ -75,7 +75,6 @@
           new rtc::RefCountedObject<ResourceListenerDelegate>(this)),
       encoder_stats_observer_(encoder_stats_observer),
       resources_(),
-      effective_degradation_preference_(DegradationPreference::DISABLED),
       stream_adapter_(stream_adapter),
       last_reported_source_restrictions_(),
       previous_mitigation_results_(),
@@ -201,23 +200,6 @@
   adaptation_listeners_.erase(it);
 }
 
-void ResourceAdaptationProcessor::OnDegradationPreferenceUpdated(
-    DegradationPreference degradation_preference) {
-  if (!resource_adaptation_queue_->IsCurrent()) {
-    resource_adaptation_queue_->PostTask(
-        ToQueuedTask([this, degradation_preference]() {
-          OnDegradationPreferenceUpdated(degradation_preference);
-        }));
-    return;
-  }
-  RTC_DCHECK_RUN_ON(resource_adaptation_queue_);
-  if (degradation_preference == effective_degradation_preference_) {
-    return;
-  }
-  effective_degradation_preference_ = degradation_preference;
-  stream_adapter_->SetDegradationPreference(effective_degradation_preference_);
-}
-
 void ResourceAdaptationProcessor::OnResourceUsageStateMeasured(
     rtc::scoped_refptr<Resource> resource,
     ResourceUsageState usage_state) {
@@ -263,12 +245,6 @@
   RTC_DCHECK_RUN_ON(resource_adaptation_queue_);
   RTC_DCHECK(!processing_in_progress_);
   processing_in_progress_ = true;
-  if (effective_degradation_preference_ == DegradationPreference::DISABLED) {
-    processing_in_progress_ = false;
-    return MitigationResultAndLogMessage(
-        MitigationResult::kDisabled,
-        "Not adapting up because DegradationPreference is disabled");
-  }
   // How can this stream be adapted up?
   Adaptation adaptation = stream_adapter_->GetAdaptationUp();
   if (adaptation.status() != Adaptation::Status::kValid) {
@@ -351,12 +327,6 @@
   RTC_DCHECK_RUN_ON(resource_adaptation_queue_);
   RTC_DCHECK(!processing_in_progress_);
   processing_in_progress_ = true;
-  if (effective_degradation_preference_ == DegradationPreference::DISABLED) {
-    processing_in_progress_ = false;
-    return MitigationResultAndLogMessage(
-        MitigationResult::kDisabled,
-        "Not adapting down because DegradationPreference is disabled");
-  }
   // How can this stream be adapted up?
   Adaptation adaptation = stream_adapter_->GetAdaptationDown();
   if (adaptation.min_pixel_limit_reached()) {
diff --git a/call/adaptation/resource_adaptation_processor.h b/call/adaptation/resource_adaptation_processor.h
index 33e964e..f519fcc 100644
--- a/call/adaptation/resource_adaptation_processor.h
+++ b/call/adaptation/resource_adaptation_processor.h
@@ -27,7 +27,6 @@
 #include "api/video/video_stream_encoder_observer.h"
 #include "call/adaptation/adaptation_constraint.h"
 #include "call/adaptation/adaptation_listener.h"
-#include "call/adaptation/degradation_preference_listener.h"
 #include "call/adaptation/resource_adaptation_processor_interface.h"
 #include "call/adaptation/video_source_restrictions.h"
 #include "call/adaptation/video_stream_adapter.h"
@@ -54,8 +53,7 @@
 // i.e. the "resource adaptation task queue".
 class ResourceAdaptationProcessor : public ResourceAdaptationProcessorInterface,
                                     public VideoSourceRestrictionsListener,
-                                    public ResourceListener,
-                                    public DegradationPreferenceListener {
+                                    public ResourceListener {
  public:
   ResourceAdaptationProcessor(
       VideoStreamEncoderObserver* encoder_stats_observer,
@@ -92,9 +90,6 @@
       const VideoAdaptationCounters& adaptation_counters,
       rtc::scoped_refptr<Resource> reason,
       const VideoSourceRestrictions& unfiltered_restrictions) override;
-  // DegradationPreferenceListener implementation.
-  void OnDegradationPreferenceUpdated(
-      DegradationPreference degradation_preference) override;
 
  private:
   // If resource usage measurements happens off the adaptation task queue, this
@@ -119,7 +114,6 @@
   };
 
   enum class MitigationResult {
-    kDisabled,
     kNotMostLimitedResource,
     kSharedMostLimitedResource,
     kRejectedByAdapter,
@@ -142,10 +136,6 @@
   MitigationResultAndLogMessage OnResourceOveruse(
       rtc::scoped_refptr<Resource> reason_resource);
 
-  // Needs to be invoked any time |degradation_preference_| or |is_screenshare_|
-  // changes to ensure |effective_degradation_preference_| is up-to-date.
-  void MaybeUpdateEffectiveDegradationPreference();
-
   void UpdateResourceLimitations(rtc::scoped_refptr<Resource> reason_resource,
                                  const VideoSourceRestrictions& restrictions,
                                  const VideoAdaptationCounters& counters)
@@ -182,9 +172,6 @@
            VideoStreamAdapter::RestrictionsWithCounters>
       adaptation_limits_by_resources_
           RTC_GUARDED_BY(resource_adaptation_queue_);
-  // Adaptation strategy settings.
-  DegradationPreference effective_degradation_preference_
-      RTC_GUARDED_BY(resource_adaptation_queue_);
   // Responsible for generating and applying possible adaptations.
   VideoStreamAdapter* const stream_adapter_
       RTC_GUARDED_BY(resource_adaptation_queue_);
diff --git a/call/adaptation/resource_adaptation_processor_unittest.cc b/call/adaptation/resource_adaptation_processor_unittest.cc
index e7298d6..0b16fab 100644
--- a/call/adaptation/resource_adaptation_processor_unittest.cc
+++ b/call/adaptation/resource_adaptation_processor_unittest.cc
@@ -163,7 +163,7 @@
 }
 
 TEST_F(ResourceAdaptationProcessorTest, InsufficientInput) {
-  processor_->OnDegradationPreferenceUpdated(
+  video_stream_adapter_->SetDegradationPreference(
       DegradationPreference::MAINTAIN_FRAMERATE);
   // Adaptation does not happen if input is insufficient.
   // When frame size is missing (OnFrameSizeObserved not called yet).
@@ -183,7 +183,7 @@
 // restrictions. For that, see video_stream_adapter_unittest.cc.
 TEST_F(ResourceAdaptationProcessorTest,
        OveruseTriggersRestrictingResolutionInMaintainFrameRate) {
-  processor_->OnDegradationPreferenceUpdated(
+  video_stream_adapter_->SetDegradationPreference(
       DegradationPreference::MAINTAIN_FRAMERATE);
   SetInputStates(true, kDefaultFrameRate, kDefaultFrameSize);
   resource_->SetUsageState(ResourceUsageState::kOveruse);
@@ -194,7 +194,7 @@
 
 TEST_F(ResourceAdaptationProcessorTest,
        OveruseTriggersRestrictingFrameRateInMaintainResolution) {
-  processor_->OnDegradationPreferenceUpdated(
+  video_stream_adapter_->SetDegradationPreference(
       DegradationPreference::MAINTAIN_RESOLUTION);
   SetInputStates(true, kDefaultFrameRate, kDefaultFrameSize);
   resource_->SetUsageState(ResourceUsageState::kOveruse);
@@ -205,7 +205,8 @@
 
 TEST_F(ResourceAdaptationProcessorTest,
        OveruseTriggersRestrictingFrameRateAndResolutionInBalanced) {
-  processor_->OnDegradationPreferenceUpdated(DegradationPreference::BALANCED);
+  video_stream_adapter_->SetDegradationPreference(
+      DegradationPreference::BALANCED);
   SetInputStates(true, kDefaultFrameRate, kDefaultFrameSize);
   // Adapting multiple times eventually resticts both frame rate and
   // resolution. Exactly many times we need to adapt depends on
@@ -223,7 +224,7 @@
 }
 
 TEST_F(ResourceAdaptationProcessorTest, AwaitingPreviousAdaptation) {
-  processor_->OnDegradationPreferenceUpdated(
+  video_stream_adapter_->SetDegradationPreference(
       DegradationPreference::MAINTAIN_FRAMERATE);
   SetInputStates(true, kDefaultFrameRate, kDefaultFrameSize);
   resource_->SetUsageState(ResourceUsageState::kOveruse);
@@ -235,7 +236,7 @@
 }
 
 TEST_F(ResourceAdaptationProcessorTest, CannotAdaptUpWhenUnrestricted) {
-  processor_->OnDegradationPreferenceUpdated(
+  video_stream_adapter_->SetDegradationPreference(
       DegradationPreference::MAINTAIN_FRAMERATE);
   SetInputStates(true, kDefaultFrameRate, kDefaultFrameSize);
   resource_->SetUsageState(ResourceUsageState::kUnderuse);
@@ -243,7 +244,7 @@
 }
 
 TEST_F(ResourceAdaptationProcessorTest, UnderuseTakesUsBackToUnrestricted) {
-  processor_->OnDegradationPreferenceUpdated(
+  video_stream_adapter_->SetDegradationPreference(
       DegradationPreference::MAINTAIN_FRAMERATE);
   SetInputStates(true, kDefaultFrameRate, kDefaultFrameSize);
   resource_->SetUsageState(ResourceUsageState::kOveruse);
@@ -255,7 +256,7 @@
 }
 
 TEST_F(ResourceAdaptationProcessorTest, ResourcesCanPreventAdaptingUp) {
-  processor_->OnDegradationPreferenceUpdated(
+  video_stream_adapter_->SetDegradationPreference(
       DegradationPreference::MAINTAIN_FRAMERATE);
   SetInputStates(true, kDefaultFrameRate, kDefaultFrameSize);
   // Adapt down so that we can adapt up.
@@ -270,7 +271,7 @@
 
 TEST_F(ResourceAdaptationProcessorTest,
        ResourcesCanNotAdaptUpIfNeverAdaptedDown) {
-  processor_->OnDegradationPreferenceUpdated(
+  video_stream_adapter_->SetDegradationPreference(
       DegradationPreference::MAINTAIN_FRAMERATE);
   SetInputStates(true, kDefaultFrameRate, kDefaultFrameSize);
   resource_->SetUsageState(ResourceUsageState::kOveruse);
@@ -284,7 +285,7 @@
 
 TEST_F(ResourceAdaptationProcessorTest,
        ResourcesCanNotAdaptUpIfNotAdaptedDownAfterReset) {
-  processor_->OnDegradationPreferenceUpdated(
+  video_stream_adapter_->SetDegradationPreference(
       DegradationPreference::MAINTAIN_FRAMERATE);
   SetInputStates(true, kDefaultFrameRate, kDefaultFrameSize);
   resource_->SetUsageState(ResourceUsageState::kOveruse);
@@ -303,7 +304,7 @@
 }
 
 TEST_F(ResourceAdaptationProcessorTest, OnlyMostLimitedResourceMayAdaptUp) {
-  processor_->OnDegradationPreferenceUpdated(
+  video_stream_adapter_->SetDegradationPreference(
       DegradationPreference::MAINTAIN_FRAMERATE);
   SetInputStates(true, kDefaultFrameRate, kDefaultFrameSize);
   resource_->SetUsageState(ResourceUsageState::kOveruse);
@@ -333,7 +334,7 @@
 
 TEST_F(ResourceAdaptationProcessorTest,
        MultipleResourcesCanTriggerMultipleAdaptations) {
-  processor_->OnDegradationPreferenceUpdated(
+  video_stream_adapter_->SetDegradationPreference(
       DegradationPreference::MAINTAIN_FRAMERATE);
   SetInputStates(true, kDefaultFrameRate, kDefaultFrameSize);
   resource_->SetUsageState(ResourceUsageState::kOveruse);
@@ -391,7 +392,7 @@
 
 TEST_F(ResourceAdaptationProcessorTest,
        MostLimitedResourceAdaptationWorksAfterChangingDegradataionPreference) {
-  processor_->OnDegradationPreferenceUpdated(
+  video_stream_adapter_->SetDegradationPreference(
       DegradationPreference::MAINTAIN_FRAMERATE);
   SetInputStates(true, kDefaultFrameRate, kDefaultFrameSize);
   // Adapt down until we can't anymore.
@@ -407,7 +408,7 @@
   RestrictSource(restrictions_listener_.restrictions());
   int last_total = restrictions_listener_.adaptation_counters().Total();
 
-  processor_->OnDegradationPreferenceUpdated(
+  video_stream_adapter_->SetDegradationPreference(
       DegradationPreference::MAINTAIN_RESOLUTION);
   // resource_ can not adapt up since we have never reduced FPS.
   resource_->SetUsageState(ResourceUsageState::kUnderuse);
@@ -423,7 +424,7 @@
 }
 
 TEST_F(ResourceAdaptationProcessorTest, AdaptingTriggersOnAdaptationApplied) {
-  processor_->OnDegradationPreferenceUpdated(
+  video_stream_adapter_->SetDegradationPreference(
       DegradationPreference::MAINTAIN_FRAMERATE);
   SetInputStates(true, kDefaultFrameRate, kDefaultFrameSize);
   resource_->SetUsageState(ResourceUsageState::kOveruse);
@@ -432,7 +433,7 @@
 
 TEST_F(ResourceAdaptationProcessorTest,
        AdaptsDownWhenOtherResourceIsAlwaysUnderused) {
-  processor_->OnDegradationPreferenceUpdated(
+  video_stream_adapter_->SetDegradationPreference(
       DegradationPreference::MAINTAIN_FRAMERATE);
   SetInputStates(true, kDefaultFrameRate, kDefaultFrameSize);
   other_resource_->SetUsageState(ResourceUsageState::kUnderuse);
@@ -453,7 +454,7 @@
 
 TEST_F(ResourceAdaptationProcessorTest,
        TriggerOveruseNotOnAdaptationTaskQueue) {
-  processor_->OnDegradationPreferenceUpdated(
+  video_stream_adapter_->SetDegradationPreference(
       DegradationPreference::MAINTAIN_FRAMERATE);
   SetInputStates(true, kDefaultFrameRate, kDefaultFrameSize);
 
@@ -467,7 +468,7 @@
 
 TEST_F(ResourceAdaptationProcessorTest,
        DestroyProcessorWhileResourceListenerDelegateHasTaskInFlight) {
-  processor_->OnDegradationPreferenceUpdated(
+  video_stream_adapter_->SetDegradationPreference(
       DegradationPreference::MAINTAIN_FRAMERATE);
   SetInputStates(true, kDefaultFrameRate, kDefaultFrameSize);
 
@@ -491,7 +492,7 @@
 
 TEST_F(ResourceAdaptationProcessorTest,
        ResourceOveruseIgnoredWhenSignalledDuringRemoval) {
-  processor_->OnDegradationPreferenceUpdated(
+  video_stream_adapter_->SetDegradationPreference(
       DegradationPreference::MAINTAIN_FRAMERATE);
   SetInputStates(true, kDefaultFrameRate, kDefaultFrameSize);
 
@@ -520,7 +521,7 @@
 
 TEST_F(ResourceAdaptationProcessorTest,
        RemovingOnlyAdaptedResourceResetsAdaptation) {
-  processor_->OnDegradationPreferenceUpdated(
+  video_stream_adapter_->SetDegradationPreference(
       DegradationPreference::MAINTAIN_FRAMERATE);
   SetInputStates(true, kDefaultFrameRate, kDefaultFrameSize);
 
@@ -537,7 +538,8 @@
 
 TEST_F(ResourceAdaptationProcessorTest,
        RemovingMostLimitedResourceSetsAdaptationToNextLimitedLevel) {
-  processor_->OnDegradationPreferenceUpdated(DegradationPreference::BALANCED);
+  video_stream_adapter_->SetDegradationPreference(
+      DegradationPreference::BALANCED);
   SetInputStates(true, kDefaultFrameRate, kDefaultFrameSize);
 
   other_resource_->SetUsageState(ResourceUsageState::kOveruse);
@@ -565,7 +567,7 @@
 
 TEST_F(ResourceAdaptationProcessorTest,
        RemovingMostLimitedResourceSetsAdaptationIfInputStateUnchanged) {
-  processor_->OnDegradationPreferenceUpdated(
+  video_stream_adapter_->SetDegradationPreference(
       DegradationPreference::MAINTAIN_FRAMERATE);
   SetInputStates(true, kDefaultFrameRate, kDefaultFrameSize);
 
@@ -602,7 +604,8 @@
 
 TEST_F(ResourceAdaptationProcessorTest,
        RemovingResourceNotMostLimitedHasNoEffectOnLimitations) {
-  processor_->OnDegradationPreferenceUpdated(DegradationPreference::BALANCED);
+  video_stream_adapter_->SetDegradationPreference(
+      DegradationPreference::BALANCED);
   SetInputStates(true, kDefaultFrameRate, kDefaultFrameSize);
 
   other_resource_->SetUsageState(ResourceUsageState::kOveruse);
@@ -628,7 +631,7 @@
 
 TEST_F(ResourceAdaptationProcessorTest,
        RemovingMostLimitedResourceAfterSwitchingDegradationPreferences) {
-  processor_->OnDegradationPreferenceUpdated(
+  video_stream_adapter_->SetDegradationPreference(
       DegradationPreference::MAINTAIN_FRAMERATE);
   SetInputStates(true, kDefaultFrameRate, kDefaultFrameSize);
 
@@ -640,7 +643,7 @@
   VideoAdaptationCounters next_limited_counters =
       restrictions_listener_.adaptation_counters();
 
-  processor_->OnDegradationPreferenceUpdated(
+  video_stream_adapter_->SetDegradationPreference(
       DegradationPreference::MAINTAIN_RESOLUTION);
   resource_->SetUsageState(ResourceUsageState::kOveruse);
   RestrictSource(restrictions_listener_.restrictions());
@@ -654,7 +657,7 @@
 
   // After switching back to MAINTAIN_FRAMERATE, the next most limited settings
   // are restored.
-  processor_->OnDegradationPreferenceUpdated(
+  video_stream_adapter_->SetDegradationPreference(
       DegradationPreference::MAINTAIN_FRAMERATE);
   EXPECT_EQ(next_limited_restrictions, restrictions_listener_.restrictions());
 
@@ -664,7 +667,7 @@
 
 TEST_F(ResourceAdaptationProcessorTest,
        RemovingMostLimitedResourceSetsNextLimitationsInDisabled) {
-  processor_->OnDegradationPreferenceUpdated(
+  video_stream_adapter_->SetDegradationPreference(
       DegradationPreference::MAINTAIN_FRAMERATE);
   SetInputStates(true, kDefaultFrameRate, kDefaultFrameSize);
 
@@ -679,7 +682,8 @@
   RestrictSource(restrictions_listener_.restrictions());
   EXPECT_EQ(2, restrictions_listener_.adaptation_counters().Total());
 
-  processor_->OnDegradationPreferenceUpdated(DegradationPreference::DISABLED);
+  video_stream_adapter_->SetDegradationPreference(
+      DegradationPreference::DISABLED);
 
   // Revert to |other_resource_| when removing |resource_| even though the
   // current degradataion preference is disabled.
@@ -687,7 +691,7 @@
 
   // After switching back to MAINTAIN_FRAMERATE, the next most limited settings
   // are restored.
-  processor_->OnDegradationPreferenceUpdated(
+  video_stream_adapter_->SetDegradationPreference(
       DegradationPreference::MAINTAIN_FRAMERATE);
   EXPECT_EQ(next_limited_restrictions, restrictions_listener_.restrictions());
   EXPECT_EQ(next_limited_counters,
@@ -699,7 +703,7 @@
 
 TEST_F(ResourceAdaptationProcessorTest,
        RemovedResourceSignalsIgnoredByProcessor) {
-  processor_->OnDegradationPreferenceUpdated(
+  video_stream_adapter_->SetDegradationPreference(
       DegradationPreference::MAINTAIN_FRAMERATE);
   SetInputStates(true, kDefaultFrameRate, kDefaultFrameSize);
 
@@ -713,7 +717,7 @@
 
 TEST_F(ResourceAdaptationProcessorTest,
        RemovingResourceWhenMultipleMostLimtedHasNoEffect) {
-  processor_->OnDegradationPreferenceUpdated(
+  video_stream_adapter_->SetDegradationPreference(
       DegradationPreference::MAINTAIN_FRAMERATE);
   SetInputStates(true, kDefaultFrameRate, kDefaultFrameSize);
 
diff --git a/call/adaptation/video_stream_adapter.cc b/call/adaptation/video_stream_adapter.cc
index 0cc03e4..51433ef 100644
--- a/call/adaptation/video_stream_adapter.cc
+++ b/call/adaptation/video_stream_adapter.cc
@@ -151,6 +151,8 @@
       return "kAwaitingPreviousAdaptation";
     case Status::kInsufficientInput:
       return "kInsufficientInput";
+    case Status::kAdaptationDisabled:
+      return "kAdaptationDisabled";
   }
 }
 
@@ -305,7 +307,6 @@
 
 Adaptation VideoStreamAdapter::GetAdaptationUp() {
   RTC_DCHECK_RUN_ON(&sequence_checker_);
-  RTC_DCHECK_NE(degradation_preference_, DegradationPreference::DISABLED);
   VideoStreamInputState input_state = input_state_provider_->InputState();
   ++adaptation_validation_id_;
   Adaptation adaptation = GetAdaptationUp(input_state);
@@ -348,14 +349,12 @@
       return IncreaseFramerate(input_state, current_restrictions_);
     }
     case DegradationPreference::DISABLED:
-      RTC_NOTREACHED();
-      return Adaptation::Status::kLimitReached;
+      return Adaptation::Status::kAdaptationDisabled;
   }
 }
 
 Adaptation VideoStreamAdapter::GetAdaptationDown() {
   RTC_DCHECK_RUN_ON(&sequence_checker_);
-  RTC_DCHECK_NE(degradation_preference_, DegradationPreference::DISABLED);
   VideoStreamInputState input_state = input_state_provider_->InputState();
   ++adaptation_validation_id_;
   return RestrictionsOrStateToAdaptation(GetAdaptationDownStep(input_state),
@@ -397,8 +396,7 @@
       return DecreaseFramerate(input_state, current_restrictions_);
     }
     case DegradationPreference::DISABLED:
-      RTC_NOTREACHED();
-      return Adaptation::Status::kLimitReached;
+      return Adaptation::Status::kAdaptationDisabled;
   }
 }
 
@@ -526,10 +524,11 @@
   VideoStreamInputState input_state = input_state_provider_->InputState();
   switch (degradation_preference_) {
     case DegradationPreference::DISABLED:
-    case DegradationPreference::MAINTAIN_RESOLUTION: {
-      return Adaptation(adaptation_validation_id_,
-                        Adaptation::Status::kLimitReached, input_state, false);
-    }
+      return RestrictionsOrStateToAdaptation(
+          Adaptation::Status::kAdaptationDisabled, input_state);
+    case DegradationPreference::MAINTAIN_RESOLUTION:
+      return RestrictionsOrStateToAdaptation(Adaptation::Status::kLimitReached,
+                                             input_state);
     case DegradationPreference::MAINTAIN_FRAMERATE:
       return GetAdaptationDown();
     case DegradationPreference::BALANCED: {
diff --git a/call/adaptation/video_stream_adapter.h b/call/adaptation/video_stream_adapter.h
index f9202ea..00a52a9 100644
--- a/call/adaptation/video_stream_adapter.h
+++ b/call/adaptation/video_stream_adapter.h
@@ -74,6 +74,8 @@
     kAwaitingPreviousAdaptation,
     // Not enough input.
     kInsufficientInput,
+    // Adaptation disabled via degradation preference.
+    kAdaptationDisabled,
   };
 
   static const char* StatusToString(Status status);
diff --git a/call/adaptation/video_stream_adapter_unittest.cc b/call/adaptation/video_stream_adapter_unittest.cc
index 99b9e9c..86c53a9 100644
--- a/call/adaptation/video_stream_adapter_unittest.cc
+++ b/call/adaptation/video_stream_adapter_unittest.cc
@@ -794,15 +794,14 @@
   EXPECT_EQ(0, adaptation.counters().fps_adaptations);
 }
 
-TEST_F(
-    VideoStreamAdapterTest,
-    GetAdaptDownResolutionReturnsLimitReachedInDisabledAndMaintainResolution) {
+TEST_F(VideoStreamAdapterTest,
+       GetAdaptDownResolutionReturnsWithStatusInDisabledAndMaintainResolution) {
   adapter_.SetDegradationPreference(DegradationPreference::DISABLED);
   input_state_provider_.SetInputState(1280 * 720, 30,
                                       kDefaultMinPixelsPerFrame);
-  EXPECT_EQ(Adaptation::Status::kLimitReached,
+  EXPECT_EQ(Adaptation::Status::kAdaptationDisabled,
             adapter_.GetAdaptDownResolution().status());
-  adapter_.SetDegradationPreference(DegradationPreference::DISABLED);
+  adapter_.SetDegradationPreference(DegradationPreference::MAINTAIN_RESOLUTION);
   EXPECT_EQ(Adaptation::Status::kLimitReached,
             adapter_.GetAdaptDownResolution().status());
 }
@@ -858,6 +857,19 @@
   EXPECT_EQ(1, adaptation.counters().fps_adaptations);
 }
 
+TEST_F(VideoStreamAdapterTest,
+       AdaptationDisabledStatusAlwaysWhenDegradationPreferenceDisabled) {
+  adapter_.SetDegradationPreference(DegradationPreference::DISABLED);
+  input_state_provider_.SetInputState(1280 * 720, 30,
+                                      kDefaultMinPixelsPerFrame);
+  EXPECT_EQ(Adaptation::Status::kAdaptationDisabled,
+            adapter_.GetAdaptationDown().status());
+  EXPECT_EQ(Adaptation::Status::kAdaptationDisabled,
+            adapter_.GetAdaptationUp().status());
+  EXPECT_EQ(Adaptation::Status::kAdaptationDisabled,
+            adapter_.GetAdaptDownResolution().status());
+}
+
 // Death tests.
 // Disabled on Android because death tests misbehave on Android, see
 // base/test/gtest_util.h.
diff --git a/video/video_stream_encoder.cc b/video/video_stream_encoder.cc
index f9997f3..2e9f5da 100644
--- a/video/video_stream_encoder.cc
+++ b/video/video_stream_encoder.cc
@@ -19,6 +19,8 @@
 
 #include "absl/algorithm/container.h"
 #include "absl/types/optional.h"
+#include "api/task_queue/queued_task.h"
+#include "api/task_queue/task_queue_base.h"
 #include "api/video/encoded_image.h"
 #include "api/video/i420_buffer.h"
 #include "api/video/video_adaptation_reason.h"
@@ -26,15 +28,19 @@
 #include "api/video/video_codec_constants.h"
 #include "api/video_codecs/video_encoder.h"
 #include "call/adaptation/resource_adaptation_processor.h"
+#include "call/adaptation/video_stream_adapter.h"
 #include "modules/video_coding/codecs/vp9/svc_rate_allocator.h"
 #include "modules/video_coding/include/video_codec_initializer.h"
 #include "rtc_base/arraysize.h"
 #include "rtc_base/checks.h"
+#include "rtc_base/constructor_magic.h"
 #include "rtc_base/experiments/alr_experiment.h"
 #include "rtc_base/experiments/rate_control_settings.h"
 #include "rtc_base/location.h"
 #include "rtc_base/logging.h"
 #include "rtc_base/strings/string_builder.h"
+#include "rtc_base/synchronization/sequence_checker.h"
+#include "rtc_base/thread_annotations.h"
 #include "rtc_base/time_utils.h"
 #include "rtc_base/trace_event.h"
 #include "system_wrappers/include/field_trial.h"
@@ -209,7 +215,9 @@
         is_screenshare_(false),
         effective_degradation_preference_(DegradationPreference::DISABLED) {}
 
-  ~DegradationPreferenceManager() override { RTC_DCHECK(listeners_.empty()); }
+  ~DegradationPreferenceManager() override {
+    RTC_DCHECK(!video_stream_adapter_);
+  }
 
   DegradationPreference degradation_preference() const override {
     rtc::CritScope crit(&lock_);
@@ -228,17 +236,17 @@
     MaybeUpdateEffectiveDegradationPreference();
   }
 
-  void AddListener(DegradationPreferenceListener* listener) {
-    rtc::CritScope crit(&lock_);
-    RTC_DCHECK(absl::c_find(listeners_, listener) == listeners_.end());
-    listeners_.push_back(listener);
+  void SetVideoStreamAdapterQueue(
+      TaskQueueBase* video_stream_adapter_task_queue) {
+    RTC_DCHECK(!video_stream_adapter_task_queue_);
+    RTC_DCHECK(video_stream_adapter_task_queue);
+    RTC_DCHECK_RUN_ON(video_stream_adapter_task_queue);
+    video_stream_adapter_task_queue_ = video_stream_adapter_task_queue;
   }
 
-  void RemoveListener(DegradationPreferenceListener* listener) {
-    rtc::CritScope crit(&lock_);
-    auto it = absl::c_find(listeners_, listener);
-    RTC_DCHECK(it != listeners_.end());
-    listeners_.erase(it);
+  void SetVideoStreamAdapter(VideoStreamAdapter* video_stream_adapter) {
+    RTC_DCHECK_RUN_ON(video_stream_adapter_task_queue_);
+    video_stream_adapter_ = video_stream_adapter;
   }
 
  private:
@@ -252,9 +260,15 @@
 
     if (effective_degradation_preference != effective_degradation_preference_) {
       effective_degradation_preference_ = effective_degradation_preference;
-      for (auto& listener : listeners_) {
-        listener->OnDegradationPreferenceUpdated(
-            effective_degradation_preference_);
+      if (video_stream_adapter_task_queue_) {
+        video_stream_adapter_task_queue_->PostTask(
+            ToQueuedTask([this, effective_degradation_preference]() {
+              RTC_DCHECK_RUN_ON(video_stream_adapter_task_queue_);
+              if (video_stream_adapter_) {
+                video_stream_adapter_->SetDegradationPreference(
+                    effective_degradation_preference);
+              }
+            }));
       }
     }
   }
@@ -264,7 +278,9 @@
   bool is_screenshare_ RTC_GUARDED_BY(&lock_);
   DegradationPreference effective_degradation_preference_
       RTC_GUARDED_BY(&lock_);
-  std::vector<DegradationPreferenceListener*> listeners_ RTC_GUARDED_BY(&lock_);
+  TaskQueueBase* video_stream_adapter_task_queue_ = nullptr;
+  VideoStreamAdapter* video_stream_adapter_
+      RTC_GUARDED_BY(&video_stream_adapter_task_queue_);
 };
 
 VideoStreamEncoder::VideoStreamEncoder(
@@ -363,8 +379,10 @@
         &stream_resource_manager_);
     video_stream_adapter_->AddRestrictionsListener(&stream_resource_manager_);
     video_stream_adapter_->AddRestrictionsListener(this);
-    degradation_preference_manager_->AddListener(
-        resource_adaptation_processor_.get());
+    degradation_preference_manager_->SetVideoStreamAdapterQueue(
+        resource_adaptation_queue_.Get());
+    degradation_preference_manager_->SetVideoStreamAdapter(
+        video_stream_adapter_.get());
 
     // Add the stream resource manager's resources to the processor.
     adaptation_constraints_ = stream_resource_manager_.AdaptationConstraints();
@@ -413,8 +431,7 @@
       resource_adaptation_processor_->RemoveResourceLimitationsListener(
           &stream_resource_manager_);
       stream_resource_manager_.SetAdaptationProcessor(nullptr, nullptr);
-      degradation_preference_manager_->RemoveListener(
-          resource_adaptation_processor_.get());
+      degradation_preference_manager_->SetVideoStreamAdapter(nullptr);
       resource_adaptation_processor_.reset();
     }
     shutdown_adaptation_processor_event.Set();