38 Grabber(QGrabWindowSurfaceCapture &capture, QScreen *screen) :
Grabber(capture, screen,
nullptr)
43 Grabber(QGrabWindowSurfaceCapture &capture, WindowUPtr window)
52 Q_ASSERT(!m_screenRemovingLocked);
59 m_waitForFormat.wait(&m_formatMutex);
64 Grabber(QGrabWindowSurfaceCapture &capture, QScreen *screen, WindowUPtr window)
65 : QFFmpegSurfaceCaptureGrabber(
66 QGuiApplication::platformName() == QLatin1String(
"eglfs")
67 ? QFFmpegSurfaceCaptureGrabber::UseCurrentThread
68 : QFFmpegSurfaceCaptureGrabber::CreateGrabbingThread),
71 m_window(std::move(window))
73 connect(
qApp, &QGuiApplication::screenRemoved,
this, &
Grabber::onScreenRemoved);
74 addFrameCallback(m_capture, &QGrabWindowSurfaceCapture::newVideoFrame);
75 connect(
this, &Grabber::errorUpdated, &m_capture, &QGrabWindowSurfaceCapture::updateError);
78 void onScreenRemoved(QScreen *screen)
81
82
83
84
85
88 if (m_screenRemovingLocked) {
89 qDebug() <<
"Screen" << screen->name()
90 <<
"is removed while screen window grabbing lock is active";
93 while (m_screenRemovingLocked)
94 m_screenRemovingWc.wait(&m_screenRemovingMutex);
97 void setScreenRemovingLocked(
bool locked)
99 Q_ASSERT(locked != m_screenRemovingLocked);
103 m_screenRemovingLocked = locked;
107 m_screenRemovingWc.wakeAll();
110 void updateFormat(
const QVideoFrameFormat &format)
112 if (m_format && m_format->isValid())
120 m_waitForFormat.wakeAll();
125 setScreenRemovingLocked(
true);
126 auto screenGuard = qScopeGuard([
this] {
127 setScreenRemovingLocked(
false);
130 WId wid = m_window ? m_window->winId() : 0;
131 QScreen *screen = m_window ? m_window->screen() : m_screen ? m_screen.data() :
nullptr;
134 updateError(QPlatformSurfaceCapture::CaptureFailed, u"Screen not found"_s);
138 setFrameRate(screen->refreshRate());
140 QPixmap p = screen->grabWindow(wid);
141 auto buffer = std::make_unique<QImageVideoBuffer>(p.toImage());
142 const auto img = buffer->underlyingImage();
144 QVideoFrameFormat format(img.size(),
145 QVideoFrameFormat::pixelFormatFromImageFormat(img.format()));
146 format.setStreamFrameRate(screen->refreshRate());
147 updateFormat(format);
149 if (!format.isValid()) {
150 updateError(QPlatformSurfaceCapture::CaptureFailed,
151 u"Failed to grab the screen content"_s);
155 return QVideoFramePrivate::createFrame(std::move(buffer), std::move(format));
159 QGrabWindowSurfaceCapture &m_capture;
163 QMutex m_formatMutex;
164 QWaitCondition m_waitForFormat;
165 std::optional<QVideoFrameFormat> m_format;
167 QMutex m_screenRemovingMutex;
168 bool m_screenRemovingLocked =
false;
169 QWaitCondition m_screenRemovingWc;