• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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  
selected_window()59    WindowId selected_window() const { return selected_window_; }
excluded_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