Home | History | Annotate | Download | only in desktop_capture
      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 WEBRTC_MODULES_DESKTOP_CAPTURE_CROPPING_WINDOW_CAPTURER_H_
     12 #define WEBRTC_MODULES_DESKTOP_CAPTURE_CROPPING_WINDOW_CAPTURER_H_
     13 
     14 #include "webrtc/base/scoped_ptr.h"
     15 #include "webrtc/modules/desktop_capture/desktop_capture_options.h"
     16 #include "webrtc/modules/desktop_capture/screen_capturer.h"
     17 #include "webrtc/modules/desktop_capture/window_capturer.h"
     18 
     19 namespace webrtc {
     20 
     21 // WindowCapturer implementation that uses a screen capturer to capture the
     22 // whole screen and crops the video frame to the window area when the captured
     23 // window is on top.
     24 class CroppingWindowCapturer : public WindowCapturer,
     25                                public DesktopCapturer::Callback {
     26  public:
     27   static WindowCapturer* Create(const DesktopCaptureOptions& options);
     28   virtual ~CroppingWindowCapturer();
     29 
     30   // DesktopCapturer implementation.
     31   void Start(DesktopCapturer::Callback* callback) override;
     32   void Capture(const DesktopRegion& region) override;
     33   void SetExcludedWindow(WindowId window) override;
     34 
     35   // WindowCapturer implementation.
     36   bool GetWindowList(WindowList* windows) override;
     37   bool SelectWindow(WindowId id) override;
     38   bool BringSelectedWindowToFront() override;
     39 
     40   // DesktopCapturer::Callback implementation, passed to |screen_capturer_| to
     41   // intercept the capture result.
     42   SharedMemory* CreateSharedMemory(size_t size) override;
     43   void OnCaptureCompleted(DesktopFrame* frame) override;
     44 
     45  protected:
     46   explicit CroppingWindowCapturer(const DesktopCaptureOptions& options);
     47 
     48   // The platform implementation should override these methods.
     49 
     50   // Returns true if it is OK to capture the whole screen and crop to the
     51   // selected window, i.e. the selected window is opaque, rectangular, and not
     52   // occluded.
     53   virtual bool ShouldUseScreenCapturer() = 0;
     54 
     55   // Returns the window area relative to the top left of the virtual screen
     56   // within the bounds of the virtual screen.
     57   virtual DesktopRect GetWindowRectInVirtualScreen() = 0;
     58 
     59   WindowId selected_window() const { return selected_window_; }
     60   WindowId excluded_window() const { return excluded_window_; }
     61 
     62  private:
     63   DesktopCaptureOptions options_;
     64   DesktopCapturer::Callback* callback_;
     65   rtc::scoped_ptr<WindowCapturer> window_capturer_;
     66   rtc::scoped_ptr<ScreenCapturer> screen_capturer_;
     67   WindowId selected_window_;
     68   WindowId excluded_window_;
     69 };
     70 
     71 }  // namespace webrtc
     72 
     73 #endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_CROPPING_WINDOW_CAPTURER_H_
     74 
     75