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