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_WIN_SCREEN_CAPTURER_WIN_GDI_H_
12 #define MODULES_DESKTOP_CAPTURE_WIN_SCREEN_CAPTURER_WIN_GDI_H_
13 
14 #include <windows.h>
15 
16 #include <memory>
17 
18 #include "modules/desktop_capture/desktop_capturer.h"
19 #include "modules/desktop_capture/screen_capture_frame_queue.h"
20 #include "modules/desktop_capture/shared_desktop_frame.h"
21 #include "modules/desktop_capture/win/display_configuration_monitor.h"
22 #include "modules/desktop_capture/win/scoped_thread_desktop.h"
23 #include "rtc_base/constructor_magic.h"
24 
25 namespace webrtc {
26 
27 // ScreenCapturerWinGdi captures 32bit RGB using GDI.
28 //
29 // ScreenCapturerWinGdi is double-buffered as required by ScreenCapturer.
30 // This class does not detect DesktopFrame::updated_region(), the field is
31 // always set to the entire frame rectangle. ScreenCapturerDifferWrapper should
32 // be used if that functionality is necessary.
33 class ScreenCapturerWinGdi : public DesktopCapturer {
34  public:
35   explicit ScreenCapturerWinGdi(const DesktopCaptureOptions& options);
36   ~ScreenCapturerWinGdi() override;
37 
38   // Overridden from ScreenCapturer:
39   void Start(Callback* callback) override;
40   void SetSharedMemoryFactory(
41       std::unique_ptr<SharedMemoryFactory> shared_memory_factory) override;
42   void CaptureFrame() override;
43   bool GetSourceList(SourceList* sources) override;
44   bool SelectSource(SourceId id) override;
45 
46  private:
47   typedef HRESULT(WINAPI* DwmEnableCompositionFunc)(UINT);
48 
49   // Make sure that the device contexts match the screen configuration.
50   void PrepareCaptureResources();
51 
52   // Captures the current screen contents into the current buffer. Returns true
53   // if succeeded.
54   bool CaptureImage();
55 
56   // Capture the current cursor shape.
57   void CaptureCursor();
58 
59   Callback* callback_ = nullptr;
60   std::unique_ptr<SharedMemoryFactory> shared_memory_factory_;
61   SourceId current_screen_id_ = kFullDesktopScreenId;
62   std::wstring current_device_key_;
63 
64   ScopedThreadDesktop desktop_;
65 
66   // GDI resources used for screen capture.
67   HDC desktop_dc_ = NULL;
68   HDC memory_dc_ = NULL;
69 
70   // Queue of the frames buffers.
71   ScreenCaptureFrameQueue<SharedDesktopFrame> queue_;
72 
73   DisplayConfigurationMonitor display_configuration_monitor_;
74 
75   HMODULE dwmapi_library_ = NULL;
76   DwmEnableCompositionFunc composition_func_ = nullptr;
77 
78   RTC_DISALLOW_COPY_AND_ASSIGN(ScreenCapturerWinGdi);
79 };
80 
81 }  // namespace webrtc
82 
83 #endif  // MODULES_DESKTOP_CAPTURE_WIN_SCREEN_CAPTURER_WIN_GDI_H_
84