136 m_screenCapture = surfaceCapture;
137 if (surfaceCapture ==
nullptr) {
139 m_displaySurface =
"";
140 if (m_videoOutput && !m_videoOutput->currentVideoElement().isUndefined()) {
141 m_videoOutput->stop();
142 m_videoOutput->removeCurrentVideoElement();
144 m_mediaCaptureStream = emscripten::val::undefined();
146 m_displaySurface =
"browser";
148 static_cast<QWasmScreenCapture *>(m_screenCapture);
149 wasmScreenCapture->setCaptureSession(
this);
160 m_windowCapture = surfaceCapture;
162 if (surfaceCapture ==
nullptr) {
164 m_displaySurface =
"";
165 if (m_videoOutput && !m_videoOutput->currentVideoElement().isUndefined()) {
166 m_videoOutput->stop();
167 m_videoOutput->removeCurrentVideoElement();
172 m_displaySurface =
"window";
174 static_cast<QWasmWindowCapture *>(m_windowCapture);
175 wasmWindowCapture->setCaptureSession(
this);
181 m_displaySurface = surfacetype;
182 if (surfacetype.empty()) {
184 if (m_videoOutput && !m_videoOutput->currentVideoElement().isUndefined()) {
185 m_videoOutput->stop();
186 m_videoOutput->removeCurrentVideoElement();
188 m_mediaCaptureStream = emscripten::val::undefined();
191 emscripten::val navigator = emscripten::val::global(
"navigator");
192 emscripten::val mediaDevices = navigator[
"mediaDevices"];
194 if (mediaDevices.isNull() || mediaDevices.isUndefined()) {
195 qWarning() <<
"No media devices found";
198 m_videoOutput = std::make_unique<QWasmVideoOutput>();
199 m_videoOutput->setVideoMode(QWasmVideoOutput::SurfaceCapture);
201 m_videoOutput->setSurface(m_wasmSink);
203 emscripten::val constraints = emscripten::val::object();
204 emscripten::val videoConstraint = emscripten::val::object();
205 emscripten::val audioConstraint = emscripten::val::object();
207 videoConstraint.set(
"displaySurface", m_displaySurface);
208 videoConstraint.set(
"resizeMode", std::string(
"crop-and-scale"));
210 constraints.set(
"monitorTypeSurfaces", surfacetype ==
"window" ?
211 std::string(
"exclude") : std::string(
"include"));
213 constraints.set(
"surfaceSwitching", std::string(
"exclude"));
214 constraints.set(
"selfBrowserSurface",
"include");
216 constraints.set(
"logicalSurface",
true);
218 audioConstraint.set(
"systemAudio",
true);
220 constraints.set(
"video", videoConstraint);
221 constraints.set(
"audio", audioConstraint);
224 qstdweb::PromiseCallbacks getDisplayMediaCallback{
227 [
this](emscripten::val stream) {
228 qCDebug(qWasmMediaCaptureSession) <<
"getDisplayMediaSuccess"
230 if (stream.isUndefined() || stream.isNull()) {
231 qWarning() <<
"No media stream found error";
234 m_mediaCaptureStream = stream;
237 constexpr QSize initialSize(0, 0);
238 constexpr QRect initialRect(QPoint(0, 0), initialSize);
239 QUuid videoElementId = QUuid::createUuid();
241 m_videoOutput->createVideoElement(m_displaySurface +
"_capture_"
242 + videoElementId.toString(QUuid::WithoutBraces).toStdString());
243 m_videoOutput->doElementCallbacks();
244 m_videoOutput->updateVideoElementGeometry(initialRect);
247 if (m_displaySurface ==
"window") {
250 static_cast<QWasmWindowCapture *>(m_windowCapture);
253 QUuid uid(QString::fromStdString(stream[
"id"].as<std::string>()));
255 m_capuredWindows.push_back(QCapturableWindowPrivate::create(
256 static_cast<QCapturableWindowPrivate::Id>(uid.toByteArray().toLong()),
257 QString::fromStdString(stream[
"id"].as<std::string>())));
259 wasmWindowCapture->setVideoStream(stream);
260 Q_EMIT windowCaptureChanged();
264 static_cast<QWasmScreenCapture *>(m_screenCapture);
267 wasmScreenCapture->setVideoStream(stream);
268 Q_EMIT screenCaptureChanged();
272 [](emscripten::val error) {
273 qCDebug(qWasmMediaCaptureSession)
274 <<
"getDisplayMedia fail"
275 << QString::fromStdString(error[
"name"].as<std::string>())
276 << QString::fromStdString(error[
"message"].as<std::string>());
284 qstdweb::Promise::make(mediaDevices, QStringLiteral(
"getDisplayMedia"),
285 std::move(getDisplayMediaCallback), constraints);