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);
161 m_windowCapture = surfaceCapture;
163 if (surfaceCapture ==
nullptr) {
165 m_displaySurface =
"";
166 if (m_videoOutput && !m_videoOutput->currentVideoElement().isUndefined()) {
167 m_videoOutput->stop();
168 m_videoOutput->removeCurrentVideoElement();
173 m_displaySurface =
"window";
175 static_cast<QWasmWindowCapture *>(m_windowCapture);
176 wasmWindowCapture->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->updateVideoElementGeometry(initialRect);
248 if (m_displaySurface ==
"window") {
251 static_cast<QWasmWindowCapture *>(m_windowCapture);
254 QUuid uid(QString::fromStdString(stream[
"id"].as<std::string>()));
256 m_capuredWindows.push_back(QCapturableWindowPrivate::create(
257 static_cast<QCapturableWindowPrivate::Id>(uid.toByteArray().toLong()),
258 QString::fromStdString(stream[
"id"].as<std::string>())));
260 wasmWindowCapture->setVideoStream(stream);
261 emit windowCaptureChanged();
265 static_cast<QWasmScreenCapture *>(m_screenCapture);
268 wasmScreenCapture->setVideoStream(stream);
269 emit screenCaptureChanged();
273 [](emscripten::val error) {
274 qCDebug(qWasmMediaCaptureSession)
275 <<
"getDisplayMedia fail"
276 << QString::fromStdString(error[
"name"].as<std::string>())
277 << QString::fromStdString(error[
"message"].as<std::string>());
285 qstdweb::Promise::make(mediaDevices, QStringLiteral(
"getDisplayMedia"),
286 std::move(getDisplayMediaCallback), constraints);