sergeyu@chromium.org | e6e749d | 2013-10-16 02:48:41 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (c) 2013 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 | |
Mirko Bonadei | 92ea95e | 2017-09-15 04:47:31 | [diff] [blame] | 11 | #ifndef MODULES_DESKTOP_CAPTURE_DESKTOP_AND_CURSOR_COMPOSER_H_ |
| 12 | #define MODULES_DESKTOP_CAPTURE_DESKTOP_AND_CURSOR_COMPOSER_H_ |
sergeyu@chromium.org | e6e749d | 2013-10-16 02:48:41 | [diff] [blame] | 13 | |
kwiberg | 2bb3afa | 2016-03-16 22:58:08 | [diff] [blame] | 14 | #include <memory> |
Salman Malik | 2492778 | 2022-03-31 14:32:24 | [diff] [blame] | 15 | #if defined(WEBRTC_USE_GIO) |
| 16 | #include "modules/desktop_capture/desktop_capture_metadata.h" |
| 17 | #endif // defined(WEBRTC_USE_GIO) |
Mirko Bonadei | 92ea95e | 2017-09-15 04:47:31 | [diff] [blame] | 18 | #include "modules/desktop_capture/desktop_capture_options.h" |
Yves Gerey | 3e70781 | 2018-11-28 15:47:49 | [diff] [blame] | 19 | #include "modules/desktop_capture/desktop_capture_types.h" |
Mirko Bonadei | 92ea95e | 2017-09-15 04:47:31 | [diff] [blame] | 20 | #include "modules/desktop_capture/desktop_capturer.h" |
Yves Gerey | 3e70781 | 2018-11-28 15:47:49 | [diff] [blame] | 21 | #include "modules/desktop_capture/desktop_frame.h" |
| 22 | #include "modules/desktop_capture/desktop_geometry.h" |
| 23 | #include "modules/desktop_capture/mouse_cursor.h" |
Mirko Bonadei | 92ea95e | 2017-09-15 04:47:31 | [diff] [blame] | 24 | #include "modules/desktop_capture/mouse_cursor_monitor.h" |
Yves Gerey | 3e70781 | 2018-11-28 15:47:49 | [diff] [blame] | 25 | #include "modules/desktop_capture/shared_memory.h" |
Mirko Bonadei | 3d25530 | 2018-10-11 08:50:45 | [diff] [blame] | 26 | #include "rtc_base/system/rtc_export.h" |
sergeyu@chromium.org | e6e749d | 2013-10-16 02:48:41 | [diff] [blame] | 27 | |
| 28 | namespace webrtc { |
| 29 | |
| 30 | // A wrapper for DesktopCapturer that also captures mouse using specified |
| 31 | // MouseCursorMonitor and renders it on the generated streams. |
Mirko Bonadei | 3d25530 | 2018-10-11 08:50:45 | [diff] [blame] | 32 | class RTC_EXPORT DesktopAndCursorComposer |
| 33 | : public DesktopCapturer, |
| 34 | public DesktopCapturer::Callback, |
| 35 | public MouseCursorMonitor::Callback { |
sergeyu@chromium.org | e6e749d | 2013-10-16 02:48:41 | [diff] [blame] | 36 | public: |
Jamie Walch | c380e97 | 2020-01-18 00:21:01 | [diff] [blame] | 37 | // Creates a new composer that captures mouse cursor using |
Zijie He | cd66a77 | 2017-07-21 21:13:46 | [diff] [blame] | 38 | // MouseCursorMonitor::Create(options) and renders it into the frames |
Artem Titov | cec4343 | 2021-07-28 21:35:39 | [diff] [blame] | 39 | // generated by `desktop_capturer`. |
Zijie He | cd66a77 | 2017-07-21 21:13:46 | [diff] [blame] | 40 | DesktopAndCursorComposer(std::unique_ptr<DesktopCapturer> desktop_capturer, |
| 41 | const DesktopCaptureOptions& options); |
| 42 | |
sergeyu | e183121 | 2016-10-26 20:15:42 | [diff] [blame] | 43 | ~DesktopAndCursorComposer() override; |
sergeyu@chromium.org | e6e749d | 2013-10-16 02:48:41 | [diff] [blame] | 44 | |
Byoungchan Lee | 604fd2f | 2022-01-21 00:49:39 | [diff] [blame] | 45 | DesktopAndCursorComposer(const DesktopAndCursorComposer&) = delete; |
| 46 | DesktopAndCursorComposer& operator=(const DesktopAndCursorComposer&) = delete; |
| 47 | |
Jamie Walch | c380e97 | 2020-01-18 00:21:01 | [diff] [blame] | 48 | // Creates a new composer that relies on an external source for cursor shape |
| 49 | // and position information via the MouseCursorMonitor::Callback interface. |
| 50 | static std::unique_ptr<DesktopAndCursorComposer> |
| 51 | CreateWithoutMouseCursorMonitor( |
| 52 | std::unique_ptr<DesktopCapturer> desktop_capturer); |
| 53 | |
sergeyu@chromium.org | e6e749d | 2013-10-16 02:48:41 | [diff] [blame] | 54 | // DesktopCapturer interface. |
kjellander@webrtc.org | 14665ff | 2015-03-04 12:58:35 | [diff] [blame] | 55 | void Start(DesktopCapturer::Callback* callback) override; |
sergeyu | cc9669c | 2016-02-09 23:13:26 | [diff] [blame] | 56 | void SetSharedMemoryFactory( |
kwiberg | 84be511 | 2016-04-27 08:19:58 | [diff] [blame] | 57 | std::unique_ptr<SharedMemoryFactory> shared_memory_factory) override; |
zijiehe | 91902cb | 2016-10-13 23:47:49 | [diff] [blame] | 58 | void CaptureFrame() override; |
kjellander@webrtc.org | 14665ff | 2015-03-04 12:58:35 | [diff] [blame] | 59 | void SetExcludedWindow(WindowId window) override; |
Jamie Walch | e6ca3b8 | 2020-02-18 20:55:09 | [diff] [blame] | 60 | bool GetSourceList(SourceList* sources) override; |
| 61 | bool SelectSource(SourceId id) override; |
| 62 | bool FocusOnSelectedSource() override; |
| 63 | bool IsOccluded(const DesktopVector& pos) override; |
Salman | 26340b0 | 2023-01-27 18:26:05 | [diff] [blame] | 64 | void SetMaxFrameRate(uint32_t max_frame_rate) override; |
Salman Malik | 2492778 | 2022-03-31 14:32:24 | [diff] [blame] | 65 | #if defined(WEBRTC_USE_GIO) |
| 66 | DesktopCaptureMetadata GetMetadata() override; |
| 67 | #endif // defined(WEBRTC_USE_GIO) |
sergeyu@chromium.org | e6e749d | 2013-10-16 02:48:41 | [diff] [blame] | 68 | |
Jamie Walch | c380e97 | 2020-01-18 00:21:01 | [diff] [blame] | 69 | // MouseCursorMonitor::Callback interface. |
| 70 | void OnMouseCursor(MouseCursor* cursor) override; |
| 71 | void OnMouseCursorPosition(const DesktopVector& position) override; |
| 72 | |
sergeyu@chromium.org | e6e749d | 2013-10-16 02:48:41 | [diff] [blame] | 73 | private: |
Zijie He | 85e6a4b | 2017-08-30 01:03:46 | [diff] [blame] | 74 | // Allows test cases to use a fake MouseCursorMonitor implementation. |
braveyao | 5a74ea0 | 2018-03-29 17:36:14 | [diff] [blame] | 75 | friend class DesktopAndCursorComposerTest; |
Zijie He | 85e6a4b | 2017-08-30 01:03:46 | [diff] [blame] | 76 | |
| 77 | // Constructor to delegate both deprecated and new constructors and allows |
| 78 | // test cases to use a fake MouseCursorMonitor implementation. |
| 79 | DesktopAndCursorComposer(DesktopCapturer* desktop_capturer, |
braveyao | 5a74ea0 | 2018-03-29 17:36:14 | [diff] [blame] | 80 | MouseCursorMonitor* mouse_monitor); |
Zijie He | 85e6a4b | 2017-08-30 01:03:46 | [diff] [blame] | 81 | |
sergeyu@chromium.org | e6e749d | 2013-10-16 02:48:41 | [diff] [blame] | 82 | // DesktopCapturer::Callback interface. |
Salman | 6ff7713 | 2023-01-27 22:58:35 | [diff] [blame] | 83 | void OnFrameCaptureStart() override; |
sergeyu | 5d91028 | 2016-06-07 23:41:58 | [diff] [blame] | 84 | void OnCaptureResult(DesktopCapturer::Result result, |
| 85 | std::unique_ptr<DesktopFrame> frame) override; |
sergeyu@chromium.org | e6e749d | 2013-10-16 02:48:41 | [diff] [blame] | 86 | |
Zijie He | cd66a77 | 2017-07-21 21:13:46 | [diff] [blame] | 87 | const std::unique_ptr<DesktopCapturer> desktop_capturer_; |
| 88 | const std::unique_ptr<MouseCursorMonitor> mouse_monitor_; |
sergeyu@chromium.org | e6e749d | 2013-10-16 02:48:41 | [diff] [blame] | 89 | |
| 90 | DesktopCapturer::Callback* callback_; |
| 91 | |
kwiberg | 2bb3afa | 2016-03-16 22:58:08 | [diff] [blame] | 92 | std::unique_ptr<MouseCursor> cursor_; |
sergeyu@chromium.org | e6e749d | 2013-10-16 02:48:41 | [diff] [blame] | 93 | DesktopVector cursor_position_; |
Jamie Walch | f3886ae | 2020-01-22 17:35:59 | [diff] [blame] | 94 | DesktopRect previous_cursor_rect_; |
| 95 | bool cursor_changed_ = false; |
sergeyu@chromium.org | e6e749d | 2013-10-16 02:48:41 | [diff] [blame] | 96 | }; |
| 97 | |
| 98 | } // namespace webrtc |
| 99 | |
Mirko Bonadei | 92ea95e | 2017-09-15 04:47:31 | [diff] [blame] | 100 | #endif // MODULES_DESKTOP_CAPTURE_DESKTOP_AND_CURSOR_COMPOSER_H_ |