From 8bc9326a0bc6bb2f07fbb1ef60dae1d8cddd2b4a Mon Sep 17 00:00:00 2001 From: zijiehe Date: Mon, 14 Nov 2016 18:20:33 -0800 Subject: [PATCH] DirectX capturer flickers on the second monitor In DxgiOutputDuplicator, we need to convert between a monitor based coordinate and a entire screen based coordinate. i.e. Copying an updated area from a monitor (an output in DirectX API) to the entire screen frame (DesktopFrame). But DxgiOutputDuplicator always assumes the coordinate is based on screen frame. So we only need to convert a rectange in updated_region to monitor based coordinate when copying data from texture_. But in last_frame_, the data are always based on screen coordinate. So fixes are both required in line 167 and line 180. In the previous one, we do not need to convert the DesktopRect, which is already screen based, into screen based coordinate. In the late one, we do not need to convert the DesktopRect at all. So after these two changes, DxgiOutputDuplicator::TargetRect() function can be removed. Flickers of DirectX capturer can happen on any devices, but a virtual machine can easily reproduce it. While on a regular high performance machine, it's harder, but not totally impossible, to reproduce the issue. BUG=314516 Review-Url: https://codereview.webrtc.org/2495143002 Cr-Commit-Position: refs/heads/master@{#15075} --- .../desktop_capture/win/dxgi_output_duplicator.cc | 14 +++----------- .../desktop_capture/win/dxgi_output_duplicator.h | 3 --- 2 files changed, 3 insertions(+), 14 deletions(-) diff --git a/webrtc/modules/desktop_capture/win/dxgi_output_duplicator.cc b/webrtc/modules/desktop_capture/win/dxgi_output_duplicator.cc index 122ad1f6e1..9c0f14c43d 100644 --- a/webrtc/modules/desktop_capture/win/dxgi_output_duplicator.cc +++ b/webrtc/modules/desktop_capture/win/dxgi_output_duplicator.cc @@ -163,8 +163,8 @@ bool DxgiOutputDuplicator::Duplicate(Context* context, const DesktopFrame& source = texture_->AsDesktopFrame(); for (DesktopRegion::Iterator it(updated_region); !it.IsAtEnd(); it.Advance()) { - target->CopyPixelsFrom(source, SourceRect(it.rect()).top_left(), - TargetRect(it.rect(), offset)); + target->CopyPixelsFrom( + source, SourceRect(it.rect()).top_left(), it.rect()); } last_frame_ = target->Share(); last_frame_offset_ = offset; @@ -177,8 +177,7 @@ bool DxgiOutputDuplicator::Duplicate(Context* context, // export last frame to the target. for (DesktopRegion::Iterator it(updated_region); !it.IsAtEnd(); it.Advance()) { - target->CopyPixelsFrom(*last_frame_, SourceRect(it.rect()).top_left(), - TargetRect(it.rect(), offset)); + target->CopyPixelsFrom(*last_frame_, it.rect().top_left(), it.rect()); } target->mutable_updated_region()->AddRegion(updated_region); } @@ -302,11 +301,4 @@ DesktopRect DxgiOutputDuplicator::SourceRect(DesktopRect rect) { return rect; } -DesktopRect DxgiOutputDuplicator::TargetRect(DesktopRect rect, - DesktopVector offset) { - rect = SourceRect(rect); - rect.Translate(offset); - return rect; -} - } // namespace webrtc diff --git a/webrtc/modules/desktop_capture/win/dxgi_output_duplicator.h b/webrtc/modules/desktop_capture/win/dxgi_output_duplicator.h index 0d5b134796..b57569014f 100644 --- a/webrtc/modules/desktop_capture/win/dxgi_output_duplicator.h +++ b/webrtc/modules/desktop_capture/win/dxgi_output_duplicator.h @@ -108,9 +108,6 @@ class DxgiOutputDuplicator { // Returns a DesktopRect in the coordinate of |texture_|->AsDesktopFrame(). DesktopRect SourceRect(DesktopRect rect); - // Returns a DesktopRect in the coordinate of |offset|. - DesktopRect TargetRect(DesktopRect rect, DesktopVector offset); - const D3dDevice device_; const Microsoft::WRL::ComPtr output_; const DesktopRect desktop_rect_;