46 q23::expected<QMacScreenCaptureKit::CapturableItems, QString> enumerateResult =
47 QMacScreenCaptureKit::enumerateCapturableItems()
51 return q23::unexpected{ std::move(enumerateResult.error()) };
53 const std::vector<AVFScopedPointer<SCDisplay>> &displays = enumerateResult->displays;
54 auto it = ranges::find_if(
56 [&](
const AVFScopedPointer<SCDisplay> &item) {
57 return item.data().displayID == input;
59 if (it == displays.end())
60 return q23::unexpected(u"Display not found"_s);
63 return AVFScopedPointer<SCDisplay>{ [it->data() retain] };
68 const QMacScreenCaptureKit &macScreenCaptureKit)
77 &QMacScreenCaptureKit::newVideoFrameGenerated,
79 [&screenCapture](QMacScreenCaptureKit::StreamId, QVideoFrame videoFrame) {
80 emit screenCapture.newVideoFrame(videoFrame);
82 Qt::DirectConnection);
86 &QMacScreenCaptureKit::newVideoFrameGenerated,
88 [&screenCapture](QMacScreenCaptureKit::StreamId streamId, QVideoFrame newFrame) {
89 screenCapture.onNewFrameFormatReceived(streamId, newFrame.surfaceFormat());
91 Qt::QueuedConnection);
95 &QMacScreenCaptureKit::streamStoppedWithError,
97 &QSckScreenCapture::onStreamStoppedWithErrorEvent,
98 Qt::QueuedConnection);
121 QPlatformSurfaceCapture::Error err;
125 using TryStartResult = q23::expected<std::unique_ptr<ActiveData>, ErrorPair>;
127 auto tryStartStream = [&]() -> TryStartResult {
128 ScreenSource screen = QPlatformSurfaceCapture::source<ScreenSource>();
129 if (!QPlatformSurfaceCapture::checkScreenWithError(screen)) {
130 return q23::unexpected{ ErrorPair {
131 QPlatformSurfaceCapture::Error::NotFound,
132 u"Could not find selected screen"_s } };
135 auto *cocoaScreen = screen->nativeInterface<QNativeInterface::QCocoaScreen>();
137 qCWarning(qLcMacScreenCapture)
138 <<
"Failed to grab QNativeInterface::QCocoaScreen from QScreen";
139 return q23::unexpected{ ErrorPair{
140 QPlatformSurfaceCapture::Error::CaptureFailed,
141 u"Failed to start stream due to unknown issue"_s } };
144 CGDirectDisplayID cgDisplayId = displayIDForScreen(cocoaScreen->nativeScreen());
146 q23::expected<AVFScopedPointer<SCDisplay>, QString> scDisplayResult = findScDisplay(cgDisplayId);
147 if (!scDisplayResult) {
148 qCWarning(qLcMacScreenCapture)
149 <<
"Could not find associated SCDisplay:"
150 << scDisplayResult.error();
151 return q23::unexpected{ ErrorPair {
152 QPlatformSurfaceCapture::Error::NotFound,
153 u"Backend was unable to find selected QScreen"_s } };
156 QMacScreenCaptureKit::StreamId newStreamId = allocateStreamId();
158 AVFScopedPointer<SCDisplay> &scDisplay = *scDisplayResult;
161 m_session->onSourceActivating(*
this);
164 QMacScreenCaptureKit::CreateStreamInfo createInfo = {};
165 createInfo.streamId = newStreamId;
166 createInfo.connectionSetupFn = [&](QMacScreenCaptureKit &newObject) {
167 setupQMacScreenCaptureKitConnections(*
this, newObject);
169 createInfo.streamSettings.frameRate = frameRate();
170 createInfo.streamSettings.overrideIgnoreCursor = ignoreCursor();
171 createInfo.streamSettings.overrideIgnoreDropShadow = ignoreDropShadow();
172 using ResultType = q23::expected<std::unique_ptr<QMacScreenCaptureKit>, QString>;
173 std::future<ResultType> streamResultFuture = QMacScreenCaptureKit::createStreamFromDisplay(
176 ResultType streamResult = streamResultFuture.get();
179 m_session->onSourceActivationFailure(*
this);
181 qCWarning(qLcMacScreenCapture)
182 <<
"Failed to start screen capture stream: "
183 << streamResult.error();
184 return q23::unexpected{ ErrorPair{
185 QPlatformSurfaceCapture::Error::CaptureFailed,
186 u"Failed to start stream due to unknown issue"_s } };
189 std::unique_ptr<QMacScreenCaptureKit> &macScreenCaptureKit = *streamResult;
191 auto newActiveData = std::make_unique<ActiveData>();
192 newActiveData->macScreenCaptureKit = std::move(macScreenCaptureKit);
193 newActiveData->scDisplay = std::move(scDisplay);
194 newActiveData->streamId = newStreamId;
195 return newActiveData;
199 Q_ASSERT(!m_activeData);
201 TryStartResult result = tryStartStream();
203 const ErrorPair &error = result.error();
204 QPlatformSurfaceCapture::updateError(error.err, error.msg);
208 m_activeData = std::move(*result);
210 m_activeData.reset();
226 QMacScreenCaptureKit::StreamId incomingStreamId,
229 Q_ASSERT(thread()->isCurrentThread());
231 qCDebug(qLcMacScreenCapture)
233 <<
static_cast<int64_t>(incomingStreamId)
234 <<
"stopped with error:"
237 if (activeStreamId() != incomingStreamId)
242 m_activeData.reset();
243 m_videoFrameFormat.reset();
245 QPlatformSurfaceCapture::updateError(
246 Error::CaptureFailed,
247 u"The capture stream was closed by the system"_s);