blob: 28ea25c8c9c3bbd2e1bd236ccfd33a5a93de2024 [file] [log] [blame]
sergeyu@chromium.orge6e749d2013-10-16 02:48:411/*
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 Bonadei92ea95e2017-09-15 04:47:3111#ifndef MODULES_DESKTOP_CAPTURE_DESKTOP_AND_CURSOR_COMPOSER_H_
12#define MODULES_DESKTOP_CAPTURE_DESKTOP_AND_CURSOR_COMPOSER_H_
sergeyu@chromium.orge6e749d2013-10-16 02:48:4113
kwiberg2bb3afa2016-03-16 22:58:0814#include <memory>
Salman Malik24927782022-03-31 14:32:2415#if defined(WEBRTC_USE_GIO)
16#include "modules/desktop_capture/desktop_capture_metadata.h"
17#endif // defined(WEBRTC_USE_GIO)
Mirko Bonadei92ea95e2017-09-15 04:47:3118#include "modules/desktop_capture/desktop_capture_options.h"
Yves Gerey3e707812018-11-28 15:47:4919#include "modules/desktop_capture/desktop_capture_types.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3120#include "modules/desktop_capture/desktop_capturer.h"
Yves Gerey3e707812018-11-28 15:47:4921#include "modules/desktop_capture/desktop_frame.h"
22#include "modules/desktop_capture/desktop_geometry.h"
23#include "modules/desktop_capture/mouse_cursor.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3124#include "modules/desktop_capture/mouse_cursor_monitor.h"
Yves Gerey3e707812018-11-28 15:47:4925#include "modules/desktop_capture/shared_memory.h"
Mirko Bonadei3d255302018-10-11 08:50:4526#include "rtc_base/system/rtc_export.h"
sergeyu@chromium.orge6e749d2013-10-16 02:48:4127
28namespace webrtc {
29
30// A wrapper for DesktopCapturer that also captures mouse using specified
31// MouseCursorMonitor and renders it on the generated streams.
Mirko Bonadei3d255302018-10-11 08:50:4532class RTC_EXPORT DesktopAndCursorComposer
33 : public DesktopCapturer,
34 public DesktopCapturer::Callback,
35 public MouseCursorMonitor::Callback {
sergeyu@chromium.orge6e749d2013-10-16 02:48:4136 public:
Jamie Walchc380e972020-01-18 00:21:0137 // Creates a new composer that captures mouse cursor using
Zijie Hecd66a772017-07-21 21:13:4638 // MouseCursorMonitor::Create(options) and renders it into the frames
Artem Titovcec43432021-07-28 21:35:3939 // generated by `desktop_capturer`.
Zijie Hecd66a772017-07-21 21:13:4640 DesktopAndCursorComposer(std::unique_ptr<DesktopCapturer> desktop_capturer,
41 const DesktopCaptureOptions& options);
42
sergeyue1831212016-10-26 20:15:4243 ~DesktopAndCursorComposer() override;
sergeyu@chromium.orge6e749d2013-10-16 02:48:4144
Byoungchan Lee604fd2f2022-01-21 00:49:3945 DesktopAndCursorComposer(const DesktopAndCursorComposer&) = delete;
46 DesktopAndCursorComposer& operator=(const DesktopAndCursorComposer&) = delete;
47
Jamie Walchc380e972020-01-18 00:21:0148 // 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.orge6e749d2013-10-16 02:48:4154 // DesktopCapturer interface.
kjellander@webrtc.org14665ff2015-03-04 12:58:3555 void Start(DesktopCapturer::Callback* callback) override;
sergeyucc9669c2016-02-09 23:13:2656 void SetSharedMemoryFactory(
kwiberg84be5112016-04-27 08:19:5857 std::unique_ptr<SharedMemoryFactory> shared_memory_factory) override;
zijiehe91902cb2016-10-13 23:47:4958 void CaptureFrame() override;
kjellander@webrtc.org14665ff2015-03-04 12:58:3559 void SetExcludedWindow(WindowId window) override;
Jamie Walche6ca3b82020-02-18 20:55:0960 bool GetSourceList(SourceList* sources) override;
61 bool SelectSource(SourceId id) override;
62 bool FocusOnSelectedSource() override;
63 bool IsOccluded(const DesktopVector& pos) override;
Salman26340b02023-01-27 18:26:0564 void SetMaxFrameRate(uint32_t max_frame_rate) override;
Salman Malik24927782022-03-31 14:32:2465#if defined(WEBRTC_USE_GIO)
66 DesktopCaptureMetadata GetMetadata() override;
67#endif // defined(WEBRTC_USE_GIO)
sergeyu@chromium.orge6e749d2013-10-16 02:48:4168
Jamie Walchc380e972020-01-18 00:21:0169 // MouseCursorMonitor::Callback interface.
70 void OnMouseCursor(MouseCursor* cursor) override;
71 void OnMouseCursorPosition(const DesktopVector& position) override;
72
sergeyu@chromium.orge6e749d2013-10-16 02:48:4173 private:
Zijie He85e6a4b2017-08-30 01:03:4674 // Allows test cases to use a fake MouseCursorMonitor implementation.
braveyao5a74ea02018-03-29 17:36:1475 friend class DesktopAndCursorComposerTest;
Zijie He85e6a4b2017-08-30 01:03:4676
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,
braveyao5a74ea02018-03-29 17:36:1480 MouseCursorMonitor* mouse_monitor);
Zijie He85e6a4b2017-08-30 01:03:4681
sergeyu@chromium.orge6e749d2013-10-16 02:48:4182 // DesktopCapturer::Callback interface.
Salman6ff77132023-01-27 22:58:3583 void OnFrameCaptureStart() override;
sergeyu5d910282016-06-07 23:41:5884 void OnCaptureResult(DesktopCapturer::Result result,
85 std::unique_ptr<DesktopFrame> frame) override;
sergeyu@chromium.orge6e749d2013-10-16 02:48:4186
Zijie Hecd66a772017-07-21 21:13:4687 const std::unique_ptr<DesktopCapturer> desktop_capturer_;
88 const std::unique_ptr<MouseCursorMonitor> mouse_monitor_;
sergeyu@chromium.orge6e749d2013-10-16 02:48:4189
90 DesktopCapturer::Callback* callback_;
91
kwiberg2bb3afa2016-03-16 22:58:0892 std::unique_ptr<MouseCursor> cursor_;
sergeyu@chromium.orge6e749d2013-10-16 02:48:4193 DesktopVector cursor_position_;
Jamie Walchf3886ae2020-01-22 17:35:5994 DesktopRect previous_cursor_rect_;
95 bool cursor_changed_ = false;
sergeyu@chromium.orge6e749d2013-10-16 02:48:4196};
97
98} // namespace webrtc
99
Mirko Bonadei92ea95e2017-09-15 04:47:31100#endif // MODULES_DESKTOP_CAPTURE_DESKTOP_AND_CURSOR_COMPOSER_H_