xref: /aosp_15_r20/external/webrtc/video/adaptation/quality_scaler_resource.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1 /*
2  *  Copyright 2020 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 #include "video/adaptation/quality_scaler_resource.h"
12 
13 #include <utility>
14 
15 #include "rtc_base/checks.h"
16 #include "rtc_base/experiments/balanced_degradation_settings.h"
17 #include "rtc_base/time_utils.h"
18 
19 namespace webrtc {
20 
21 // static
Create()22 rtc::scoped_refptr<QualityScalerResource> QualityScalerResource::Create() {
23   return rtc::make_ref_counted<QualityScalerResource>();
24 }
25 
QualityScalerResource()26 QualityScalerResource::QualityScalerResource()
27     : VideoStreamEncoderResource("QualityScalerResource"),
28       quality_scaler_(nullptr) {}
29 
~QualityScalerResource()30 QualityScalerResource::~QualityScalerResource() {
31   RTC_DCHECK(!quality_scaler_);
32 }
33 
is_started() const34 bool QualityScalerResource::is_started() const {
35   RTC_DCHECK_RUN_ON(encoder_queue());
36   return quality_scaler_.get();
37 }
38 
StartCheckForOveruse(VideoEncoder::QpThresholds qp_thresholds)39 void QualityScalerResource::StartCheckForOveruse(
40     VideoEncoder::QpThresholds qp_thresholds) {
41   RTC_DCHECK_RUN_ON(encoder_queue());
42   RTC_DCHECK(!is_started());
43   quality_scaler_ =
44       std::make_unique<QualityScaler>(this, std::move(qp_thresholds));
45 }
46 
StopCheckForOveruse()47 void QualityScalerResource::StopCheckForOveruse() {
48   RTC_DCHECK_RUN_ON(encoder_queue());
49   RTC_DCHECK(is_started());
50   // Ensure we have no pending callbacks. This makes it safe to destroy the
51   // QualityScaler and even task queues with tasks in-flight.
52   quality_scaler_.reset();
53 }
54 
SetQpThresholds(VideoEncoder::QpThresholds qp_thresholds)55 void QualityScalerResource::SetQpThresholds(
56     VideoEncoder::QpThresholds qp_thresholds) {
57   RTC_DCHECK_RUN_ON(encoder_queue());
58   RTC_DCHECK(is_started());
59   quality_scaler_->SetQpThresholds(std::move(qp_thresholds));
60 }
61 
QpFastFilterLow()62 bool QualityScalerResource::QpFastFilterLow() {
63   RTC_DCHECK_RUN_ON(encoder_queue());
64   RTC_DCHECK(is_started());
65   return quality_scaler_->QpFastFilterLow();
66 }
67 
OnEncodeCompleted(const EncodedImage & encoded_image,int64_t time_sent_in_us)68 void QualityScalerResource::OnEncodeCompleted(const EncodedImage& encoded_image,
69                                               int64_t time_sent_in_us) {
70   RTC_DCHECK_RUN_ON(encoder_queue());
71   if (quality_scaler_ && encoded_image.qp_ >= 0) {
72     quality_scaler_->ReportQp(encoded_image.qp_, time_sent_in_us);
73   }
74 }
75 
OnFrameDropped(EncodedImageCallback::DropReason reason)76 void QualityScalerResource::OnFrameDropped(
77     EncodedImageCallback::DropReason reason) {
78   RTC_DCHECK_RUN_ON(encoder_queue());
79   if (!quality_scaler_)
80     return;
81   switch (reason) {
82     case EncodedImageCallback::DropReason::kDroppedByMediaOptimizations:
83       quality_scaler_->ReportDroppedFrameByMediaOpt();
84       break;
85     case EncodedImageCallback::DropReason::kDroppedByEncoder:
86       quality_scaler_->ReportDroppedFrameByEncoder();
87       break;
88   }
89 }
90 
OnReportQpUsageHigh()91 void QualityScalerResource::OnReportQpUsageHigh() {
92   OnResourceUsageStateMeasured(ResourceUsageState::kOveruse);
93 }
94 
OnReportQpUsageLow()95 void QualityScalerResource::OnReportQpUsageLow() {
96   OnResourceUsageStateMeasured(ResourceUsageState::kUnderuse);
97 }
98 
99 }  // namespace webrtc
100