| 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 b22f0387f110fbe5f6eb98ddccb93199e13e2a9a..87bc195ce40e06d0f0cfe0d71d9cf78bb523435f 100644
|
| --- a/webrtc/modules/desktop_capture/win/screen_capturer_win_gdi.cc
|
| +++ b/webrtc/modules/desktop_capture/win/screen_capturer_win_gdi.cc
|
| @@ -10,11 +10,10 @@
|
|
|
| #include "webrtc/modules/desktop_capture/win/screen_capturer_win_gdi.h"
|
|
|
| -#include <assert.h>
|
| -
|
| #include <utility>
|
|
|
| #include "webrtc/base/checks.h"
|
| +#include "webrtc/base/logging.h"
|
| #include "webrtc/base/timeutils.h"
|
| #include "webrtc/modules/desktop_capture/desktop_capture_options.h"
|
| #include "webrtc/modules/desktop_capture/desktop_frame.h"
|
| @@ -110,8 +109,8 @@ bool ScreenCapturerWinGdi::SelectSource(SourceId id) {
|
| }
|
|
|
| void ScreenCapturerWinGdi::Start(Callback* callback) {
|
| - assert(!callback_);
|
| - assert(callback);
|
| + RTC_DCHECK(!callback_);
|
| + RTC_DCHECK(callback);
|
|
|
| callback_ = callback;
|
|
|
| @@ -169,15 +168,13 @@ void ScreenCapturerWinGdi::PrepareCaptureResources() {
|
| }
|
|
|
| if (!desktop_dc_) {
|
| - assert(!memory_dc_);
|
| + RTC_DCHECK(!memory_dc_);
|
|
|
| // Create GDI device contexts to capture from the desktop into memory.
|
| desktop_dc_ = GetDC(nullptr);
|
| - if (!desktop_dc_)
|
| - abort();
|
| + RTC_CHECK(desktop_dc_);
|
| memory_dc_ = CreateCompatibleDC(desktop_dc_);
|
| - if (!memory_dc_)
|
| - abort();
|
| + RTC_CHECK(memory_dc_);
|
|
|
| desktop_dc_rect_ = screen_rect;
|
|
|
| @@ -198,8 +195,8 @@ bool ScreenCapturerWinGdi::CaptureImage() {
|
| // may still be reading from them.
|
| if (!queue_.current_frame() ||
|
| !queue_.current_frame()->size().equals(screen_rect.size())) {
|
| - assert(desktop_dc_);
|
| - assert(memory_dc_);
|
| + RTC_DCHECK(desktop_dc_);
|
| + RTC_DCHECK(memory_dc_);
|
|
|
| std::unique_ptr<DesktopFrame> buffer = DesktopFrameWin::Create(
|
| size, shared_memory_factory_.get(), desktop_dc_);
|
| @@ -213,16 +210,22 @@ bool ScreenCapturerWinGdi::CaptureImage() {
|
| DesktopFrameWin* current = static_cast<DesktopFrameWin*>(
|
| queue_.current_frame()->GetUnderlyingFrame());
|
| HGDIOBJ previous_object = SelectObject(memory_dc_, current->bitmap());
|
| - if (previous_object) {
|
| - BitBlt(memory_dc_, 0, 0, screen_rect.width(), screen_rect.height(),
|
| - desktop_dc_, screen_rect.left(), screen_rect.top(),
|
| - SRCCOPY | CAPTUREBLT);
|
| -
|
| - // Select back the previously selected object to that the device contect
|
| - // could be destroyed independently of the bitmap if needed.
|
| - SelectObject(memory_dc_, previous_object);
|
| + if (!previous_object || previous_object == HGDI_ERROR) {
|
| + return false;
|
| + }
|
| +
|
| + bool result = (BitBlt(memory_dc_, 0, 0, screen_rect.width(),
|
| + screen_rect.height(), desktop_dc_, screen_rect.left(), screen_rect.top(),
|
| + SRCCOPY | CAPTUREBLT) != FALSE);
|
| + if (!result) {
|
| + LOG_GLE(LS_WARNING) << "BitBlt failed";
|
| }
|
| - return true;
|
| +
|
| + // Select back the previously selected object to that the device contect
|
| + // could be destroyed independently of the bitmap if needed.
|
| + SelectObject(memory_dc_, previous_object);
|
| +
|
| + return result;
|
| }
|
|
|
| } // namespace webrtc
|
|
|