|  | /* | 
|  | *  Copyright (c) 2019 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 "modules/desktop_capture/full_screen_window_detector.h" | 
|  |  | 
|  | #include "modules/desktop_capture/full_screen_application_handler.h" | 
|  | #include "rtc_base/time_utils.h" | 
|  |  | 
|  | namespace webrtc { | 
|  |  | 
|  | FullScreenWindowDetector::FullScreenWindowDetector( | 
|  | ApplicationHandlerFactory application_handler_factory) | 
|  | : application_handler_factory_(application_handler_factory), | 
|  | last_update_time_ms_(0), | 
|  | previous_source_id_(0), | 
|  | no_handler_source_id_(0) {} | 
|  |  | 
|  | DesktopCapturer::SourceId FullScreenWindowDetector::FindFullScreenWindow( | 
|  | DesktopCapturer::SourceId original_source_id) { | 
|  | if (app_handler_ == nullptr || | 
|  | app_handler_->GetSourceId() != original_source_id) { | 
|  | return 0; | 
|  | } | 
|  | return app_handler_->FindFullScreenWindow(window_list_, last_update_time_ms_); | 
|  | } | 
|  |  | 
|  | void FullScreenWindowDetector::UpdateWindowListIfNeeded( | 
|  | DesktopCapturer::SourceId original_source_id, | 
|  | rtc::FunctionView<bool(DesktopCapturer::SourceList*)> get_sources) { | 
|  | const bool skip_update = previous_source_id_ != original_source_id; | 
|  | previous_source_id_ = original_source_id; | 
|  |  | 
|  | // Here is an attempt to avoid redundant creating application handler in case | 
|  | // when an instance of WindowCapturer is used to generate a thumbnail to show | 
|  | // in picker by calling SelectSource and CaptureFrame for every available | 
|  | // source. | 
|  | if (skip_update) { | 
|  | return; | 
|  | } | 
|  |  | 
|  | CreateApplicationHandlerIfNeeded(original_source_id); | 
|  | if (app_handler_ == nullptr) { | 
|  | // There is no FullScreenApplicationHandler specific for | 
|  | // current application | 
|  | return; | 
|  | } | 
|  |  | 
|  | constexpr int64_t kUpdateIntervalMs = 500; | 
|  |  | 
|  | if ((rtc::TimeMillis() - last_update_time_ms_) <= kUpdateIntervalMs) { | 
|  | return; | 
|  | } | 
|  |  | 
|  | DesktopCapturer::SourceList window_list; | 
|  | if (get_sources(&window_list)) { | 
|  | last_update_time_ms_ = rtc::TimeMillis(); | 
|  | window_list_.swap(window_list); | 
|  | } | 
|  | } | 
|  |  | 
|  | void FullScreenWindowDetector::CreateApplicationHandlerIfNeeded( | 
|  | DesktopCapturer::SourceId source_id) { | 
|  | if (no_handler_source_id_ == source_id) { | 
|  | return; | 
|  | } | 
|  |  | 
|  | if (app_handler_ == nullptr || app_handler_->GetSourceId() != source_id) { | 
|  | app_handler_ = application_handler_factory_ | 
|  | ? application_handler_factory_(source_id) | 
|  | : nullptr; | 
|  | } | 
|  |  | 
|  | if (app_handler_ == nullptr) { | 
|  | no_handler_source_id_ = source_id; | 
|  | } | 
|  | } | 
|  |  | 
|  | }  // namespace webrtc |