| Index: webrtc/modules/desktop_capture/win/screen_capturer_win_gdi.cc
|
| diff --git a/webrtc/modules/desktop_capture/win/screen_capturer_win_gdi.cc b/webrtc/modules/desktop_capture/win/screen_capturer_win_gdi.cc
|
| index 3cf64879f9fa6b6c1b033e4d974301b3c046a768..19079bc78b0726cd869451c56b983eaa2224a280 100644
|
| --- a/webrtc/modules/desktop_capture/win/screen_capturer_win_gdi.cc
|
| +++ b/webrtc/modules/desktop_capture/win/screen_capturer_win_gdi.cc
|
| @@ -12,6 +12,8 @@
|
|
|
| #include <assert.h>
|
|
|
| +#include <utility>
|
| +
|
| #include "webrtc/modules/desktop_capture/desktop_capture_options.h"
|
| #include "webrtc/modules/desktop_capture/desktop_frame.h"
|
| #include "webrtc/modules/desktop_capture/desktop_frame_win.h"
|
| @@ -34,6 +36,22 @@ const UINT DWM_EC_ENABLECOMPOSITION = 1;
|
|
|
| const wchar_t kDwmapiLibraryName[] = L"dwmapi.dll";
|
|
|
| +// SharedMemoryFactory that creates SharedMemory using the deprecated
|
| +// DesktopCapturer::Callback::CreateSharedMemory().
|
| +class CallbackSharedMemoryFactory : public SharedMemoryFactory {
|
| + public:
|
| + CallbackSharedMemoryFactory(DesktopCapturer::Callback* callback)
|
| + : callback_(callback) {}
|
| + ~CallbackSharedMemoryFactory() override {}
|
| +
|
| + rtc::scoped_ptr<SharedMemory> CreateSharedMemory(size_t size) override {
|
| + return rtc_make_scoped_ptr(callback_->CreateSharedMemory(size));
|
| + }
|
| +
|
| + private:
|
| + DesktopCapturer::Callback* callback_;
|
| +};
|
| +
|
| } // namespace
|
|
|
| ScreenCapturerWinGdi::ScreenCapturerWinGdi(const DesktopCaptureOptions& options)
|
| @@ -70,6 +88,11 @@ ScreenCapturerWinGdi::~ScreenCapturerWinGdi() {
|
| FreeLibrary(dwmapi_library_);
|
| }
|
|
|
| +void ScreenCapturerWinGdi::SetSharedMemoryFactory(
|
| + rtc::scoped_ptr<SharedMemoryFactory> shared_memory_factory) {
|
| + shared_memory_factory_ = std::move(shared_memory_factory);
|
| +}
|
| +
|
| void ScreenCapturerWinGdi::Capture(const DesktopRegion& region) {
|
| TickTime capture_start_time = TickTime::Now();
|
|
|
| @@ -148,6 +171,8 @@ void ScreenCapturerWinGdi::Start(Callback* callback) {
|
| assert(callback);
|
|
|
| callback_ = callback;
|
| + if (!shared_memory_factory_)
|
| + shared_memory_factory_.reset(new CallbackSharedMemoryFactory(callback));
|
|
|
| // Vote to disable Aero composited desktop effects while capturing. Windows
|
| // will restore Aero automatically if the process exits. This has no effect
|
| @@ -237,12 +262,8 @@ bool ScreenCapturerWinGdi::CaptureImage() {
|
| assert(desktop_dc_ != NULL);
|
| assert(memory_dc_ != NULL);
|
|
|
| - size_t buffer_size = size.width() * size.height() *
|
| - DesktopFrame::kBytesPerPixel;
|
| - SharedMemory* shared_memory = callback_->CreateSharedMemory(buffer_size);
|
| -
|
| - rtc::scoped_ptr<DesktopFrame> buffer(
|
| - DesktopFrameWin::Create(size, shared_memory, desktop_dc_));
|
| + rtc::scoped_ptr<DesktopFrame> buffer(DesktopFrameWin::Create(
|
| + size, shared_memory_factory_.get(), desktop_dc_));
|
| if (!buffer.get())
|
| return false;
|
| queue_.ReplaceCurrentFrame(buffer.release());
|
|
|