Thanks to the CL https://webrtc-review.googlesource.com/c/src/+/83822 there is now no need to destroy the stream asynchronously. But the CL above introduced a leak, the streams were stopped but not destroyed. This CL essentially fixes the leak, it is now safe to destroy the stream right after being stopped as everything happen in the same capture thread. Bug: chromium:851883 Change-Id: I4bf7409246f3957d90040d0d8cf09e98f28d6559 Reviewed-on: https://webrtc-review.googlesource.com/96621 Reviewed-by: Brave Yao <braveyao@webrtc.org> Reviewed-by: Zijie He <zijiehe@chromium.org> Commit-Queue: Brave Yao <braveyao@webrtc.org> Cr-Commit-Position: refs/heads/master@{#24519}
71 lines
2.0 KiB
Plaintext
71 lines
2.0 KiB
Plaintext
/*
|
|
* Copyright (c) 2018 The WebRTC project authors. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
|
|
#include "modules/desktop_capture/mac/desktop_frame_provider.h"
|
|
|
|
#include <utility>
|
|
|
|
#include "modules/desktop_capture/mac/desktop_frame_cgimage.h"
|
|
#include "modules/desktop_capture/mac/desktop_frame_iosurface.h"
|
|
|
|
namespace webrtc {
|
|
|
|
DesktopFrameProvider::DesktopFrameProvider(bool allow_iosurface)
|
|
: allow_iosurface_(allow_iosurface) {
|
|
thread_checker_.DetachFromThread();
|
|
}
|
|
|
|
DesktopFrameProvider::~DesktopFrameProvider() {
|
|
RTC_DCHECK(thread_checker_.CalledOnValidThread());
|
|
|
|
Release();
|
|
}
|
|
|
|
std::unique_ptr<DesktopFrame> DesktopFrameProvider::TakeLatestFrameForDisplay(
|
|
CGDirectDisplayID display_id) {
|
|
RTC_DCHECK(thread_checker_.CalledOnValidThread());
|
|
|
|
if (!allow_iosurface_ || !io_surfaces_[display_id]) {
|
|
// Regenerate a snapshot. If iosurface is on it will be empty until the
|
|
// stream handler is called.
|
|
return DesktopFrameCGImage::CreateForDisplay(display_id);
|
|
}
|
|
|
|
return io_surfaces_[display_id]->Share();
|
|
}
|
|
|
|
void DesktopFrameProvider::InvalidateIOSurface(CGDirectDisplayID display_id,
|
|
rtc::ScopedCFTypeRef<IOSurfaceRef> io_surface) {
|
|
RTC_DCHECK(thread_checker_.CalledOnValidThread());
|
|
|
|
if (!allow_iosurface_) {
|
|
return;
|
|
}
|
|
|
|
std::unique_ptr<DesktopFrameIOSurface> desktop_frame_iosurface =
|
|
DesktopFrameIOSurface::Wrap(io_surface);
|
|
|
|
io_surfaces_[display_id] = desktop_frame_iosurface ?
|
|
SharedDesktopFrame::Wrap(std::move(desktop_frame_iosurface)) :
|
|
nullptr;
|
|
}
|
|
|
|
void DesktopFrameProvider::Release() {
|
|
RTC_DCHECK(thread_checker_.CalledOnValidThread());
|
|
|
|
if (!allow_iosurface_) {
|
|
return;
|
|
}
|
|
|
|
io_surfaces_.clear();
|
|
}
|
|
|
|
} // namespace webrtc
|