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),
70 m_window(std::move(window))
72 connect(
qApp, &QGuiApplication::screenRemoved,
this, &
Grabber::onScreenRemoved);
73 addFrameCallback(&capture, &QGrabWindowSurfaceCapture::newVideoFrame);
74 connect(
this, &Grabber::errorUpdated, &capture, &QGrabWindowSurfaceCapture::updateError);
76 const auto defaultRate = screen ? qMin(screen->refreshRate(), DefaultScreenCaptureFrameRate)
77 : DefaultScreenCaptureFrameRate;
78 setFrameRate(capture.frameRate().value_or(defaultRate));
81 void onScreenRemoved(QScreen *screen)
84
85
86
87
88
91 if (m_screenRemovingLocked) {
92 qDebug() <<
"Screen" << screen->name()
93 <<
"is removed while screen window grabbing lock is active";
96 while (m_screenRemovingLocked)
97 m_screenRemovingWc.wait(&m_screenRemovingMutex);
100 void setScreenRemovingLocked(
bool locked)
102 Q_ASSERT(locked != m_screenRemovingLocked);
106 m_screenRemovingLocked = locked;
110 m_screenRemovingWc.wakeAll();
113 void updateFormat(
const QVideoFrameFormat &format)
115 if (m_format && m_format->isValid())
123 m_waitForFormat.wakeAll();
128 setScreenRemovingLocked(
true);
129 auto screenGuard = qScopeGuard([
this] {
130 setScreenRemovingLocked(
false);
133 WId wid = m_window ? m_window->winId() : 0;
134 QScreen *screen = m_window ? m_window->screen() : m_screen ? m_screen.data() :
nullptr;
137 updateError(QPlatformSurfaceCapture::CaptureFailed, u"Screen not found"_s);
141 QPixmap p = screen->grabWindow(wid);
142 auto buffer = std::make_unique<QImageVideoBuffer>(p.toImage());
143 const auto img = buffer->underlyingImage();
145 QVideoFrameFormat format(img.size(),
146 QVideoFrameFormat::pixelFormatFromImageFormat(img.format()));
147 format.setStreamFrameRate(frameRate());
148 updateFormat(format);
150 if (!format.isValid()) {
151 updateError(QPlatformSurfaceCapture::CaptureFailed,
152 u"Failed to grab the screen content"_s);
156 return QVideoFramePrivate::createFrame(std::move(buffer), std::move(format));
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;