From 67e438ffe5043efaef1ab844e7504e952dd76072 Mon Sep 17 00:00:00 2001 From: zijiehe Date: Wed, 12 Jul 2017 17:29:36 -0700 Subject: [PATCH] Fix http://crbug.com/741252 The root cause is when a DxgiContext is reseted, it has not been correctly cleared from DxgiOutputDuplicator. So during next CaptureFrame() function call, DxgiOutputDuplicator will spread the context change to a deleted instance. BUG=741252 Review-Url: https://codereview.webrtc.org/2975103002 Cr-Commit-Position: refs/heads/master@{#18992} --- webrtc/modules/desktop_capture/win/dxgi_context.cc | 3 ++- .../modules/desktop_capture/win/dxgi_duplicator_controller.h | 5 ++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/webrtc/modules/desktop_capture/win/dxgi_context.cc b/webrtc/modules/desktop_capture/win/dxgi_context.cc index dffefc404f..18ca990970 100644 --- a/webrtc/modules/desktop_capture/win/dxgi_context.cc +++ b/webrtc/modules/desktop_capture/win/dxgi_context.cc @@ -21,10 +21,11 @@ DxgiAdapterContext::~DxgiAdapterContext() = default; DxgiFrameContext::DxgiFrameContext() = default; DxgiFrameContext::~DxgiFrameContext() { - DxgiDuplicatorController::Instance()->Unregister(this); + Reset(); } void DxgiFrameContext::Reset() { + DxgiDuplicatorController::Instance()->Unregister(this); controller_id = 0; } diff --git a/webrtc/modules/desktop_capture/win/dxgi_duplicator_controller.h b/webrtc/modules/desktop_capture/win/dxgi_duplicator_controller.h index 41a876b1f3..43768d9899 100644 --- a/webrtc/modules/desktop_capture/win/dxgi_duplicator_controller.h +++ b/webrtc/modules/desktop_capture/win/dxgi_duplicator_controller.h @@ -102,9 +102,8 @@ class DxgiDuplicatorController { int ScreenCount(); private: - // DxgiFrameContext calls private Unregister(Context*) function during - // destructing. - friend DxgiFrameContext::~DxgiFrameContext(); + // DxgiFrameContext calls private Unregister(Context*) function in Reset(). + friend void DxgiFrameContext::Reset(); // scoped_refptr accesses private AddRef() and // Release() functions.