[Adaptation] Add cooldown mechanism to prevent spammy kUnderuse from QP
This CL adds a 1 second cooldown period for QualityScalerResource to signal kUnderuse due to being disabled. If underuse is signaled every frame, any RTC_LOGging performed by the ResourceAdaptationProcessor would become very spammy. Plus we don't need to adapt every single frame. Bug: webrtc:11616 Change-Id: Id76e5ca39a5e5dac9b71fdab79fb4f3dd5aeab1f Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/176228 Reviewed-by: Ilya Nikolaevskiy <ilnik@webrtc.org> Commit-Queue: Henrik Boström <hbos@webrtc.org> Cr-Commit-Position: refs/heads/master@{#31374}
This commit is contained in:
parent
a4d70a802c
commit
4f7531e368
@ -13,12 +13,20 @@
|
||||
#include <utility>
|
||||
|
||||
#include "rtc_base/experiments/balanced_degradation_settings.h"
|
||||
#include "rtc_base/time_utils.h"
|
||||
|
||||
namespace webrtc {
|
||||
|
||||
namespace {
|
||||
|
||||
const int64_t kUnderuseDueToDisabledCooldownMs = 1000;
|
||||
|
||||
} // namespace
|
||||
|
||||
QualityScalerResource::QualityScalerResource()
|
||||
: rtc::RefCountedObject<Resource>(),
|
||||
quality_scaler_(nullptr),
|
||||
last_underuse_due_to_disabled_timestamp_ms_(absl::nullopt),
|
||||
num_handled_callbacks_(0),
|
||||
pending_callbacks_(),
|
||||
adaptation_processor_(nullptr),
|
||||
@ -82,11 +90,18 @@ void QualityScalerResource::OnEncodeCompleted(const EncodedImage& encoded_image,
|
||||
// mid call.
|
||||
// Instead it should be done at a higher layer in the same way for all
|
||||
// resources.
|
||||
resource_adaptation_queue()->PostTask(
|
||||
[this_ref = rtc::scoped_refptr<QualityScalerResource>(this)] {
|
||||
RTC_DCHECK_RUN_ON(this_ref->resource_adaptation_queue());
|
||||
this_ref->OnResourceUsageStateMeasured(ResourceUsageState::kUnderuse);
|
||||
});
|
||||
int64_t timestamp_ms = rtc::TimeMillis();
|
||||
if (!last_underuse_due_to_disabled_timestamp_ms_.has_value() ||
|
||||
timestamp_ms - last_underuse_due_to_disabled_timestamp_ms_.value() >=
|
||||
kUnderuseDueToDisabledCooldownMs) {
|
||||
last_underuse_due_to_disabled_timestamp_ms_ = timestamp_ms;
|
||||
resource_adaptation_queue()->PostTask(
|
||||
[this_ref = rtc::scoped_refptr<QualityScalerResource>(this)] {
|
||||
RTC_DCHECK_RUN_ON(this_ref->resource_adaptation_queue());
|
||||
this_ref->OnResourceUsageStateMeasured(
|
||||
ResourceUsageState::kUnderuse);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -15,6 +15,7 @@
|
||||
#include <queue>
|
||||
#include <string>
|
||||
|
||||
#include "absl/types/optional.h"
|
||||
#include "api/video/video_adaptation_reason.h"
|
||||
#include "api/video_codecs/video_encoder.h"
|
||||
#include "call/adaptation/resource.h"
|
||||
@ -74,6 +75,11 @@ class QualityScalerResource : public rtc::RefCountedObject<Resource>,
|
||||
// Members accessed on the encoder queue.
|
||||
std::unique_ptr<QualityScaler> quality_scaler_
|
||||
RTC_GUARDED_BY(encoder_queue());
|
||||
// The timestamp of the last time we reported underuse because this resource
|
||||
// was disabled in order to prevent getting stuck with QP adaptations. Used to
|
||||
// make sure underuse reporting is not too spammy.
|
||||
absl::optional<int64_t> last_underuse_due_to_disabled_timestamp_ms_
|
||||
RTC_GUARDED_BY(encoder_queue());
|
||||
// Every OnReportQpUsageHigh/Low() operation has a callback that MUST be
|
||||
// invoked on the |encoder_queue_|. Because usage measurements are reported on
|
||||
// the |encoder_queue_| but handled by the processor on the the
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user