Extends the ScreenCapturer interface for individual display screen cast.

Real implementations for each platform will be added in future CLs.

BUG=2787
R=sergeyu@chromium.org

Review URL: https://webrtc-codereview.appspot.com/6819005

git-svn-id: http://webrtc.googlecode.com/svn/trunk@5386 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
jiayl@webrtc.org 2014-01-14 18:26:37 +00:00
parent 03cfde2d10
commit 017b619010
11 changed files with 84 additions and 7 deletions

View File

@ -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_

View File

@ -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.

View File

@ -211,7 +211,8 @@ MouseCursorMonitor* MouseCursorMonitor::CreateForWindow(
}
MouseCursorMonitor* MouseCursorMonitor::CreateForScreen(
const DesktopCaptureOptions& options) {
const DesktopCaptureOptions& options,
ScreenId screen) {
return new MouseCursorMonitorMac(kCGNullWindowID);
}

View File

@ -21,7 +21,8 @@ MouseCursorMonitor* MouseCursorMonitor::CreateForWindow(
}
MouseCursorMonitor* MouseCursorMonitor::CreateForScreen(
const DesktopCaptureOptions& options) {
const DesktopCaptureOptions& options,
ScreenId screen) {
return NULL;
}

View File

@ -58,7 +58,7 @@ class MouseCursorMonitorTest : public testing::Test,
TEST_F(MouseCursorMonitorTest, MAYBE(FromScreen)) {
scoped_ptr<MouseCursorMonitor> 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<MouseCursorMonitor> capturer(MouseCursorMonitor::CreateForScreen(
DesktopCaptureOptions::CreateDefault()));
DesktopCaptureOptions::CreateDefault(), webrtc::kFullDesktopScreenId));
assert(capturer.get());
capturer->Init(this, MouseCursorMonitor::SHAPE_ONLY);
capturer->Capture();

View File

@ -105,7 +105,8 @@ MouseCursorMonitor* MouseCursorMonitor::CreateForWindow(
}
MouseCursorMonitor* MouseCursorMonitor::CreateForScreen(
const DesktopCaptureOptions& options) {
const DesktopCaptureOptions& options,
ScreenId screen) {
return new MouseCursorMonitorWin(NULL);
}

View File

@ -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(

View File

@ -11,6 +11,9 @@
#ifndef WEBRTC_MODULES_DESKTOP_CAPTURE_SCREEN_CAPTURER_H_
#define WEBRTC_MODULES_DESKTOP_CAPTURE_SCREEN_CAPTURER_H_
#include <vector>
#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<Screen> 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

View File

@ -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;

View File

@ -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);

View File

@ -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 =