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/encode_usage_resource.h"
12*d9f75844SAndroid Build Coastguard Worker
13*d9f75844SAndroid Build Coastguard Worker #include <limits>
14*d9f75844SAndroid Build Coastguard Worker #include <utility>
15*d9f75844SAndroid Build Coastguard Worker
16*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/checks.h"
17*d9f75844SAndroid Build Coastguard Worker
18*d9f75844SAndroid Build Coastguard Worker namespace webrtc {
19*d9f75844SAndroid Build Coastguard Worker
20*d9f75844SAndroid Build Coastguard Worker // static
Create(std::unique_ptr<OveruseFrameDetector> overuse_detector)21*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<EncodeUsageResource> EncodeUsageResource::Create(
22*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<OveruseFrameDetector> overuse_detector) {
23*d9f75844SAndroid Build Coastguard Worker return rtc::make_ref_counted<EncodeUsageResource>(
24*d9f75844SAndroid Build Coastguard Worker std::move(overuse_detector));
25*d9f75844SAndroid Build Coastguard Worker }
26*d9f75844SAndroid Build Coastguard Worker
EncodeUsageResource(std::unique_ptr<OveruseFrameDetector> overuse_detector)27*d9f75844SAndroid Build Coastguard Worker EncodeUsageResource::EncodeUsageResource(
28*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<OveruseFrameDetector> overuse_detector)
29*d9f75844SAndroid Build Coastguard Worker : VideoStreamEncoderResource("EncoderUsageResource"),
30*d9f75844SAndroid Build Coastguard Worker overuse_detector_(std::move(overuse_detector)),
31*d9f75844SAndroid Build Coastguard Worker is_started_(false),
32*d9f75844SAndroid Build Coastguard Worker target_frame_rate_(absl::nullopt) {
33*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK(overuse_detector_);
34*d9f75844SAndroid Build Coastguard Worker }
35*d9f75844SAndroid Build Coastguard Worker
~EncodeUsageResource()36*d9f75844SAndroid Build Coastguard Worker EncodeUsageResource::~EncodeUsageResource() {}
37*d9f75844SAndroid Build Coastguard Worker
is_started() const38*d9f75844SAndroid Build Coastguard Worker bool EncodeUsageResource::is_started() const {
39*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_RUN_ON(encoder_queue());
40*d9f75844SAndroid Build Coastguard Worker return is_started_;
41*d9f75844SAndroid Build Coastguard Worker }
42*d9f75844SAndroid Build Coastguard Worker
StartCheckForOveruse(CpuOveruseOptions options)43*d9f75844SAndroid Build Coastguard Worker void EncodeUsageResource::StartCheckForOveruse(CpuOveruseOptions options) {
44*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_RUN_ON(encoder_queue());
45*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK(!is_started_);
46*d9f75844SAndroid Build Coastguard Worker overuse_detector_->StartCheckForOveruse(TaskQueueBase::Current(),
47*d9f75844SAndroid Build Coastguard Worker std::move(options), this);
48*d9f75844SAndroid Build Coastguard Worker is_started_ = true;
49*d9f75844SAndroid Build Coastguard Worker overuse_detector_->OnTargetFramerateUpdated(TargetFrameRateAsInt());
50*d9f75844SAndroid Build Coastguard Worker }
51*d9f75844SAndroid Build Coastguard Worker
StopCheckForOveruse()52*d9f75844SAndroid Build Coastguard Worker void EncodeUsageResource::StopCheckForOveruse() {
53*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_RUN_ON(encoder_queue());
54*d9f75844SAndroid Build Coastguard Worker overuse_detector_->StopCheckForOveruse();
55*d9f75844SAndroid Build Coastguard Worker is_started_ = false;
56*d9f75844SAndroid Build Coastguard Worker }
57*d9f75844SAndroid Build Coastguard Worker
SetTargetFrameRate(absl::optional<double> target_frame_rate)58*d9f75844SAndroid Build Coastguard Worker void EncodeUsageResource::SetTargetFrameRate(
59*d9f75844SAndroid Build Coastguard Worker absl::optional<double> target_frame_rate) {
60*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_RUN_ON(encoder_queue());
61*d9f75844SAndroid Build Coastguard Worker if (target_frame_rate == target_frame_rate_)
62*d9f75844SAndroid Build Coastguard Worker return;
63*d9f75844SAndroid Build Coastguard Worker target_frame_rate_ = target_frame_rate;
64*d9f75844SAndroid Build Coastguard Worker if (is_started_)
65*d9f75844SAndroid Build Coastguard Worker overuse_detector_->OnTargetFramerateUpdated(TargetFrameRateAsInt());
66*d9f75844SAndroid Build Coastguard Worker }
67*d9f75844SAndroid Build Coastguard Worker
OnEncodeStarted(const VideoFrame & cropped_frame,int64_t time_when_first_seen_us)68*d9f75844SAndroid Build Coastguard Worker void EncodeUsageResource::OnEncodeStarted(const VideoFrame& cropped_frame,
69*d9f75844SAndroid Build Coastguard Worker int64_t time_when_first_seen_us) {
70*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_RUN_ON(encoder_queue());
71*d9f75844SAndroid Build Coastguard Worker // TODO(hbos): Rename FrameCaptured() to something more appropriate (e.g.
72*d9f75844SAndroid Build Coastguard Worker // "OnEncodeStarted"?) or revise usage.
73*d9f75844SAndroid Build Coastguard Worker overuse_detector_->FrameCaptured(cropped_frame, time_when_first_seen_us);
74*d9f75844SAndroid Build Coastguard Worker }
75*d9f75844SAndroid Build Coastguard Worker
OnEncodeCompleted(uint32_t timestamp,int64_t time_sent_in_us,int64_t capture_time_us,absl::optional<int> encode_duration_us)76*d9f75844SAndroid Build Coastguard Worker void EncodeUsageResource::OnEncodeCompleted(
77*d9f75844SAndroid Build Coastguard Worker uint32_t timestamp,
78*d9f75844SAndroid Build Coastguard Worker int64_t time_sent_in_us,
79*d9f75844SAndroid Build Coastguard Worker int64_t capture_time_us,
80*d9f75844SAndroid Build Coastguard Worker absl::optional<int> encode_duration_us) {
81*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_RUN_ON(encoder_queue());
82*d9f75844SAndroid Build Coastguard Worker // TODO(hbos): Rename FrameSent() to something more appropriate (e.g.
83*d9f75844SAndroid Build Coastguard Worker // "OnEncodeCompleted"?).
84*d9f75844SAndroid Build Coastguard Worker overuse_detector_->FrameSent(timestamp, time_sent_in_us, capture_time_us,
85*d9f75844SAndroid Build Coastguard Worker encode_duration_us);
86*d9f75844SAndroid Build Coastguard Worker }
87*d9f75844SAndroid Build Coastguard Worker
AdaptUp()88*d9f75844SAndroid Build Coastguard Worker void EncodeUsageResource::AdaptUp() {
89*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_RUN_ON(encoder_queue());
90*d9f75844SAndroid Build Coastguard Worker OnResourceUsageStateMeasured(ResourceUsageState::kUnderuse);
91*d9f75844SAndroid Build Coastguard Worker }
92*d9f75844SAndroid Build Coastguard Worker
AdaptDown()93*d9f75844SAndroid Build Coastguard Worker void EncodeUsageResource::AdaptDown() {
94*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_RUN_ON(encoder_queue());
95*d9f75844SAndroid Build Coastguard Worker OnResourceUsageStateMeasured(ResourceUsageState::kOveruse);
96*d9f75844SAndroid Build Coastguard Worker }
97*d9f75844SAndroid Build Coastguard Worker
TargetFrameRateAsInt()98*d9f75844SAndroid Build Coastguard Worker int EncodeUsageResource::TargetFrameRateAsInt() {
99*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_RUN_ON(encoder_queue());
100*d9f75844SAndroid Build Coastguard Worker return target_frame_rate_.has_value()
101*d9f75844SAndroid Build Coastguard Worker ? static_cast<int>(target_frame_rate_.value())
102*d9f75844SAndroid Build Coastguard Worker : std::numeric_limits<int>::max();
103*d9f75844SAndroid Build Coastguard Worker }
104*d9f75844SAndroid Build Coastguard Worker
105*d9f75844SAndroid Build Coastguard Worker } // namespace webrtc
106