[Adaptation] Use ResourceAdaptationProcessorInterface* instead of impl.
This replaces references to the ResourceAdaptationProcessor with
references to its interface. This would make it possible to have
alternative implementations or inject fake/mock implementations for
testing.
The VideoStreamAdapter is still responsible for constructing the
ResourceAdaptationProcessor, but beyond construction it is agnostic
towards the implementation.
With this CL, I claim https://crbug.com/webrtc/11222 complete.
TBR=ilnik@webrtc.org
Bug: webrtc:11222
Change-Id: I6e7a73bf1d0b5e97bc694f66180a747b27ffb018
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/174160
Reviewed-by: Henrik Boström <hbos@webrtc.org>
Reviewed-by: Evan Shrubsole <eshr@google.com>
Commit-Queue: Henrik Boström <hbos@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#31148}
diff --git a/call/adaptation/resource_adaptation_processor.h b/call/adaptation/resource_adaptation_processor.h
index 3cd1869..2bf10b9 100644
--- a/call/adaptation/resource_adaptation_processor.h
+++ b/call/adaptation/resource_adaptation_processor.h
@@ -54,14 +54,11 @@
// Triggers OnResourceUnderuse() or OnResourceOveruse().
void OnResourceUsageStateMeasured(const Resource& resource) override;
- // May trigger 1-2 adaptations. It is meant to reduce resolution - useful if a
- // frame was dropped due to its size - but if you look at the implementation
- // you'll find that this is not guaranteed. It could adapt frame rate, which
- // does not address the issue.
- // TODO(hbos): Can we replace this by something which actually satisfies the
- // resolution constraints, or get rid of it altogether?
+ // May trigger 1-2 adaptations. It is meant to reduce resolution but this is
+ // not guaranteed. It may adapt frame rate, which does not address the issue.
+ // TODO(hbos): Can we get rid of this?
void TriggerAdaptationDueToFrameDroppedDueToSize(
- const Resource& reason_resource);
+ const Resource& reason_resource) override;
private:
bool HasSufficientInputForAdaptation(
diff --git a/call/adaptation/resource_adaptation_processor_interface.h b/call/adaptation/resource_adaptation_processor_interface.h
index 89ad903..6984273 100644
--- a/call/adaptation/resource_adaptation_processor_interface.h
+++ b/call/adaptation/resource_adaptation_processor_interface.h
@@ -66,6 +66,15 @@
DegradationPreference degradation_preference) = 0;
virtual void SetIsScreenshare(bool is_screenshare) = 0;
virtual void ResetVideoSourceRestrictions() = 0;
+
+ // May trigger one or more adaptations. It is meant to reduce resolution -
+ // useful if a frame was dropped due to its size - however, the implementation
+ // may not guarantee this (see resource_adaptation_processor.h).
+ // TODO(hbos): This is only part of the interface for backwards-compatiblity
+ // reasons. Can we replace this by something which actually satisfies the
+ // resolution constraints or get rid of it altogether?
+ virtual void TriggerAdaptationDueToFrameDroppedDueToSize(
+ const Resource& reason_resource) = 0;
};
} // namespace webrtc
diff --git a/video/adaptation/quality_scaler_resource.cc b/video/adaptation/quality_scaler_resource.cc
index 3f32fa2..ac35d61 100644
--- a/video/adaptation/quality_scaler_resource.cc
+++ b/video/adaptation/quality_scaler_resource.cc
@@ -12,12 +12,12 @@
#include <utility>
-#include "call/adaptation/resource_adaptation_processor.h"
+#include "rtc_base/experiments/balanced_degradation_settings.h"
namespace webrtc {
QualityScalerResource::QualityScalerResource(
- ResourceAdaptationProcessor* adaptation_processor)
+ ResourceAdaptationProcessorInterface* adaptation_processor)
: adaptation_processor_(adaptation_processor),
quality_scaler_(nullptr),
pending_qp_usage_callback_(nullptr) {}
diff --git a/video/adaptation/quality_scaler_resource.h b/video/adaptation/quality_scaler_resource.h
index 8b9d603..30796c3 100644
--- a/video/adaptation/quality_scaler_resource.h
+++ b/video/adaptation/quality_scaler_resource.h
@@ -17,12 +17,11 @@
#include "api/video/video_adaptation_reason.h"
#include "api/video_codecs/video_encoder.h"
#include "call/adaptation/resource.h"
+#include "call/adaptation/resource_adaptation_processor_interface.h"
#include "modules/video_coding/utility/quality_scaler.h"
namespace webrtc {
-class ResourceAdaptationProcessor;
-
// Handles interaction with the QualityScaler.
// TODO(hbos): Add unittests specific to this class, it is currently only tested
// indirectly by usage in the ResourceAdaptationProcessor (which is only tested
@@ -32,7 +31,7 @@
public QualityScalerQpUsageHandlerInterface {
public:
explicit QualityScalerResource(
- ResourceAdaptationProcessor* adaptation_processor);
+ ResourceAdaptationProcessorInterface* adaptation_processor);
bool is_started() const;
@@ -62,7 +61,7 @@
const Resource& reason_resource) override;
private:
- ResourceAdaptationProcessor* const adaptation_processor_;
+ ResourceAdaptationProcessorInterface* const adaptation_processor_;
std::unique_ptr<QualityScaler> quality_scaler_;
rtc::scoped_refptr<QualityScalerQpUsageHandlerCallbackInterface>
pending_qp_usage_callback_;
diff --git a/video/adaptation/video_stream_encoder_resource_manager.cc b/video/adaptation/video_stream_encoder_resource_manager.cc
index 4d0a04b..b8179d0 100644
--- a/video/adaptation/video_stream_encoder_resource_manager.cc
+++ b/video/adaptation/video_stream_encoder_resource_manager.cc
@@ -240,7 +240,7 @@
VideoStreamEncoderResourceManager::VideoStreamEncoderResourceManager(
VideoStreamInputStateProvider* input_state_provider,
- ResourceAdaptationProcessor* adaptation_processor,
+ ResourceAdaptationProcessorInterface* adaptation_processor,
VideoStreamEncoderObserver* encoder_stats_observer,
Clock* clock,
bool experiment_cpu_load_estimator,
diff --git a/video/adaptation/video_stream_encoder_resource_manager.h b/video/adaptation/video_stream_encoder_resource_manager.h
index 61b1506..d0e5455 100644
--- a/video/adaptation/video_stream_encoder_resource_manager.h
+++ b/video/adaptation/video_stream_encoder_resource_manager.h
@@ -29,7 +29,6 @@
#include "api/video_codecs/video_encoder.h"
#include "api/video_codecs/video_encoder_config.h"
#include "call/adaptation/resource.h"
-#include "call/adaptation/resource_adaptation_processor.h"
#include "call/adaptation/resource_adaptation_processor_interface.h"
#include "call/adaptation/video_stream_adapter.h"
#include "call/adaptation/video_stream_input_state_provider.h"
@@ -62,7 +61,7 @@
public:
VideoStreamEncoderResourceManager(
VideoStreamInputStateProvider* input_state_provider,
- ResourceAdaptationProcessor* adaptation_processor,
+ ResourceAdaptationProcessorInterface* adaptation_processor,
VideoStreamEncoderObserver* encoder_stats_observer,
Clock* clock,
bool experiment_cpu_load_estimator,
@@ -235,7 +234,7 @@
QualityScalerResource quality_scaler_resource_;
VideoStreamInputStateProvider* const input_state_provider_;
- ResourceAdaptationProcessor* const adaptation_processor_;
+ ResourceAdaptationProcessorInterface* const adaptation_processor_;
VideoStreamEncoderObserver* const encoder_stats_observer_;
DegradationPreference degradation_preference_;
diff --git a/video/video_stream_encoder.cc b/video/video_stream_encoder.cc
index 532f2cf..fbd60b8 100644
--- a/video/video_stream_encoder.cc
+++ b/video/video_stream_encoder.cc
@@ -25,6 +25,7 @@
#include "api/video/video_bitrate_allocator_factory.h"
#include "api/video/video_codec_constants.h"
#include "api/video_codecs/video_encoder.h"
+#include "call/adaptation/resource_adaptation_processor.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"
@@ -256,10 +257,12 @@
ParseAutomatincAnimationDetectionFieldTrial()),
encoder_switch_requested_(false),
input_state_provider_(encoder_stats_observer),
- resource_adaptation_processor_(&input_state_provider_,
- encoder_stats_observer),
+ resource_adaptation_processor_(
+ std::make_unique<ResourceAdaptationProcessor>(
+ &input_state_provider_,
+ encoder_stats_observer)),
stream_resource_manager_(&input_state_provider_,
- &resource_adaptation_processor_,
+ resource_adaptation_processor_.get(),
encoder_stats_observer,
clock_,
settings_.experiment_cpu_load_estimator,
@@ -272,13 +275,13 @@
RTC_DCHECK(encoder_stats_observer);
RTC_DCHECK_GE(number_of_cores, 1);
- resource_adaptation_processor_.AddAdaptationListener(
+ resource_adaptation_processor_->AddAdaptationListener(
&stream_resource_manager_);
- resource_adaptation_processor_.AddAdaptationListener(this);
+ resource_adaptation_processor_->AddAdaptationListener(this);
// Add the stream resource manager's resources to the processor.
for (Resource* resource : stream_resource_manager_.MappedResources())
- resource_adaptation_processor_.AddResource(resource);
+ resource_adaptation_processor_->AddResource(resource);
for (auto& state : encoder_buffer_state_)
state.fill(std::numeric_limits<int64_t>::max());
@@ -296,7 +299,7 @@
encoder_queue_.PostTask([this] {
RTC_DCHECK_RUN_ON(&encoder_queue_);
stream_resource_manager_.StopManagedResources();
- resource_adaptation_processor_.StopResourceAdaptation();
+ resource_adaptation_processor_->StopResourceAdaptation();
rate_allocator_ = nullptr;
bitrate_observer_ = nullptr;
ReleaseEncoder();
@@ -336,11 +339,11 @@
encoder_queue_.PostTask([this, source, degradation_preference] {
RTC_DCHECK_RUN_ON(&encoder_queue_);
input_state_provider_.OnHasInputChanged(source);
- resource_adaptation_processor_.SetDegradationPreference(
+ resource_adaptation_processor_->SetDegradationPreference(
degradation_preference);
stream_resource_manager_.SetDegradationPreferences(
- resource_adaptation_processor_.degradation_preference(),
- resource_adaptation_processor_.effective_degradation_preference());
+ resource_adaptation_processor_->degradation_preference(),
+ resource_adaptation_processor_->effective_degradation_preference());
if (encoder_) {
stream_resource_manager_.ConfigureQualityScaler(
encoder_->GetEncoderInfo());
@@ -668,9 +671,9 @@
if (pending_encoder_creation_) {
stream_resource_manager_.StopManagedResources();
- resource_adaptation_processor_.StopResourceAdaptation();
+ resource_adaptation_processor_->StopResourceAdaptation();
stream_resource_manager_.StartEncodeUsageResource();
- resource_adaptation_processor_.StartResourceAdaptation();
+ resource_adaptation_processor_->StartResourceAdaptation();
pending_encoder_creation_ = false;
}
@@ -749,11 +752,11 @@
void VideoStreamEncoder::OnEncoderSettingsChanged() {
EncoderSettings encoder_settings(encoder_->GetEncoderInfo(),
encoder_config_.Copy(), send_codec_);
- resource_adaptation_processor_.SetIsScreenshare(
+ resource_adaptation_processor_->SetIsScreenshare(
encoder_config_.content_type == VideoEncoderConfig::ContentType::kScreen);
stream_resource_manager_.SetDegradationPreferences(
- resource_adaptation_processor_.degradation_preference(),
- resource_adaptation_processor_.effective_degradation_preference());
+ resource_adaptation_processor_->degradation_preference(),
+ resource_adaptation_processor_->effective_degradation_preference());
input_state_provider_.OnEncoderSettingsChanged(encoder_settings);
stream_resource_manager_.SetEncoderSettings(encoder_settings);
}
@@ -1879,7 +1882,7 @@
if (!automatic_animation_detection_experiment_.enabled ||
encoder_config_.content_type !=
VideoEncoderConfig::ContentType::kScreen ||
- resource_adaptation_processor_.degradation_preference() !=
+ resource_adaptation_processor_->degradation_preference() !=
DegradationPreference::BALANCED) {
return;
}
@@ -1947,7 +1950,7 @@
Resource* resource,
VideoAdaptationReason reason) {
stream_resource_manager_.MapResourceToReason(resource, reason);
- resource_adaptation_processor_.AddResource(resource);
+ resource_adaptation_processor_->AddResource(resource);
}
QualityScalerResource*
diff --git a/video/video_stream_encoder.h b/video/video_stream_encoder.h
index 915b0a3..a4a055d 100644
--- a/video/video_stream_encoder.h
+++ b/video/video_stream_encoder.h
@@ -404,8 +404,8 @@
RTC_GUARDED_BY(&encoder_queue_);
// Responsible for adapting input resolution or frame rate to ensure resources
// (e.g. CPU or bandwidth) are not overused.
- ResourceAdaptationProcessor resource_adaptation_processor_
- RTC_GUARDED_BY(&encoder_queue_);
+ std::unique_ptr<ResourceAdaptationProcessorInterface>
+ resource_adaptation_processor_ RTC_GUARDED_BY(&encoder_queue_);
// Handles input, output and stats reporting related to VideoStreamEncoder
// specific resources, such as "encode usage percent" measurements and "QP
// scaling". Also involved with various mitigations such as inital frame