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}
121 lines
4.0 KiB
C++
121 lines
4.0 KiB
C++
/*
|
|
* 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.
|
|
*/
|
|
|
|
#ifndef MODULES_DESKTOP_CAPTURE_MAC_SCREEN_CAPTURER_MAC_H_
|
|
#define MODULES_DESKTOP_CAPTURE_MAC_SCREEN_CAPTURER_MAC_H_
|
|
|
|
#include <CoreGraphics/CoreGraphics.h>
|
|
|
|
#include <memory>
|
|
#include <vector>
|
|
|
|
#include "modules/desktop_capture/desktop_capture_options.h"
|
|
#include "modules/desktop_capture/desktop_capturer.h"
|
|
#include "modules/desktop_capture/desktop_frame.h"
|
|
#include "modules/desktop_capture/desktop_geometry.h"
|
|
#include "modules/desktop_capture/desktop_region.h"
|
|
#include "modules/desktop_capture/mac/desktop_configuration.h"
|
|
#include "modules/desktop_capture/mac/desktop_configuration_monitor.h"
|
|
#include "modules/desktop_capture/mac/desktop_frame_provider.h"
|
|
#include "modules/desktop_capture/screen_capture_frame_queue.h"
|
|
#include "modules/desktop_capture/screen_capturer_helper.h"
|
|
#include "modules/desktop_capture/shared_desktop_frame.h"
|
|
#include "rtc_base/thread_checker.h"
|
|
|
|
namespace webrtc {
|
|
|
|
class DisplayStreamManager;
|
|
|
|
// A class to perform video frame capturing for mac.
|
|
class ScreenCapturerMac final : public DesktopCapturer {
|
|
public:
|
|
ScreenCapturerMac(
|
|
rtc::scoped_refptr<DesktopConfigurationMonitor> desktop_config_monitor,
|
|
bool detect_updated_region,
|
|
bool allow_iosurface);
|
|
~ScreenCapturerMac() override;
|
|
|
|
// TODO(julien.isorce): Remove Init() or make it private.
|
|
bool Init();
|
|
|
|
// DesktopCapturer interface.
|
|
void Start(Callback* callback) override;
|
|
void CaptureFrame() override;
|
|
void SetExcludedWindow(WindowId window) override;
|
|
bool GetSourceList(SourceList* screens) override;
|
|
bool SelectSource(SourceId id) override;
|
|
|
|
private:
|
|
// Returns false if the selected screen is no longer valid.
|
|
bool CgBlit(const DesktopFrame& frame, const DesktopRegion& region);
|
|
|
|
// Called when the screen configuration is changed.
|
|
void ScreenConfigurationChanged();
|
|
|
|
bool RegisterRefreshAndMoveHandlers();
|
|
void UnregisterRefreshAndMoveHandlers();
|
|
|
|
void ScreenRefresh(CGDirectDisplayID display_id,
|
|
CGRectCount count,
|
|
const CGRect* rect_array,
|
|
DesktopVector display_origin,
|
|
IOSurfaceRef io_surface);
|
|
void ReleaseBuffers();
|
|
|
|
std::unique_ptr<DesktopFrame> CreateFrame();
|
|
|
|
const bool detect_updated_region_;
|
|
|
|
Callback* callback_ = nullptr;
|
|
|
|
// Queue of the frames buffers.
|
|
ScreenCaptureFrameQueue<SharedDesktopFrame> queue_;
|
|
|
|
// Current display configuration.
|
|
MacDesktopConfiguration desktop_config_;
|
|
|
|
// Currently selected display, or 0 if the full desktop is selected. On OS X
|
|
// 10.6 and before, this is always 0.
|
|
CGDirectDisplayID current_display_ = 0;
|
|
|
|
// The physical pixel bounds of the current screen.
|
|
DesktopRect screen_pixel_bounds_;
|
|
|
|
// The dip to physical pixel scale of the current screen.
|
|
float dip_to_pixel_scale_ = 1.0f;
|
|
|
|
// A thread-safe list of invalid rectangles, and the size of the most
|
|
// recently captured screen.
|
|
ScreenCapturerHelper helper_;
|
|
|
|
// Contains an invalid region from the previous capture.
|
|
DesktopRegion last_invalid_region_;
|
|
|
|
// Monitoring display reconfiguration.
|
|
rtc::scoped_refptr<DesktopConfigurationMonitor> desktop_config_monitor_;
|
|
|
|
CGWindowID excluded_window_ = 0;
|
|
|
|
// List of streams, one per screen.
|
|
std::vector<CGDisplayStreamRef> display_streams_;
|
|
|
|
// Container holding latest state of the snapshot per displays.
|
|
DesktopFrameProvider desktop_frame_provider_;
|
|
|
|
// Start, CaptureFrame and destructor have to called in the same thread.
|
|
rtc::ThreadChecker thread_checker_;
|
|
|
|
RTC_DISALLOW_COPY_AND_ASSIGN(ScreenCapturerMac);
|
|
};
|
|
|
|
} // namespace webrtc
|
|
|
|
#endif // MODULES_DESKTOP_CAPTURE_MAC_SCREEN_CAPTURER_MAC_H_
|