Add DesktopCapturer GetSourceList SelectSource FocusOnSelectedSource functions
I have chosen part of 2435603010 changes to compose this change. According to the discussion we have made in previous change, this CL contains, 1. Source structure to represent a source of a DesktopCapturer. 2. GetSourceList / SelectSource / FocusOnSelectedSource functions in DesktopCapturer. 3. ScreenCapturer and WindowCapturer forward corresponding functions to the new DesktopCapturer APIs. After this change, We can remove WindowCapturer & ScreenCapturer references from Chromium, and use the new APIs. BUG=webrtc:6513 Review-Url: https://codereview.webrtc.org/2452263003 Cr-Commit-Position: refs/heads/master@{#14830}
This commit is contained in:
@ -61,6 +61,7 @@ rtc_static_library("desktop_capture") {
|
|||||||
"desktop_and_cursor_composer.h",
|
"desktop_and_cursor_composer.h",
|
||||||
"desktop_capture_options.cc",
|
"desktop_capture_options.cc",
|
||||||
"desktop_capture_options.h",
|
"desktop_capture_options.h",
|
||||||
|
"desktop_capturer.cc",
|
||||||
"desktop_capturer.h",
|
"desktop_capturer.h",
|
||||||
"desktop_frame_win.cc",
|
"desktop_frame_win.cc",
|
||||||
"desktop_frame_win.h",
|
"desktop_frame_win.h",
|
||||||
@ -80,6 +81,7 @@ rtc_static_library("desktop_capture") {
|
|||||||
"mouse_cursor_monitor_mac.mm",
|
"mouse_cursor_monitor_mac.mm",
|
||||||
"mouse_cursor_monitor_win.cc",
|
"mouse_cursor_monitor_win.cc",
|
||||||
"screen_capture_frame_queue.h",
|
"screen_capture_frame_queue.h",
|
||||||
|
"screen_capturer.cc",
|
||||||
"screen_capturer.h",
|
"screen_capturer.h",
|
||||||
"screen_capturer_helper.cc",
|
"screen_capturer_helper.cc",
|
||||||
"screen_capturer_helper.h",
|
"screen_capturer_helper.h",
|
||||||
@ -118,6 +120,7 @@ rtc_static_library("desktop_capture") {
|
|||||||
"win/screen_capturer_win_magnifier.h",
|
"win/screen_capturer_win_magnifier.h",
|
||||||
"win/window_capture_utils.cc",
|
"win/window_capture_utils.cc",
|
||||||
"win/window_capture_utils.h",
|
"win/window_capture_utils.h",
|
||||||
|
"window_capturer.cc",
|
||||||
"window_capturer.h",
|
"window_capturer.h",
|
||||||
"window_capturer_mac.mm",
|
"window_capturer_mac.mm",
|
||||||
"window_capturer_win.cc",
|
"window_capturer_win.cc",
|
||||||
|
|||||||
@ -39,6 +39,7 @@
|
|||||||
'desktop_and_cursor_composer.h',
|
'desktop_and_cursor_composer.h',
|
||||||
'desktop_capture_options.h',
|
'desktop_capture_options.h',
|
||||||
'desktop_capture_options.cc',
|
'desktop_capture_options.cc',
|
||||||
|
'desktop_capturer.cc',
|
||||||
'desktop_capturer.h',
|
'desktop_capturer.h',
|
||||||
'desktop_frame_win.cc',
|
'desktop_frame_win.cc',
|
||||||
'desktop_frame_win.h',
|
'desktop_frame_win.h',
|
||||||
|
|||||||
37
webrtc/modules/desktop_capture/desktop_capturer.cc
Normal file
37
webrtc/modules/desktop_capture/desktop_capturer.cc
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
* 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/desktop_capturer.h"
|
||||||
|
|
||||||
|
#include "webrtc/modules/desktop_capture/desktop_capture_options.h"
|
||||||
|
#include "webrtc/modules/desktop_capture/screen_capturer_differ_wrapper.h"
|
||||||
|
|
||||||
|
namespace webrtc {
|
||||||
|
|
||||||
|
DesktopCapturer::~DesktopCapturer() = default;
|
||||||
|
|
||||||
|
void DesktopCapturer::SetSharedMemoryFactory(
|
||||||
|
std::unique_ptr<SharedMemoryFactory> shared_memory_factory) {}
|
||||||
|
|
||||||
|
void DesktopCapturer::SetExcludedWindow(WindowId window) {}
|
||||||
|
|
||||||
|
bool DesktopCapturer::GetSourceList(SourceList* sources) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DesktopCapturer::SelectSource(SourceId id) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DesktopCapturer::FocusOnSelectedSource() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace webrtc
|
||||||
@ -12,8 +12,11 @@
|
|||||||
#define WEBRTC_MODULES_DESKTOP_CAPTURE_DESKTOP_CAPTURER_H_
|
#define WEBRTC_MODULES_DESKTOP_CAPTURE_DESKTOP_CAPTURER_H_
|
||||||
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include "webrtc/modules/desktop_capture/desktop_frame.h"
|
#include "webrtc/modules/desktop_capture/desktop_frame.h"
|
||||||
#include "webrtc/modules/desktop_capture/desktop_capture_types.h"
|
#include "webrtc/modules/desktop_capture/desktop_capture_types.h"
|
||||||
@ -21,6 +24,7 @@
|
|||||||
|
|
||||||
namespace webrtc {
|
namespace webrtc {
|
||||||
|
|
||||||
|
class DesktopCaptureOptions;
|
||||||
class DesktopFrame;
|
class DesktopFrame;
|
||||||
|
|
||||||
// Abstract interface for screen and window capturers.
|
// Abstract interface for screen and window capturers.
|
||||||
@ -53,7 +57,20 @@ class DesktopCapturer {
|
|||||||
virtual ~Callback() {}
|
virtual ~Callback() {}
|
||||||
};
|
};
|
||||||
|
|
||||||
virtual ~DesktopCapturer() {}
|
typedef intptr_t SourceId;
|
||||||
|
|
||||||
|
struct Source {
|
||||||
|
// The unique id to represent a Source of current DesktopCapturer.
|
||||||
|
SourceId id;
|
||||||
|
|
||||||
|
// Title of the window or screen in UTF-8 encoding, maybe empty. This field
|
||||||
|
// should not be used to identify a source.
|
||||||
|
std::string title;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef std::vector<Source> SourceList;
|
||||||
|
|
||||||
|
virtual ~DesktopCapturer();
|
||||||
|
|
||||||
// Called at the beginning of a capturing session. |callback| must remain
|
// Called at the beginning of a capturing session. |callback| must remain
|
||||||
// valid until capturer is destroyed.
|
// valid until capturer is destroyed.
|
||||||
@ -65,7 +82,7 @@ class DesktopCapturer {
|
|||||||
// Shared memory is currently supported only by some DesktopCapturer
|
// Shared memory is currently supported only by some DesktopCapturer
|
||||||
// implementations.
|
// implementations.
|
||||||
virtual void SetSharedMemoryFactory(
|
virtual void SetSharedMemoryFactory(
|
||||||
std::unique_ptr<SharedMemoryFactory> shared_memory_factory) {}
|
std::unique_ptr<SharedMemoryFactory> shared_memory_factory);
|
||||||
|
|
||||||
// Captures next frame, and involve callback provided by Start() function.
|
// Captures next frame, and involve callback provided by Start() function.
|
||||||
// Pending capture requests are canceled when DesktopCapturer is deleted.
|
// Pending capture requests are canceled when DesktopCapturer is deleted.
|
||||||
@ -74,7 +91,25 @@ class DesktopCapturer {
|
|||||||
// Sets the window to be excluded from the captured image in the future
|
// Sets the window to be excluded from the captured image in the future
|
||||||
// Capture calls. Used to exclude the screenshare notification window for
|
// Capture calls. Used to exclude the screenshare notification window for
|
||||||
// screen capturing.
|
// screen capturing.
|
||||||
virtual void SetExcludedWindow(WindowId window) {}
|
virtual void SetExcludedWindow(WindowId window);
|
||||||
|
|
||||||
|
// TODO(zijiehe): Following functions should be pure virtual. The default
|
||||||
|
// implementations are for backward compatibility only. Remove default
|
||||||
|
// implementations once all DesktopCapturer implementations in Chromium have
|
||||||
|
// implemented these functions.
|
||||||
|
|
||||||
|
// Gets a list of sources current capturer supports. Returns false in case of
|
||||||
|
// a failure.
|
||||||
|
virtual bool GetSourceList(SourceList* sources);
|
||||||
|
|
||||||
|
// Selects a source to be captured. Returns false in case of a failure (e.g.
|
||||||
|
// if there is no source with the specified type and id.)
|
||||||
|
virtual bool SelectSource(SourceId id);
|
||||||
|
|
||||||
|
// Brings the selected source to the front and sets the input focus on it.
|
||||||
|
// Returns false in case of a failure or no source has been selected or the
|
||||||
|
// implementation does not support this functionality.
|
||||||
|
virtual bool FocusOnSelectedSource();
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace webrtc
|
} // namespace webrtc
|
||||||
|
|||||||
53
webrtc/modules/desktop_capture/screen_capturer.cc
Normal file
53
webrtc/modules/desktop_capture/screen_capturer.cc
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
/*
|
||||||
|
* 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/screen_capturer.h"
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
|
namespace webrtc {
|
||||||
|
|
||||||
|
ScreenCapturer::~ScreenCapturer() = default;
|
||||||
|
|
||||||
|
bool ScreenCapturer::GetScreenList(ScreenList* screens) {
|
||||||
|
SourceList sources;
|
||||||
|
if (!GetSourceList(&sources)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const Source& source : sources) {
|
||||||
|
screens->push_back({source.id});
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ScreenCapturer::SelectScreen(ScreenId id) {
|
||||||
|
return SelectSource(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ScreenCapturer::GetSourceList(SourceList* sources) {
|
||||||
|
ScreenList screens;
|
||||||
|
if (!GetScreenList(&screens)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const Screen& screen : screens) {
|
||||||
|
sources->push_back({screen.id});
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ScreenCapturer::SelectSource(SourceId id) {
|
||||||
|
return SelectScreen(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace webrtc
|
||||||
@ -21,6 +21,7 @@ namespace webrtc {
|
|||||||
|
|
||||||
class DesktopCaptureOptions;
|
class DesktopCaptureOptions;
|
||||||
|
|
||||||
|
// TODO(zijiehe): Remove this class.
|
||||||
// Class used to capture video frames asynchronously.
|
// Class used to capture video frames asynchronously.
|
||||||
//
|
//
|
||||||
// The full capture sequence is as follows:
|
// The full capture sequence is as follows:
|
||||||
@ -48,19 +49,25 @@ class ScreenCapturer : public DesktopCapturer {
|
|||||||
};
|
};
|
||||||
typedef std::vector<Screen> ScreenList;
|
typedef std::vector<Screen> ScreenList;
|
||||||
|
|
||||||
~ScreenCapturer() override {}
|
~ScreenCapturer() override;
|
||||||
|
|
||||||
// Creates a platform-specific capturer.
|
// Creates a platform-specific capturer.
|
||||||
static ScreenCapturer* Create(const DesktopCaptureOptions& options);
|
static ScreenCapturer* Create(const DesktopCaptureOptions& options);
|
||||||
|
|
||||||
|
// Deprecated, use GetSourceList().
|
||||||
// Get the list of screens (not containing kFullDesktopScreenId). Returns
|
// Get the list of screens (not containing kFullDesktopScreenId). Returns
|
||||||
// false in case of a failure.
|
// false in case of a failure.
|
||||||
virtual bool GetScreenList(ScreenList* screens) = 0;
|
virtual bool GetScreenList(ScreenList* screens);
|
||||||
|
|
||||||
|
// Deprecated, use SelectSource().
|
||||||
// Select the screen to be captured. Returns false in case of a failure (e.g.
|
// Select the screen to be captured. Returns false in case of a failure (e.g.
|
||||||
// if there is no screen with the specified id). If this is never called, the
|
// if there is no screen with the specified id). If this is never called, the
|
||||||
// full desktop is captured.
|
// full desktop is captured.
|
||||||
virtual bool SelectScreen(ScreenId id) = 0;
|
virtual bool SelectScreen(ScreenId id);
|
||||||
|
|
||||||
|
// DesktopCapturer interfaces.
|
||||||
|
bool GetSourceList(SourceList* sources) override;
|
||||||
|
bool SelectSource(SourceId id) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace webrtc
|
} // namespace webrtc
|
||||||
|
|||||||
61
webrtc/modules/desktop_capture/window_capturer.cc
Normal file
61
webrtc/modules/desktop_capture/window_capturer.cc
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
/*
|
||||||
|
* 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/window_capturer.h"
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
|
namespace webrtc {
|
||||||
|
|
||||||
|
WindowCapturer::~WindowCapturer() = default;
|
||||||
|
|
||||||
|
bool WindowCapturer::GetWindowList(WindowList* windows) {
|
||||||
|
SourceList sources;
|
||||||
|
if (!GetSourceList(&sources)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const Source& source : sources) {
|
||||||
|
windows->push_back({source.id, std::move(source.title)});
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool WindowCapturer::SelectWindow(WindowId id) {
|
||||||
|
return SelectSource(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool WindowCapturer::BringSelectedWindowToFront() {
|
||||||
|
return FocusOnSelectedSource();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool WindowCapturer::GetSourceList(SourceList* sources) {
|
||||||
|
WindowList windows;
|
||||||
|
if (!GetWindowList(&windows)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const Window& window : windows) {
|
||||||
|
sources->push_back({window.id, std::move(window.title)});
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool WindowCapturer::SelectSource(SourceId id) {
|
||||||
|
return SelectWindow(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool WindowCapturer::FocusOnSelectedSource() {
|
||||||
|
return BringSelectedWindowToFront();
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace webrtc
|
||||||
@ -23,10 +23,9 @@ namespace webrtc {
|
|||||||
|
|
||||||
class DesktopCaptureOptions;
|
class DesktopCaptureOptions;
|
||||||
|
|
||||||
|
// TODO(zijiehe): Remove this class.
|
||||||
class WindowCapturer : public DesktopCapturer {
|
class WindowCapturer : public DesktopCapturer {
|
||||||
public:
|
public:
|
||||||
typedef webrtc::WindowId WindowId;
|
|
||||||
|
|
||||||
struct Window {
|
struct Window {
|
||||||
WindowId id;
|
WindowId id;
|
||||||
|
|
||||||
@ -36,20 +35,29 @@ class WindowCapturer : public DesktopCapturer {
|
|||||||
|
|
||||||
typedef std::vector<Window> WindowList;
|
typedef std::vector<Window> WindowList;
|
||||||
|
|
||||||
|
// Consumers should use DesktopCapturer::CreateWindowCapturer.
|
||||||
static WindowCapturer* Create(const DesktopCaptureOptions& options);
|
static WindowCapturer* Create(const DesktopCaptureOptions& options);
|
||||||
|
|
||||||
~WindowCapturer() override {}
|
~WindowCapturer() override;
|
||||||
|
|
||||||
|
// Deprecated, use GetSourceList().
|
||||||
// Get list of windows. Returns false in case of a failure.
|
// Get list of windows. Returns false in case of a failure.
|
||||||
virtual bool GetWindowList(WindowList* windows) = 0;
|
virtual bool GetWindowList(WindowList* windows);
|
||||||
|
|
||||||
|
// Deprecated, use SelectSource().
|
||||||
// Select window to be captured. Returns false in case of a failure (e.g. if
|
// Select window to be captured. Returns false in case of a failure (e.g. if
|
||||||
// there is no window with the specified id).
|
// there is no window with the specified id).
|
||||||
virtual bool SelectWindow(WindowId id) = 0;
|
virtual bool SelectWindow(WindowId id);
|
||||||
|
|
||||||
|
// Deprecated, use FocusOnSelectedSource().
|
||||||
// Bring the selected window to the front. Returns false in case of a
|
// Bring the selected window to the front. Returns false in case of a
|
||||||
// failure or no window selected.
|
// failure or no window selected.
|
||||||
virtual bool BringSelectedWindowToFront() = 0;
|
virtual bool BringSelectedWindowToFront();
|
||||||
|
|
||||||
|
// DesktopCapturer interfaces.
|
||||||
|
bool GetSourceList(SourceList* sources) override;
|
||||||
|
bool SelectSource(SourceId id) override;
|
||||||
|
bool FocusOnSelectedSource() override;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace webrtc
|
} // namespace webrtc
|
||||||
|
|||||||
@ -63,7 +63,7 @@ BOOL CALLBACK WindowsEnumerationHandler(HWND hwnd, LPARAM param) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
WindowCapturer::Window window;
|
WindowCapturer::Window window;
|
||||||
window.id = reinterpret_cast<WindowCapturer::WindowId>(hwnd);
|
window.id = reinterpret_cast<WindowId>(hwnd);
|
||||||
|
|
||||||
const size_t kTitleLength = 500;
|
const size_t kTitleLength = 500;
|
||||||
WCHAR window_title[kTitleLength];
|
WCHAR window_title[kTitleLength];
|
||||||
|
|||||||
Reference in New Issue
Block a user