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:
parent
03cfde2d10
commit
017b619010
@ -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_
|
||||
|
||||
@ -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.
|
||||
|
||||
@ -211,7 +211,8 @@ MouseCursorMonitor* MouseCursorMonitor::CreateForWindow(
|
||||
}
|
||||
|
||||
MouseCursorMonitor* MouseCursorMonitor::CreateForScreen(
|
||||
const DesktopCaptureOptions& options) {
|
||||
const DesktopCaptureOptions& options,
|
||||
ScreenId screen) {
|
||||
return new MouseCursorMonitorMac(kCGNullWindowID);
|
||||
}
|
||||
|
||||
|
||||
@ -21,7 +21,8 @@ MouseCursorMonitor* MouseCursorMonitor::CreateForWindow(
|
||||
}
|
||||
|
||||
MouseCursorMonitor* MouseCursorMonitor::CreateForScreen(
|
||||
const DesktopCaptureOptions& options) {
|
||||
const DesktopCaptureOptions& options,
|
||||
ScreenId screen) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -105,7 +105,8 @@ MouseCursorMonitor* MouseCursorMonitor::CreateForWindow(
|
||||
}
|
||||
|
||||
MouseCursorMonitor* MouseCursorMonitor::CreateForScreen(
|
||||
const DesktopCaptureOptions& options) {
|
||||
const DesktopCaptureOptions& options,
|
||||
ScreenId screen) {
|
||||
return new MouseCursorMonitorWin(NULL);
|
||||
}
|
||||
|
||||
|
||||
@ -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(
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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 =
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user