175 m_displaySurface = surfacetype;
176 if (surfacetype.empty()) {
178 if (m_videoOutput && !m_videoOutput->currentVideoElement().isUndefined()) {
179 m_videoOutput->stop();
180 m_videoOutput->removeCurrentVideoElement();
184 emscripten::val navigator = emscripten::val::global(
"navigator");
185 emscripten::val mediaDevices = navigator[
"mediaDevices"];
187 if (mediaDevices.isNull() || mediaDevices.isUndefined()) {
188 qWarning() <<
"No media devices found";
192 m_videoOutput = std::make_unique<QWasmVideoOutput>();
193 m_videoOutput->setVideoMode(QWasmVideoOutput::SurfaceCapture);
195 m_videoOutput->setSurface(m_wasmSink);
197 emscripten::val constraints = emscripten::val::object();
198 emscripten::val videoConstraint = emscripten::val::object();
199 emscripten::val audioConstraint = emscripten::val::object();
201 videoConstraint.set(
"displaySurface", m_displaySurface);
202 videoConstraint.set(
"resizeMode", std::string(
"crop-and-scale"));
204 constraints.set(
"monitorTypeSurfaces", surfacetype ==
"window" ?
205 std::string(
"exclude") : std::string(
"include"));
207 constraints.set(
"surfaceSwitching", std::string(
"exclude"));
208 constraints.set(
"selfBrowserSurface",
"include");
210 constraints.set(
"logicalSurface",
true);
212 audioConstraint.set(
"systemAudio",
true);
214 constraints.set(
"video", videoConstraint);
215 constraints.set(
"audio", audioConstraint);
218 qstdweb::PromiseCallbacks getDisplayMediaCallback{
221 [
this](emscripten::val stream) {
222 qCDebug(qWasmMediaCaptureSession) <<
"getDisplayMediaSuccess"
224 if (stream.isUndefined() || stream.isNull()) {
225 qWarning() <<
"No media stream found error";
228 m_mediaCaptureStream = stream;
231 constexpr QSize initialSize(0, 0);
232 constexpr QRect initialRect(QPoint(0, 0), initialSize);
233 QUuid videoElementId = QUuid::createUuid();
235 m_videoOutput->createVideoElement(m_displaySurface +
"_capture_"
236 + videoElementId.toString(QUuid::WithoutBraces).toStdString());
237 m_videoOutput->doElementCallbacks();
238 m_videoOutput->createOffscreenElement(initialSize);
239 m_videoOutput->updateVideoElementGeometry(initialRect);
242 if (m_displaySurface ==
"window") {
245 static_cast<QWasmWindowCapture *>(m_windowCapture);
246 wasmWindowCapture->setVideoOutput(m_videoOutput.get());
248 QUuid uid(QString::fromStdString(stream[
"id"].as<std::string>()));
250 m_capuredWindows.push_back(QCapturableWindowPrivate::create(
251 static_cast<QCapturableWindowPrivate::Id>(uid.toByteArray().toLong()),
252 QString::fromStdString(stream[
"id"].as<std::string>())));
254 wasmWindowCapture->setVideoStream(stream);
255 emit windowCaptureChanged();
259 static_cast<QWasmScreenCapture *>(m_screenCapture);
260 wasmScreenCapture->setVideoOutput(m_videoOutput.get());
262 wasmScreenCapture->setVideoStream(stream);
263 emit screenCaptureChanged();
267 [](emscripten::val error) {
268 qCDebug(qWasmMediaCaptureSession)
269 <<
"getDisplayMedia fail"
270 << QString::fromStdString(error[
"name"].as<std::string>())
271 << QString::fromStdString(error[
"message"].as<std::string>());
278 qstdweb::Promise::make(mediaDevices, QStringLiteral(
"getDisplayMedia"),
279 std::move(getDisplayMediaCallback), constraints);