7#include "private/qabstractvideobuffer_p.h"
8#include "private/qplatformvideosink_p.h"
9#include <private/qmemoryvideobuffer_p.h>
10#include <private/qvideotexturehelper_p.h>
11#include <private/qwasmmediadevices_p.h>
16#include <emscripten/val.h>
17#include <emscripten/bind.h>
18#include <emscripten/html5.h>
22#include <private/qstdweb_p.h>
29 m_cameraIsReady(
false)
37 if (!cameras.isEmpty()) {
38 if (m_cameraDev.id().isEmpty())
39 setCamera(cameras.at(0));
41 setCamera(m_cameraDev);
47 m_cameraIsReady =
true;
48 if (m_cameraShouldStartActive) {
60 return m_cameraActive;
66 if (!m_CaptureSession) {
68 m_shouldBeActive =
true;
72 if (!m_cameraIsReady) {
73 m_cameraShouldStartActive =
true;
84 m_cameraActive = active;
85 m_shouldBeActive =
false;
88 m_cameraOutput->
start();
90 m_cameraOutput->
pause();
92 updateCameraFeatures();
103 constexpr QSize initialSize(0, 0);
104 constexpr QRect initialRect(
QPoint(0, 0), initialSize);
111 if (std::find(cameras.begin(), cameras.end(),
camera) != cameras.end()) {
113 createCamera(m_cameraDev);
118 if (cameras.count() > 0) {
120 createCamera(m_cameraDev);
137 if (m_CaptureSession == captureSession)
140 m_CaptureSession = captureSession;
142 if (m_shouldBeActive)
151 static constexpr std::string_view focusModeString =
"focusMode";
153 m_cameraOutput->
setDeviceSetting(focusModeString.data(), emscripten::val(
"manual"));
155 m_cameraOutput->
setDeviceSetting(focusModeString.data(), emscripten::val(
"continuous"));
162 if (caps.isUndefined())
165 emscripten::val
focusMode = caps[
"focusMode"];
169 std::vector<std::string> focalModes;
172 focalModes.push_back(
focusMode[
i].as<std::string>());
181 return std::find(focalModes.begin(), focalModes.end(),
"continuous") != focalModes.end()
182 || std::find(focalModes.begin(), focalModes.end(),
"single-shot")
190 found = std::find(focalModes.begin(), focalModes.end(),
"manual") != focalModes.end();
200 if (m_wasmTorchMode ==
mode)
203 static constexpr std::string_view torchModeString =
"torchMode";
204 bool hasChanged =
false;
207 m_cameraOutput->
setDeviceSetting(torchModeString.data(), emscripten::val(
false));
211 m_cameraOutput->
setDeviceSetting(torchModeString.data(), emscripten::val(
true));
217 m_wasmTorchMode =
mode;
224 if (!m_cameraIsReady)
228 if (caps.isUndefined())
244 if (m_wasmExposureMode ==
mode)
247 bool hasChanged =
false;
248 static constexpr std::string_view exposureModeString =
"exposureMode";
251 m_cameraOutput->
setDeviceSetting(exposureModeString.data(), emscripten::val(
"manual"));
255 m_cameraOutput->
setDeviceSetting(exposureModeString.data(), emscripten::val(
"continuous"));
263 m_wasmExposureMode =
mode;
270 if (!m_cameraIsReady)
274 if (caps.isUndefined())
281 std::vector<std::string> exposureModes;
289 found = std::find(exposureModes.begin(), exposureModes.end(),
"continuous")
290 != exposureModes.end();
293 found = std::find(exposureModes.begin(), exposureModes.end(),
"manual")
294 != exposureModes.end();
305 if (!m_cameraIsReady)
309 if (caps.isUndefined())
312 emscripten::val exposureComp = caps[
"exposureCompensation"];
313 if (exposureComp.isUndefined())
315 if (m_wasmExposureCompensation ==
bias)
318 static constexpr std::string_view exposureCompensationModeString =
"exposureCompensation";
320 m_wasmExposureCompensation =
bias;
326 if (m_wasmExposureTime == secs)
329 if (!m_cameraIsReady)
336 static constexpr std::string_view exposureTimeString =
"exposureTime";
337 m_cameraOutput->
setDeviceSetting(exposureTimeString.data(), emscripten::val(secs));
338 m_wasmExposureTime = secs;
344 if (!m_cameraIsReady)
348 if (caps.isUndefined())
351 emscripten::val isoSpeed = caps[
"iso"];
352 if (isoSpeed.isUndefined())
355 return isoSpeed.as<
double>();
360 if (!m_cameraIsReady)
364 if (caps.isUndefined())
367 emscripten::val isoSpeed = caps[
"iso"];
368 if (isoSpeed.isUndefined())
370 if (m_wasmIsoSensitivity == sens)
372 static constexpr std::string_view isoString =
"iso";
374 m_wasmIsoSensitivity = sens;
380 if (!m_cameraIsReady)
384 if (caps.isUndefined())
402 if (m_wasmWhiteBalanceMode ==
mode)
405 bool hasChanged =
false;
406 static constexpr std::string_view whiteBalanceModeString =
"whiteBalanceMode";
409 m_cameraOutput->
setDeviceSetting(whiteBalanceModeString.data(), emscripten::val(
"auto"));
413 m_cameraOutput->
setDeviceSetting(whiteBalanceModeString.data(), emscripten::val(
"manual"));
421 m_wasmWhiteBalanceMode =
mode;
428 if (!m_cameraIsReady)
432 if (caps.isUndefined())
438 if(m_wasmColorTemperature == temperature)
441 static constexpr std::string_view colorBalanceString =
"colorTemperature";
442 m_cameraOutput->
setDeviceSetting(colorBalanceString.data(), emscripten::val(temperature));
443 m_wasmColorTemperature = temperature;
452void QWasmCamera::updateCameraFeatures()
454 if (!m_cameraIsReady)
458 if (caps.isUndefined())
461 QCamera::Features cameraFeatures;
463 if (!caps[
"colorTemperature"].isUndefined())
466 if (!caps[
"exposureCompensation"].isUndefined())
469 if (!caps[
"iso"].isUndefined())
472 if (!caps[
"exposureTime"].isUndefined())
475 if (!caps[
"focusDistance"].isUndefined())
bool isEmpty() const noexcept
Returns true if the byte array has size 0; otherwise returns false.
The QCameraDevice class provides general information about camera devices.
QByteArray id
\qmlproperty string QtMultimedia::cameraDevice::id
The QCamera class provides interface for system camera devices.
WhiteBalanceMode
\value WhiteBalanceAuto Auto white balance mode.
TorchMode
\value TorchOff Torch is Off.
FocusMode
\value FocusModeAuto Continuous auto focus mode.
ExposureMode
\value ExposureAuto Automatic mode.
\inmodule QtCore\reentrant
\inmodule QtCore\reentrant
bool singleShot
whether the timer is a single-shot timer
The QVideoSink class represents a generic sink for video data.
bool isTorchModeSupported(QCamera::TorchMode mode) const override
void setManualExposureTime(float) override
void setExposureCompensation(float bias) override
void setColorTemperature(int temperature) override
int isoSensitivity() const override
void setWhiteBalanceMode(QCamera::WhiteBalanceMode mode) override
void setTorchMode(QCamera::TorchMode mode) override
bool isWhiteBalanceModeSupported(QCamera::WhiteBalanceMode mode) const override
void setExposureMode(QCamera::ExposureMode mode) override
bool setCameraFormat(const QCameraFormat &format) override
void setManualIsoSensitivity(int) override
void setFocusMode(QCamera::FocusMode mode) override
void setActive(bool active) override
bool isFocusModeSupported(QCamera::FocusMode mode) const override
bool isActive() const override
void setCaptureSession(QPlatformMediaCaptureSession *session) override
bool isExposureModeSupported(QCamera::ExposureMode mode) const override
void setCamera(const QCameraDevice &camera) override
void addCameraSourceElement(const std::string &id)
void updateVideoElementGeometry(const QRect &windowGeometry)
bool setDeviceSetting(const std::string &key, emscripten::val value)
emscripten::val getDeviceCapabilities()
void setVideoMode(QWasmVideoOutput::WasmVideoMode mode)
void createVideoElement(const std::string &id)
void setSurface(QVideoSink *surface)
void createOffscreenElement(const QSize &offscreenSize)
#define Q_LOGGING_CATEGORY(name,...)
GLint GLsizei GLsizei GLenum format
GLsizei GLenum GLboolean sink
#define QStringLiteral(str)
connect(quitButton, &QPushButton::clicked, &app, &QCoreApplication::quit, Qt::QueuedConnection)