1 /* 2 * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #ifndef MODULES_DESKTOP_CAPTURE_CROPPING_WINDOW_CAPTURER_H_ 12 #define MODULES_DESKTOP_CAPTURE_CROPPING_WINDOW_CAPTURER_H_ 13 14 #include <memory> 15 16 #include "modules/desktop_capture/desktop_capture_options.h" 17 #include "modules/desktop_capture/desktop_capture_types.h" 18 #include "modules/desktop_capture/desktop_capturer.h" 19 #include "modules/desktop_capture/desktop_frame.h" 20 #include "modules/desktop_capture/desktop_geometry.h" 21 #include "modules/desktop_capture/shared_memory.h" 22 #include "rtc_base/system/rtc_export.h" 23 24 namespace webrtc { 25 26 // WindowCapturer implementation that uses a screen capturer to capture the 27 // whole screen and crops the video frame to the window area when the captured 28 // window is on top. 29 class RTC_EXPORT CroppingWindowCapturer : public DesktopCapturer, 30 public DesktopCapturer::Callback { 31 public: 32 static std::unique_ptr<DesktopCapturer> CreateCapturer( 33 const DesktopCaptureOptions& options); 34 35 ~CroppingWindowCapturer() override; 36 37 // DesktopCapturer implementation. 38 void Start(DesktopCapturer::Callback* callback) override; 39 void SetSharedMemoryFactory( 40 std::unique_ptr<SharedMemoryFactory> shared_memory_factory) override; 41 void CaptureFrame() override; 42 void SetExcludedWindow(WindowId window) override; 43 bool GetSourceList(SourceList* sources) override; 44 bool SelectSource(SourceId id) override; 45 bool FocusOnSelectedSource() override; 46 bool IsOccluded(const DesktopVector& pos) override; 47 48 // DesktopCapturer::Callback implementation, passed to |screen_capturer_| to 49 // intercept the capture result. 50 void OnCaptureResult(DesktopCapturer::Result result, 51 std::unique_ptr<DesktopFrame> frame) override; 52 53 protected: 54 explicit CroppingWindowCapturer(const DesktopCaptureOptions& options); 55 56 // The platform implementation should override these methods. 57 58 // Returns true if it is OK to capture the whole screen and crop to the 59 // selected window, i.e. the selected window is opaque, rectangular, and not 60 // occluded. 61 virtual bool ShouldUseScreenCapturer() = 0; 62 63 // Returns the window area relative to the top left of the virtual screen 64 // within the bounds of the virtual screen. This function should return the 65 // DesktopRect in full desktop coordinates, i.e. the top-left monitor starts 66 // from (0, 0). 67 virtual DesktopRect GetWindowRectInVirtualScreen() = 0; 68 selected_window()69 WindowId selected_window() const { return selected_window_; } excluded_window()70 WindowId excluded_window() const { return excluded_window_; } window_capturer()71 DesktopCapturer* window_capturer() const { return window_capturer_.get(); } 72 73 private: 74 DesktopCaptureOptions options_; 75 DesktopCapturer::Callback* callback_; 76 std::unique_ptr<DesktopCapturer> window_capturer_; 77 std::unique_ptr<DesktopCapturer> screen_capturer_; 78 SourceId selected_window_; 79 WindowId excluded_window_; 80 }; 81 82 } // namespace webrtc 83 84 #endif // MODULES_DESKTOP_CAPTURE_CROPPING_WINDOW_CAPTURER_H_ 85