Index: webrtc/modules/desktop_capture/window_capturer_win.cc |
diff --git a/webrtc/modules/desktop_capture/window_capturer_win.cc b/webrtc/modules/desktop_capture/window_capturer_win.cc |
index 54b2768aa803fe265d90a6b1f40884aafc795f88..9f0ca409def2bdba0415fe6d65f1a9a79fd6e857 100644 |
--- a/webrtc/modules/desktop_capture/window_capturer_win.cc |
+++ b/webrtc/modules/desktop_capture/window_capturer_win.cc |
@@ -103,6 +103,10 @@ class WindowCapturerWin : public WindowCapturer { |
AeroChecker aero_checker_; |
+ // This map is used to avoid flickering for the case when SelectWindow() calls |
+ // are interleaved with Capture() calls. |
+ std::map<HWND, DesktopSize> window_size_map_; |
+ |
RTC_DISALLOW_COPY_AND_ASSIGN(WindowCapturerWin); |
}; |
@@ -120,6 +124,14 @@ bool WindowCapturerWin::GetWindowList(WindowList* windows) { |
if (!EnumWindows(&WindowsEnumerationHandler, param)) |
return false; |
windows->swap(result); |
+ |
+ std::map<HWND, DesktopSize> new_map; |
+ for (const auto& item : *windows) { |
+ HWND hwnd = reinterpret_cast<HWND>(item.id); |
+ new_map[hwnd] = window_size_map_[hwnd]; |
+ } |
+ window_size_map_.swap(new_map); |
+ |
return true; |
} |
@@ -128,7 +140,9 @@ bool WindowCapturerWin::SelectWindow(WindowId id) { |
if (!IsWindow(window) || !IsWindowVisible(window) || IsIconic(window)) |
return false; |
window_ = window; |
- previous_size_.set(0, 0); |
+ // When a window is not in the map, window_size_map_[window] will create an |
+ // item with DesktopSize (0, 0). |
+ previous_size_ = window_size_map_[window]; |
return true; |
} |
@@ -170,6 +184,7 @@ void WindowCapturerWin::Capture(const DesktopRegion& region) { |
memset(frame->data(), 0, frame->stride() * frame->size().height()); |
previous_size_ = frame->size(); |
+ window_size_map_[window_] = previous_size_; |
callback_->OnCaptureCompleted(frame); |
return; |
} |
@@ -236,6 +251,7 @@ void WindowCapturerWin::Capture(const DesktopRegion& region) { |
ReleaseDC(window_, window_dc); |
previous_size_ = frame->size(); |
+ window_size_map_[window_] = previous_size_; |
frame->mutable_updated_region()->SetRect( |
DesktopRect::MakeSize(frame->size())); |