KWin
Loading...
Searching...
No Matches
screencaststream.h
Go to the documentation of this file.
1/*
2 SPDX-FileCopyrightText: 2018-2020 Red Hat Inc
3 SPDX-FileCopyrightText: 2020 Aleix Pol Gonzalez <aleixpol@kde.org>
4 SPDX-FileContributor: Jan Grulich <jgrulich@redhat.com>
5
6 SPDX-License-Identifier: LGPL-2.0-or-later
7*/
8
9#pragma once
10
11#include "config-kwin.h"
12
14
15#include <QDateTime>
16#include <QHash>
17#include <QObject>
18#include <QRegion>
19#include <QSocketNotifier>
20#include <QTimer>
21#include <chrono>
22#include <memory>
23#include <optional>
24
25#include <pipewire/pipewire.h>
26#include <spa/param/format-utils.h>
27#include <spa/param/props.h>
28#include <spa/param/video/format-utils.h>
29
30namespace KWin
31{
32
33class Cursor;
34class ScreenCastDmaBufTexture;
35class EGLNativeFence;
36class GLTexture;
37class PipeWireCore;
38class ScreenCastSource;
39
41{
42 int planeCount = 0;
43 int width = 0;
44 int height = 0;
45 uint32_t format = 0;
46 uint64_t modifier = 0;
47};
48
49class KWIN_EXPORT ScreenCastStream : public QObject
50{
51 Q_OBJECT
52public:
53 explicit ScreenCastStream(ScreenCastSource *source, std::shared_ptr<PipeWireCore> pwCore, QObject *parent);
55
56 bool init();
57 uint framerate();
58 uint nodeId();
59 QString error() const
60 {
61 return m_error;
62 }
63
64 void stop();
65
70 void recordFrame(const QRegion &damagedRegion);
71
72 void setCursorMode(ScreencastV1Interface::CursorMode mode, qreal scale, const QRectF &viewport);
73
74public Q_SLOTS:
75 void invalidateCursor();
76 void recordCursor();
77 bool includesCursor(Cursor *cursor) const;
78
79Q_SIGNALS:
80 void streamReady(quint32 nodeId);
83
84private:
85 void onStreamParamChanged(uint32_t id, const struct spa_pod *format);
86 void onStreamStateChanged(pw_stream_state old, pw_stream_state state, const char *error_message);
87 void onStreamAddBuffer(pw_buffer *buffer);
88 void onStreamRemoveBuffer(pw_buffer *buffer);
89 void onStreamRenegotiateFormat(uint64_t);
90
91 bool createStream();
92 QList<const spa_pod *> buildFormats(bool fixate, char buffer[2048]);
93 void updateParams();
94 void coreFailed(const QString &errorMessage);
95 void sendCursorData(Cursor *cursor, spa_meta_cursor *spa_cursor);
96 void addHeader(spa_buffer *spaBuffer);
97 void addDamage(spa_buffer *spaBuffer, const QRegion &damagedRegion);
98 void newStreamParams();
99 void tryEnqueue(pw_buffer *buffer);
100 void enqueue();
101 spa_pod *buildFormat(struct spa_pod_builder *b, enum spa_video_format format, struct spa_rectangle *resolution,
102 struct spa_fraction *defaultFramerate, struct spa_fraction *minFramerate, struct spa_fraction *maxFramerate,
103 const QList<uint64_t> &modifiers, quint32 modifiersFlags);
104
105 std::optional<ScreenCastDmaBufTextureParams> testCreateDmaBuf(const QSize &size, quint32 format, const QList<uint64_t> &modifiers);
106 std::shared_ptr<ScreenCastDmaBufTexture> createDmaBufTexture(const ScreenCastDmaBufTextureParams &params);
107
108 std::shared_ptr<PipeWireCore> m_pwCore;
109 std::unique_ptr<ScreenCastSource> m_source;
110 struct pw_stream *m_pwStream = nullptr;
111 struct spa_source *m_pwRenegotiate = nullptr;
112 spa_hook m_streamListener;
113 pw_stream_events m_pwStreamEvents = {};
114
115 uint32_t m_pwNodeId = 0;
116
117 QSize m_resolution;
118 bool m_stopped = false;
119 bool m_streaming = false;
120
121 spa_video_info_raw m_videoFormat;
122 QString m_error;
123 QList<uint64_t> m_modifiers;
124 std::optional<ScreenCastDmaBufTextureParams> m_dmabufParams; // when fixated
125
126 struct
127 {
128 ScreencastV1Interface::CursorMode mode = ScreencastV1Interface::Hidden;
129 const QSize bitmapSize = QSize(256, 256);
130 qreal scale = 1;
131 QRectF viewport;
132 QRectF lastRect;
133 std::unique_ptr<GLTexture> texture;
134 bool visible = false;
135 bool invalid = true;
136 } m_cursor;
137
138 QHash<struct pw_buffer *, std::shared_ptr<ScreenCastDmaBufTexture>> m_dmabufDataForPwBuffer;
139
140 pw_buffer *m_pendingBuffer = nullptr;
141 std::unique_ptr<QSocketNotifier> m_pendingNotifier;
142 std::unique_ptr<EGLNativeFence> m_pendingFence;
143 quint64 m_sequential = 0;
144 bool m_hasDmaBuf = false;
145 bool m_waitForNewBuffers = false;
146 quint32 m_drmFormat = 0;
147
148 QDateTime m_lastSent;
149 QRegion m_pendingDamages;
150 QTimer m_pendingFrame;
151};
152
153} // namespace KWin
Replacement for QCursor.
Definition cursor.h:102
void streamReady(quint32 nodeId)
std::unique_ptr< GLTexture > texture