| /* | |
| * Copyright 2020 The WebRTC Project Authors. All rights reserved. | |
| * | |
| * Use of this source code is governed by a BSD-style license | |
| * that can be found in the LICENSE file in the root of the source | |
| * tree. An additional intellectual property rights grant can be found | |
| * in the file PATENTS. All contributing project authors may | |
| * be found in the AUTHORS file in the root of the source tree. | |
| */ | |
| #include "video/adaptation/encode_usage_resource.h" | |
| #include <cstdint> | |
| #include <limits> | |
| #include <memory> | |
| #include <optional> | |
| #include <utility> | |
| #include "api/adaptation/resource.h" | |
| #include "api/make_ref_counted.h" | |
| #include "api/scoped_refptr.h" | |
| #include "api/sequence_checker.h" | |
| #include "api/task_queue/task_queue_base.h" | |
| #include "api/video/video_frame.h" | |
| #include "rtc_base/checks.h" | |
| #include "video/adaptation/overuse_frame_detector.h" | |
| #include "video/adaptation/video_stream_encoder_resource.h" | |
| namespace webrtc { | |
| // static | |
| scoped_refptr<EncodeUsageResource> EncodeUsageResource::Create( | |
| std::unique_ptr<OveruseFrameDetector> overuse_detector) { | |
| return make_ref_counted<EncodeUsageResource>(std::move(overuse_detector)); | |
| } | |
| EncodeUsageResource::EncodeUsageResource( | |
| std::unique_ptr<OveruseFrameDetector> overuse_detector) | |
| : VideoStreamEncoderResource("EncoderUsageResource"), | |
| overuse_detector_(std::move(overuse_detector)), | |
| is_started_(false), | |
| target_frame_rate_(std::nullopt) { | |
| RTC_DCHECK(overuse_detector_); | |
| } | |
| EncodeUsageResource::~EncodeUsageResource() {} | |
| bool EncodeUsageResource::is_started() const { | |
| RTC_DCHECK_RUN_ON(encoder_queue()); | |
| return is_started_; | |
| } | |
| void EncodeUsageResource::StartCheckForOveruse(CpuOveruseOptions options) { | |
| RTC_DCHECK_RUN_ON(encoder_queue()); | |
| RTC_DCHECK(!is_started_); | |
| overuse_detector_->StartCheckForOveruse(TaskQueueBase::Current(), | |
| std::move(options), this); | |
| is_started_ = true; | |
| overuse_detector_->OnTargetFramerateUpdated(TargetFrameRateAsInt()); | |
| } | |
| void EncodeUsageResource::StopCheckForOveruse() { | |
| RTC_DCHECK_RUN_ON(encoder_queue()); | |
| overuse_detector_->StopCheckForOveruse(); | |
| is_started_ = false; | |
| } | |
| void EncodeUsageResource::SetTargetFrameRate( | |
| std::optional<double> target_frame_rate) { | |
| RTC_DCHECK_RUN_ON(encoder_queue()); | |
| if (target_frame_rate == target_frame_rate_) | |
| return; | |
| target_frame_rate_ = target_frame_rate; | |
| if (is_started_) | |
| overuse_detector_->OnTargetFramerateUpdated(TargetFrameRateAsInt()); | |
| } | |
| void EncodeUsageResource::OnEncodeStarted(const VideoFrame& cropped_frame, | |
| int64_t time_when_first_seen_us) { | |
| RTC_DCHECK_RUN_ON(encoder_queue()); | |
| // TODO(hbos): Rename FrameCaptured() to something more appropriate (e.g. | |
| // "OnEncodeStarted"?) or revise usage. | |
| overuse_detector_->FrameCaptured(cropped_frame, time_when_first_seen_us); | |
| } | |
| void EncodeUsageResource::OnEncodeCompleted( | |
| uint32_t timestamp, | |
| int64_t time_sent_in_us, | |
| int64_t capture_time_us, | |
| std::optional<int> encode_duration_us) { | |
| RTC_DCHECK_RUN_ON(encoder_queue()); | |
| // TODO(hbos): Rename FrameSent() to something more appropriate (e.g. | |
| // "OnEncodeCompleted"?). | |
| overuse_detector_->FrameSent(timestamp, time_sent_in_us, capture_time_us, | |
| encode_duration_us); | |
| } | |
| void EncodeUsageResource::AdaptUp() { | |
| RTC_DCHECK_RUN_ON(encoder_queue()); | |
| OnResourceUsageStateMeasured(ResourceUsageState::kUnderuse); | |
| } | |
| void EncodeUsageResource::AdaptDown() { | |
| RTC_DCHECK_RUN_ON(encoder_queue()); | |
| OnResourceUsageStateMeasured(ResourceUsageState::kOveruse); | |
| } | |
| int EncodeUsageResource::TargetFrameRateAsInt() { | |
| RTC_DCHECK_RUN_ON(encoder_queue()); | |
| return target_frame_rate_.has_value() | |
| ? static_cast<int>(target_frame_rate_.value()) | |
| : std::numeric_limits<int>::max(); | |
| } | |
| } // namespace webrtc |