1 /*
2  *  Copyright (c) 2017 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_DXGI_FRAME_H_
12 #define MODULES_DESKTOP_CAPTURE_WIN_DXGI_FRAME_H_
13 
14 #include <memory>
15 #include <vector>
16 
17 #include "modules/desktop_capture/desktop_capture_types.h"
18 #include "modules/desktop_capture/desktop_capturer.h"
19 #include "modules/desktop_capture/desktop_geometry.h"
20 #include "modules/desktop_capture/resolution_tracker.h"
21 #include "modules/desktop_capture/shared_desktop_frame.h"
22 #include "modules/desktop_capture/shared_memory.h"
23 #include "modules/desktop_capture/win/dxgi_context.h"
24 
25 namespace webrtc {
26 
27 class DxgiDuplicatorController;
28 
29 // A pair of a SharedDesktopFrame and a DxgiDuplicatorController::Context for
30 // the client of DxgiDuplicatorController.
31 class DxgiFrame final {
32  public:
33   using Context = DxgiFrameContext;
34 
35   // DxgiFrame does not take ownership of |factory|, consumers should ensure it
36   // outlives this instance. nullptr is acceptable.
37   explicit DxgiFrame(SharedMemoryFactory* factory);
38   ~DxgiFrame();
39 
40   // Should not be called if Prepare() is not executed or returns false.
41   SharedDesktopFrame* frame() const;
42 
43  private:
44   // Allows DxgiDuplicatorController to access Prepare() and context() function
45   // as well as Context class.
46   friend class DxgiDuplicatorController;
47 
48   // Prepares current instance with desktop size and source id.
49   bool Prepare(DesktopSize size, DesktopCapturer::SourceId source_id);
50 
51   // Should not be called if Prepare() is not executed or returns false.
52   Context* context();
53 
54   SharedMemoryFactory* const factory_;
55   ResolutionTracker resolution_tracker_;
56   DesktopCapturer::SourceId source_id_ = kFullDesktopScreenId;
57   std::unique_ptr<SharedDesktopFrame> frame_;
58   Context context_;
59 };
60 
61 }  // namespace webrtc
62 
63 #endif  // MODULES_DESKTOP_CAPTURE_WIN_DXGI_FRAME_H_
64