diff --git a/webrtc/modules/desktop_capture/desktop_capture_types.h b/webrtc/modules/desktop_capture/desktop_capture_types.h index d43ec49919..30adef02a2 100644 --- a/webrtc/modules/desktop_capture/desktop_capture_types.h +++ b/webrtc/modules/desktop_capture/desktop_capture_types.h @@ -26,6 +26,11 @@ typedef intptr_t WindowId; const WindowId kNullWindowId = 0; +typedef int ScreenId; + +// The screen id corresponds to all screen combined together. +const ScreenId kFullDesktopScreenId = -1; + } // namespace webrtc #endif // WEBRTC_MODULES_DESKTOP_CAPTURE_DESKTOP_CAPTURE_TYPES_H_ diff --git a/webrtc/modules/desktop_capture/mouse_cursor_monitor.h b/webrtc/modules/desktop_capture/mouse_cursor_monitor.h index 9785b736b2..24dfe72dfa 100644 --- a/webrtc/modules/desktop_capture/mouse_cursor_monitor.h +++ b/webrtc/modules/desktop_capture/mouse_cursor_monitor.h @@ -69,7 +69,8 @@ class MouseCursorMonitor { // // TODO(sergeyu): Provide a way to select a specific screen. static MouseCursorMonitor* CreateForScreen( - const DesktopCaptureOptions& options); + const DesktopCaptureOptions& options, + ScreenId screen); // Initializes the monitor with the |callback|, which must remain valid until // capturer is destroyed. diff --git a/webrtc/modules/desktop_capture/mouse_cursor_monitor_mac.mm b/webrtc/modules/desktop_capture/mouse_cursor_monitor_mac.mm index 46d2a8d1ee..3007599d81 100644 --- a/webrtc/modules/desktop_capture/mouse_cursor_monitor_mac.mm +++ b/webrtc/modules/desktop_capture/mouse_cursor_monitor_mac.mm @@ -211,7 +211,8 @@ MouseCursorMonitor* MouseCursorMonitor::CreateForWindow( } MouseCursorMonitor* MouseCursorMonitor::CreateForScreen( - const DesktopCaptureOptions& options) { + const DesktopCaptureOptions& options, + ScreenId screen) { return new MouseCursorMonitorMac(kCGNullWindowID); } diff --git a/webrtc/modules/desktop_capture/mouse_cursor_monitor_null.cc b/webrtc/modules/desktop_capture/mouse_cursor_monitor_null.cc index 7aa1b7141d..94a20e113f 100644 --- a/webrtc/modules/desktop_capture/mouse_cursor_monitor_null.cc +++ b/webrtc/modules/desktop_capture/mouse_cursor_monitor_null.cc @@ -21,7 +21,8 @@ MouseCursorMonitor* MouseCursorMonitor::CreateForWindow( } MouseCursorMonitor* MouseCursorMonitor::CreateForScreen( - const DesktopCaptureOptions& options) { + const DesktopCaptureOptions& options, + ScreenId screen) { return NULL; } diff --git a/webrtc/modules/desktop_capture/mouse_cursor_monitor_unittest.cc b/webrtc/modules/desktop_capture/mouse_cursor_monitor_unittest.cc index f91a9aff14..7849005f90 100644 --- a/webrtc/modules/desktop_capture/mouse_cursor_monitor_unittest.cc +++ b/webrtc/modules/desktop_capture/mouse_cursor_monitor_unittest.cc @@ -58,7 +58,7 @@ class MouseCursorMonitorTest : public testing::Test, TEST_F(MouseCursorMonitorTest, MAYBE(FromScreen)) { scoped_ptr capturer(MouseCursorMonitor::CreateForScreen( - DesktopCaptureOptions::CreateDefault())); + DesktopCaptureOptions::CreateDefault(), webrtc::kFullDesktopScreenId)); assert(capturer.get()); capturer->Init(this, MouseCursorMonitor::SHAPE_AND_POSITION); capturer->Capture(); @@ -109,7 +109,7 @@ TEST_F(MouseCursorMonitorTest, MAYBE(FromWindow)) { // Make sure that OnMouseCursorPosition() is not called in the SHAPE_ONLY mode. TEST_F(MouseCursorMonitorTest, MAYBE(ShapeOnly)) { scoped_ptr capturer(MouseCursorMonitor::CreateForScreen( - DesktopCaptureOptions::CreateDefault())); + DesktopCaptureOptions::CreateDefault(), webrtc::kFullDesktopScreenId)); assert(capturer.get()); capturer->Init(this, MouseCursorMonitor::SHAPE_ONLY); capturer->Capture(); diff --git a/webrtc/modules/desktop_capture/mouse_cursor_monitor_win.cc b/webrtc/modules/desktop_capture/mouse_cursor_monitor_win.cc index 82f7d2447f..2f69c414ed 100644 --- a/webrtc/modules/desktop_capture/mouse_cursor_monitor_win.cc +++ b/webrtc/modules/desktop_capture/mouse_cursor_monitor_win.cc @@ -105,7 +105,8 @@ MouseCursorMonitor* MouseCursorMonitor::CreateForWindow( } MouseCursorMonitor* MouseCursorMonitor::CreateForScreen( - const DesktopCaptureOptions& options) { + const DesktopCaptureOptions& options, + ScreenId screen) { return new MouseCursorMonitorWin(NULL); } diff --git a/webrtc/modules/desktop_capture/mouse_cursor_monitor_x11.cc b/webrtc/modules/desktop_capture/mouse_cursor_monitor_x11.cc index 9114b95f3b..9e196779d2 100644 --- a/webrtc/modules/desktop_capture/mouse_cursor_monitor_x11.cc +++ b/webrtc/modules/desktop_capture/mouse_cursor_monitor_x11.cc @@ -214,7 +214,8 @@ MouseCursorMonitor* MouseCursorMonitor::CreateForWindow( } MouseCursorMonitor* MouseCursorMonitor::CreateForScreen( - const DesktopCaptureOptions& options) { + const DesktopCaptureOptions& options, + ScreenId screen) { if (!options.x_display()) return NULL; return new MouseCursorMonitorX11( diff --git a/webrtc/modules/desktop_capture/screen_capturer.h b/webrtc/modules/desktop_capture/screen_capturer.h index 9dd3a1050a..a8d40a72ef 100644 --- a/webrtc/modules/desktop_capture/screen_capturer.h +++ b/webrtc/modules/desktop_capture/screen_capturer.h @@ -11,6 +11,9 @@ #ifndef WEBRTC_MODULES_DESKTOP_CAPTURE_SCREEN_CAPTURER_H_ #define WEBRTC_MODULES_DESKTOP_CAPTURE_SCREEN_CAPTURER_H_ +#include + +#include "webrtc/modules/desktop_capture/desktop_capture_types.h" #include "webrtc/modules/desktop_capture/desktop_capturer.h" #include "webrtc/system_wrappers/interface/scoped_ptr.h" #include "webrtc/typedefs.h" @@ -40,6 +43,13 @@ struct MouseCursorShape; // Since data can be read while another capture action is happening. class ScreenCapturer : public DesktopCapturer { public: + // Use a struct to represent a screen although it has only an id for now, + // because we may want to add more fields (e.g. description) in the future. + struct Screen { + ScreenId id; + }; + typedef std::vector ScreenList; + // Provides callbacks used by the capturer to pass captured video frames and // mouse cursor shapes to the processing pipeline. // @@ -78,6 +88,15 @@ class ScreenCapturer : public DesktopCapturer { // remain valid until the capturer is destroyed. virtual void SetMouseShapeObserver( MouseShapeObserver* mouse_shape_observer) = 0; + + // Get the list of screens (not containing kFullDesktopScreenId). Returns + // false in case of a failure. + virtual bool GetScreenList(ScreenList* screens) = 0; + + // 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 + // full desktop is captured. + virtual bool SelectScreen(ScreenId id) = 0; }; } // namespace webrtc diff --git a/webrtc/modules/desktop_capture/screen_capturer_mac.mm b/webrtc/modules/desktop_capture/screen_capturer_mac.mm index 00639c7391..7aec06cd81 100644 --- a/webrtc/modules/desktop_capture/screen_capturer_mac.mm +++ b/webrtc/modules/desktop_capture/screen_capturer_mac.mm @@ -136,6 +136,8 @@ class ScreenCapturerMac : public ScreenCapturer { virtual void Capture(const DesktopRegion& region) OVERRIDE; virtual void SetMouseShapeObserver( MouseShapeObserver* mouse_shape_observer) OVERRIDE; + virtual bool GetScreenList(ScreenList* screens) OVERRIDE; + virtual bool SelectScreen(ScreenId id) OVERRIDE; private: void CaptureCursor(); @@ -415,6 +417,20 @@ void ScreenCapturerMac::SetMouseShapeObserver( mouse_shape_observer_ = mouse_shape_observer; } +bool ScreenCapturerMac::GetScreenList(ScreenList* screens) { + assert(screens->size() == 0); + // TODO(jiayl): implement screen enumeration. + Screen default_screen; + default_screen.id = 0; + screens->push_back(default_screen); + return true; +} + +bool ScreenCapturerMac::SelectScreen(ScreenId id) { + // TODO(jiayl): implement screen selection. + return true; +} + void ScreenCapturerMac::CaptureCursor() { if (!mouse_shape_observer_) return; diff --git a/webrtc/modules/desktop_capture/screen_capturer_win.cc b/webrtc/modules/desktop_capture/screen_capturer_win.cc index fecbb4d79e..2f13bb5e66 100644 --- a/webrtc/modules/desktop_capture/screen_capturer_win.cc +++ b/webrtc/modules/desktop_capture/screen_capturer_win.cc @@ -53,6 +53,8 @@ class ScreenCapturerWin : public ScreenCapturer { virtual void Capture(const DesktopRegion& region) OVERRIDE; virtual void SetMouseShapeObserver( MouseShapeObserver* mouse_shape_observer) OVERRIDE; + virtual bool GetScreenList(ScreenList* screens) OVERRIDE; + virtual bool SelectScreen(ScreenId id) OVERRIDE; private: // Make sure that the device contexts match the screen configuration. @@ -204,6 +206,20 @@ void ScreenCapturerWin::SetMouseShapeObserver( mouse_shape_observer_ = mouse_shape_observer; } +bool ScreenCapturerWin::GetScreenList(ScreenList* screens) { + assert(screens->size() == 0); + // TODO(jiayl): implement screen enumeration. + Screen default_screen; + default_screen.id = 0; + screens->push_back(default_screen); + return true; +} + +bool ScreenCapturerWin::SelectScreen(ScreenId id) { + // TODO(jiayl): implement screen selection. + return true; +} + void ScreenCapturerWin::Start(Callback* callback) { assert(!callback_); assert(callback); diff --git a/webrtc/modules/desktop_capture/screen_capturer_x11.cc b/webrtc/modules/desktop_capture/screen_capturer_x11.cc index c5a4c8cb17..4d07d98c62 100644 --- a/webrtc/modules/desktop_capture/screen_capturer_x11.cc +++ b/webrtc/modules/desktop_capture/screen_capturer_x11.cc @@ -57,6 +57,8 @@ class ScreenCapturerLinux : public ScreenCapturer, // ScreenCapturer interface. virtual void SetMouseShapeObserver( MouseShapeObserver* mouse_shape_observer) OVERRIDE; + virtual bool GetScreenList(ScreenList* screens) OVERRIDE; + virtual bool SelectScreen(ScreenId id) OVERRIDE; private: Display* display() { return options_.x_display()->display(); } @@ -310,6 +312,20 @@ void ScreenCapturerLinux::SetMouseShapeObserver( mouse_shape_observer_ = mouse_shape_observer; } +bool ScreenCapturerLinux::GetScreenList(ScreenList* screens) { + DCHECK(screens->size() == 0); + // TODO(jiayl): implement screen enumeration. + Screen default_screen; + default_screen.id = 0; + screens->push_back(default_screen); + return true; +} + +bool ScreenCapturerLinux::SelectScreen(ScreenId id) { + // TODO(jiayl): implement screen selection. + return true; +} + bool ScreenCapturerLinux::HandleXEvent(const XEvent& event) { if (use_damage_ && (event.type == damage_event_base_ + XDamageNotify)) { const XDamageNotifyEvent* damage_event =