blob: 50aaeea0308d404c2335438d63c8d03472d0def9 [file] [log] [blame]
/*
* Copyright (c) 2014 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 "webrtc/modules/desktop_capture/cropping_window_capturer.h"
#include "webrtc/modules/desktop_capture/cropped_desktop_frame.h"
#include "webrtc/system_wrappers/include/logging.h"
namespace webrtc {
CroppingWindowCapturer::CroppingWindowCapturer(
const DesktopCaptureOptions& options)
: options_(options),
callback_(NULL),
window_capturer_(WindowCapturer::Create(options)),
selected_window_(kNullWindowId),
excluded_window_(kNullWindowId) {
}
CroppingWindowCapturer::~CroppingWindowCapturer() {}
void CroppingWindowCapturer::Start(DesktopCapturer::Callback* callback) {
callback_ = callback;
window_capturer_->Start(callback);
}
void CroppingWindowCapturer::SetSharedMemoryFactory(
std::unique_ptr<SharedMemoryFactory> shared_memory_factory) {
window_capturer_->SetSharedMemoryFactory(std::move(shared_memory_factory));
}
void CroppingWindowCapturer::Capture(const DesktopRegion& region) {
if (ShouldUseScreenCapturer()) {
if (!screen_capturer_.get()) {
screen_capturer_.reset(ScreenCapturer::Create(options_));
if (excluded_window_) {
screen_capturer_->SetExcludedWindow(excluded_window_);
}
screen_capturer_->Start(this);
}
screen_capturer_->Capture(region);
} else {
window_capturer_->Capture(region);
}
}
void CroppingWindowCapturer::SetExcludedWindow(WindowId window) {
excluded_window_ = window;
if (screen_capturer_.get()) {
screen_capturer_->SetExcludedWindow(window);
}
}
bool CroppingWindowCapturer::GetWindowList(WindowList* windows) {
return window_capturer_->GetWindowList(windows);
}
bool CroppingWindowCapturer::SelectWindow(WindowId id) {
if (window_capturer_->SelectWindow(id)) {
selected_window_ = id;
return true;
}
return false;
}
bool CroppingWindowCapturer::BringSelectedWindowToFront() {
return window_capturer_->BringSelectedWindowToFront();
}
void CroppingWindowCapturer::OnCaptureResult(
DesktopCapturer::Result result,
std::unique_ptr<DesktopFrame> screen_frame) {
if (!ShouldUseScreenCapturer()) {
LOG(LS_INFO) << "Window no longer on top when ScreenCapturer finishes";
window_capturer_->Capture(DesktopRegion());
return;
}
if (result != Result::SUCCESS) {
LOG(LS_WARNING) << "ScreenCapturer failed to capture a frame";
callback_->OnCaptureResult(result, nullptr);
return;
}
DesktopRect window_rect = GetWindowRectInVirtualScreen();
if (window_rect.is_empty()) {
LOG(LS_WARNING) << "Window rect is empty";
callback_->OnCaptureResult(Result::ERROR_TEMPORARY, nullptr);
return;
}
callback_->OnCaptureResult(
Result::SUCCESS,
CreateCroppedDesktopFrame(std::move(screen_frame), window_rect));
}
#if !defined(WEBRTC_WIN)
// static
WindowCapturer*
CroppingWindowCapturer::Create(const DesktopCaptureOptions& options) {
return WindowCapturer::Create(options);
}
#endif
} // namespace webrtc