From 8a8b238556abedf92f69ab680a8bb03af3ed280f Mon Sep 17 00:00:00 2001 From: zijiehe Date: Fri, 31 Mar 2017 14:13:40 -0700 Subject: [PATCH] ScreenCapturerWinDirectx should have two DxgiDuplicatorController::Context instances, each for one DesktopFrame. So both DesktopFrame instances can be correctly updated. I have verified this change on my laptop, which cannot reproduce the issue anymore. BUG=704205 Review-Url: https://codereview.webrtc.org/2781253002 Cr-Commit-Position: refs/heads/master@{#17494} --- .../win/screen_capturer_win_directx.cc | 15 +++++++++++---- .../win/screen_capturer_win_directx.h | 3 ++- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/webrtc/modules/desktop_capture/win/screen_capturer_win_directx.cc b/webrtc/modules/desktop_capture/win/screen_capturer_win_directx.cc index 90bdeb6124..36e43fbad7 100644 --- a/webrtc/modules/desktop_capture/win/screen_capturer_win_directx.cc +++ b/webrtc/modules/desktop_capture/win/screen_capturer_win_directx.cc @@ -15,6 +15,7 @@ #include "webrtc/base/checks.h" #include "webrtc/base/logging.h" +#include "webrtc/base/ptr_util.h" #include "webrtc/base/timeutils.h" #include "webrtc/modules/desktop_capture/desktop_frame.h" #include "webrtc/modules/desktop_capture/win/screen_capture_utils.h" @@ -106,10 +107,15 @@ void ScreenCapturerWinDirectx::CaptureFrame() { } frames_.ReplaceCurrentFrame(SharedDesktopFrame::Wrap(std::move(new_frame))); } + contexts_.MoveToNextFrame(); + if (!contexts_.current_frame()) { + contexts_.ReplaceCurrentFrame( + rtc::MakeUnique()); + } if (current_screen_id_ == kFullDesktopScreenId) { if (!DxgiDuplicatorController::Instance()->Duplicate( - &context_, frames_.current_frame())) { + contexts_.current_frame(), frames_.current_frame())) { // Screen size may be changed, so we need to reset the frames. frames_.Reset(); resolution_change_detector_.Reset(); @@ -118,7 +124,8 @@ void ScreenCapturerWinDirectx::CaptureFrame() { } } else { if (!DxgiDuplicatorController::Instance()->DuplicateMonitor( - &context_, current_screen_id_, frames_.current_frame())) { + contexts_.current_frame(), current_screen_id_, + frames_.current_frame())) { // Screen size may be changed, so we need to reset the frames. frames_.Reset(); resolution_change_detector_.Reset(); @@ -158,14 +165,14 @@ bool ScreenCapturerWinDirectx::SelectSource(SourceId id) { // frames only when a Duplicate() function call returns false. if (id == kFullDesktopScreenId) { current_screen_id_ = id; - context_.Reset(); + contexts_.Reset(); return true; } int screen_count = DxgiDuplicatorController::Instance()->ScreenCount(); if (id >= 0 && id < screen_count) { current_screen_id_ = id; - context_.Reset(); + contexts_.Reset(); return true; } return false; diff --git a/webrtc/modules/desktop_capture/win/screen_capturer_win_directx.h b/webrtc/modules/desktop_capture/win/screen_capturer_win_directx.h index a48bda9954..82f8be3658 100644 --- a/webrtc/modules/desktop_capture/win/screen_capturer_win_directx.h +++ b/webrtc/modules/desktop_capture/win/screen_capturer_win_directx.h @@ -59,10 +59,11 @@ class ScreenCapturerWinDirectx : public DesktopCapturer { // Returns desktop size of selected screen. DesktopSize SelectedDesktopSize() const; + // TODO(zijiehe): Merge |frames_| and |contexts_| into a single object. ScreenCaptureFrameQueue frames_; + ScreenCaptureFrameQueue contexts_; std::unique_ptr shared_memory_factory_; Callback* callback_ = nullptr; - DxgiDuplicatorController::Context context_; SourceId current_screen_id_ = kFullDesktopScreenId; ResolutionChangeDetector resolution_change_detector_;