134 m_screenCapture = surfaceCapture;
135 if (surfaceCapture ==
nullptr) {
137 m_displaySurface =
"";
138 if (m_videoOutput && !m_videoOutput->currentVideoElement().isUndefined()) {
139 m_videoOutput->stop();
140 m_videoOutput->removeCurrentVideoElement();
142 m_mediaCaptureStream = emscripten::val::undefined();
144 m_displaySurface =
"browser";
146 static_cast<QWasmScreenCapture *>(m_screenCapture);
147 wasmScreenCapture->setCaptureSession(
this);
179 m_displaySurface = surfacetype;
180 if (surfacetype.empty()) {
182 if (m_videoOutput && !m_videoOutput->currentVideoElement().isUndefined()) {
183 m_videoOutput->stop();
184 m_videoOutput->removeCurrentVideoElement();
186 m_mediaCaptureStream = emscripten::val::undefined();
189 emscripten::val navigator = emscripten::val::global(
"navigator");
190 emscripten::val mediaDevices = navigator[
"mediaDevices"];
192 if (mediaDevices.isNull() || mediaDevices.isUndefined()) {
193 qWarning() <<
"No media devices found";
196 m_videoOutput = std::make_unique<QWasmVideoOutput>();
197 m_videoOutput->setVideoMode(QWasmVideoOutput::SurfaceCapture);
199 m_videoOutput->setSurface(m_wasmSink);
201 emscripten::val constraints = emscripten::val::object();
202 emscripten::val videoConstraint = emscripten::val::object();
203 emscripten::val audioConstraint = emscripten::val::object();
205 videoConstraint.set(
"displaySurface", m_displaySurface);
206 videoConstraint.set(
"resizeMode", std::string(
"crop-and-scale"));
208 constraints.set(
"monitorTypeSurfaces", surfacetype ==
"window" ?
209 std::string(
"exclude") : std::string(
"include"));
211 constraints.set(
"surfaceSwitching", std::string(
"exclude"));
212 constraints.set(
"selfBrowserSurface",
"include");
214 constraints.set(
"logicalSurface",
true);
216 audioConstraint.set(
"systemAudio",
true);
218 constraints.set(
"video", videoConstraint);
219 constraints.set(
"audio", audioConstraint);
222 qstdweb::PromiseCallbacks getDisplayMediaCallback{
225 [
this](emscripten::val stream) {
226 qCDebug(qWasmMediaCaptureSession) <<
"getDisplayMediaSuccess"
228 if (stream.isUndefined() || stream.isNull()) {
229 qWarning() <<
"No media stream found error";
232 m_mediaCaptureStream = stream;
235 constexpr QSize initialSize(0, 0);
236 constexpr QRect initialRect(QPoint(0, 0), initialSize);
237 QUuid videoElementId = QUuid::createUuid();
239 m_videoOutput->createVideoElement(m_displaySurface +
"_capture_"
240 + videoElementId.toString(QUuid::WithoutBraces).toStdString());
241 m_videoOutput->doElementCallbacks();
242 m_videoOutput->createOffscreenElement(initialSize);
243 m_videoOutput->updateVideoElementGeometry(initialRect);
246 if (m_displaySurface ==
"window") {
249 static_cast<QWasmWindowCapture *>(m_windowCapture);
252 QUuid uid(QString::fromStdString(stream[
"id"].as<std::string>()));
254 m_capuredWindows.push_back(QCapturableWindowPrivate::create(
255 static_cast<QCapturableWindowPrivate::Id>(uid.toByteArray().toLong()),
256 QString::fromStdString(stream[
"id"].as<std::string>())));
258 wasmWindowCapture->setVideoStream(stream);
259 emit windowCaptureChanged();
263 static_cast<QWasmScreenCapture *>(m_screenCapture);
266 wasmScreenCapture->setVideoStream(stream);
267 emit screenCaptureChanged();
271 [](emscripten::val error) {
272 qCDebug(qWasmMediaCaptureSession)
273 <<
"getDisplayMedia fail"
274 << QString::fromStdString(error[
"name"].as<std::string>())
275 << QString::fromStdString(error[
"message"].as<std::string>());
282 qstdweb::Promise::make(mediaDevices, QStringLiteral(
"getDisplayMedia"),
283 std::move(getDisplayMediaCallback), constraints);