178 m_displaySurface = surfacetype;
179 if (surfacetype.empty()) {
181 if (m_videoOutput && !m_videoOutput->currentVideoElement().isUndefined()) {
182 m_videoOutput->stop();
183 m_videoOutput->removeCurrentVideoElement();
187 emscripten::val navigator = emscripten::val::global(
"navigator");
188 emscripten::val mediaDevices = navigator[
"mediaDevices"];
190 if (mediaDevices.isNull() || mediaDevices.isUndefined()) {
191 qWarning() <<
"No media devices found";
194 m_videoOutput = std::make_unique<QWasmVideoOutput>();
195 m_videoOutput->setVideoMode(QWasmVideoOutput::SurfaceCapture);
197 m_videoOutput->setSurface(m_wasmSink);
199 emscripten::val constraints = emscripten::val::object();
200 emscripten::val videoConstraint = emscripten::val::object();
201 emscripten::val audioConstraint = emscripten::val::object();
203 videoConstraint.set(
"displaySurface", m_displaySurface);
204 videoConstraint.set(
"resizeMode", std::string(
"crop-and-scale"));
206 constraints.set(
"monitorTypeSurfaces", surfacetype ==
"window" ?
207 std::string(
"exclude") : std::string(
"include"));
209 constraints.set(
"surfaceSwitching", std::string(
"exclude"));
210 constraints.set(
"selfBrowserSurface",
"include");
212 constraints.set(
"logicalSurface",
true);
214 audioConstraint.set(
"systemAudio",
true);
216 constraints.set(
"video", videoConstraint);
217 constraints.set(
"audio", audioConstraint);
220 qstdweb::PromiseCallbacks getDisplayMediaCallback{
223 [
this](emscripten::val stream) {
224 qCDebug(qWasmMediaCaptureSession) <<
"getDisplayMediaSuccess"
226 if (stream.isUndefined() || stream.isNull()) {
227 qWarning() <<
"No media stream found error";
230 m_mediaCaptureStream = stream;
233 constexpr QSize initialSize(0, 0);
234 constexpr QRect initialRect(QPoint(0, 0), initialSize);
235 QUuid videoElementId = QUuid::createUuid();
237 m_videoOutput->createVideoElement(m_displaySurface +
"_capture_"
238 + videoElementId.toString(QUuid::WithoutBraces).toStdString());
239 m_videoOutput->doElementCallbacks();
240 m_videoOutput->createOffscreenElement(initialSize);
241 m_videoOutput->updateVideoElementGeometry(initialRect);
244 if (m_displaySurface ==
"window") {
247 static_cast<QWasmWindowCapture *>(m_windowCapture);
250 QUuid uid(QString::fromStdString(stream[
"id"].as<std::string>()));
252 m_capuredWindows.push_back(QCapturableWindowPrivate::create(
253 static_cast<QCapturableWindowPrivate::Id>(uid.toByteArray().toLong()),
254 QString::fromStdString(stream[
"id"].as<std::string>())));
256 wasmWindowCapture->setVideoStream(stream);
257 emit windowCaptureChanged();
261 static_cast<QWasmScreenCapture *>(m_screenCapture);
264 wasmScreenCapture->setVideoStream(stream);
265 emit screenCaptureChanged();
269 [](emscripten::val error) {
270 qCDebug(qWasmMediaCaptureSession)
271 <<
"getDisplayMedia fail"
272 << QString::fromStdString(error[
"name"].as<std::string>())
273 << QString::fromStdString(error[
"message"].as<std::string>());
280 qstdweb::Promise::make(mediaDevices, QStringLiteral(
"getDisplayMedia"),
281 std::move(getDisplayMediaCallback), constraints);