FallbackDesktopCapturerWrapper is a DesktopCapturer implementation, which owns two DesktopCapturer implementations. If the main DesktopCapturer fails, it uses the secondary capturer. The logic is now used in ScreenCapturerWinMagnifier, and it can also be shared in ScreenCapturerWinDirectx to fallback to Gdi capturer on privilege prompt or login screen. BUG=684937 Review-Url: https://codereview.webrtc.org/2697453002 Cr-Commit-Position: refs/heads/master@{#16677}
82 lines
2.4 KiB
C++
82 lines
2.4 KiB
C++
/*
|
|
* Copyright (c) 2016 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/fake_desktop_capturer.h"
|
|
|
|
#include <utility>
|
|
|
|
namespace webrtc {
|
|
|
|
FakeDesktopCapturer::FakeDesktopCapturer() = default;
|
|
FakeDesktopCapturer::~FakeDesktopCapturer() = default;
|
|
|
|
void FakeDesktopCapturer::set_result(DesktopCapturer::Result result) {
|
|
result_ = result;
|
|
}
|
|
|
|
int FakeDesktopCapturer::num_frames_captured() const {
|
|
return num_frames_captured_;
|
|
}
|
|
|
|
int FakeDesktopCapturer::num_capture_attempts() const {
|
|
return num_capture_attempts_;
|
|
}
|
|
|
|
// Uses the |generator| provided as DesktopFrameGenerator, FakeDesktopCapturer
|
|
// does
|
|
// not take the ownership of |generator|.
|
|
void FakeDesktopCapturer::set_frame_generator(
|
|
DesktopFrameGenerator* generator) {
|
|
generator_ = generator;
|
|
}
|
|
|
|
void FakeDesktopCapturer::Start(DesktopCapturer::Callback* callback) {
|
|
callback_ = callback;
|
|
}
|
|
|
|
void FakeDesktopCapturer::CaptureFrame() {
|
|
num_capture_attempts_++;
|
|
if (generator_) {
|
|
if (result_ != DesktopCapturer::Result::SUCCESS) {
|
|
callback_->OnCaptureResult(result_, nullptr);
|
|
return;
|
|
}
|
|
|
|
std::unique_ptr<DesktopFrame> frame(
|
|
generator_->GetNextFrame(shared_memory_factory_.get()));
|
|
if (frame) {
|
|
num_frames_captured_++;
|
|
callback_->OnCaptureResult(result_, std::move(frame));
|
|
} else {
|
|
callback_->OnCaptureResult(DesktopCapturer::Result::ERROR_TEMPORARY,
|
|
nullptr);
|
|
}
|
|
return;
|
|
}
|
|
callback_->OnCaptureResult(DesktopCapturer::Result::ERROR_PERMANENT, nullptr);
|
|
}
|
|
|
|
void FakeDesktopCapturer::SetSharedMemoryFactory(
|
|
std::unique_ptr<SharedMemoryFactory> shared_memory_factory) {
|
|
shared_memory_factory_ = std::move(shared_memory_factory);
|
|
}
|
|
|
|
bool FakeDesktopCapturer::GetSourceList(DesktopCapturer::SourceList* sources) {
|
|
sources->push_back({kWindowId, "A-Fake-DesktopCapturer-Window"});
|
|
sources->push_back({kScreenId});
|
|
return true;
|
|
}
|
|
|
|
bool FakeDesktopCapturer::SelectSource(DesktopCapturer::SourceId id) {
|
|
return id == kWindowId || id == kScreenId || id == kFullDesktopScreenId;
|
|
}
|
|
|
|
} // namespace webrtc
|