137 m_screenCapture = surfaceCapture;
138 if (surfaceCapture ==
nullptr) {
140 m_displaySurface =
"";
141 if (m_videoOutput && !m_videoOutput->currentVideoElement().isUndefined()) {
142 m_videoOutput->stop();
143 m_videoOutput->removeCurrentVideoElement();
145 m_mediaCaptureStream = emscripten::val::undefined();
147 m_displaySurface =
"browser";
149 static_cast<QWasmScreenCapture *>(m_screenCapture);
150 wasmScreenCapture->setCaptureSession(
this);
182 m_displaySurface = surfacetype;
183 if (surfacetype.empty()) {
185 if (m_videoOutput && !m_videoOutput->currentVideoElement().isUndefined()) {
186 m_videoOutput->stop();
187 m_videoOutput->removeCurrentVideoElement();
189 m_mediaCaptureStream = emscripten::val::undefined();
192 emscripten::val navigator = emscripten::val::global(
"navigator");
193 emscripten::val mediaDevices = navigator[
"mediaDevices"];
195 if (mediaDevices.isNull() || mediaDevices.isUndefined()) {
196 qWarning() <<
"No media devices found";
199 m_videoOutput = std::make_unique<QWasmVideoOutput>();
200 m_videoOutput->setVideoMode(QWasmVideoOutput::SurfaceCapture);
202 m_videoOutput->setSurface(m_wasmSink);
204 emscripten::val constraints = emscripten::val::object();
205 emscripten::val videoConstraint = emscripten::val::object();
206 emscripten::val audioConstraint = emscripten::val::object();
208 videoConstraint.set(
"displaySurface", m_displaySurface);
209 videoConstraint.set(
"resizeMode", std::string(
"crop-and-scale"));
211 constraints.set(
"monitorTypeSurfaces", surfacetype ==
"window" ?
212 std::string(
"exclude") : std::string(
"include"));
214 constraints.set(
"surfaceSwitching", std::string(
"exclude"));
215 constraints.set(
"selfBrowserSurface",
"include");
217 constraints.set(
"logicalSurface",
true);
219 audioConstraint.set(
"systemAudio",
true);
221 constraints.set(
"video", videoConstraint);
222 constraints.set(
"audio", audioConstraint);
225 qstdweb::PromiseCallbacks getDisplayMediaCallback{
228 [
this](emscripten::val stream) {
229 qCDebug(qWasmMediaCaptureSession) <<
"getDisplayMediaSuccess"
231 if (stream.isUndefined() || stream.isNull()) {
232 qWarning() <<
"No media stream found error";
235 m_mediaCaptureStream = stream;
238 constexpr QSize initialSize(0, 0);
239 constexpr QRect initialRect(QPoint(0, 0), initialSize);
240 QUuid videoElementId = QUuid::createUuid();
242 m_videoOutput->createVideoElement(m_displaySurface +
"_capture_"
243 + videoElementId.toString(QUuid::WithoutBraces).toStdString());
244 m_videoOutput->doElementCallbacks();
245 m_videoOutput->createOffscreenElement(initialSize);
246 m_videoOutput->updateVideoElementGeometry(initialRect);
249 if (m_displaySurface ==
"window") {
252 static_cast<QWasmWindowCapture *>(m_windowCapture);
255 QUuid uid(QString::fromStdString(stream[
"id"].as<std::string>()));
257 m_capuredWindows.push_back(QCapturableWindowPrivate::create(
258 static_cast<QCapturableWindowPrivate::Id>(uid.toByteArray().toLong()),
259 QString::fromStdString(stream[
"id"].as<std::string>())));
261 wasmWindowCapture->setVideoStream(stream);
262 emit windowCaptureChanged();
266 static_cast<QWasmScreenCapture *>(m_screenCapture);
269 wasmScreenCapture->setVideoStream(stream);
270 emit screenCaptureChanged();
274 [](emscripten::val error) {
275 qCDebug(qWasmMediaCaptureSession)
276 <<
"getDisplayMedia fail"
277 << QString::fromStdString(error[
"name"].as<std::string>())
278 << QString::fromStdString(error[
"message"].as<std::string>());
285 qstdweb::Promise::make(mediaDevices, QStringLiteral(
"getDisplayMedia"),
286 std::move(getDisplayMediaCallback), constraints);