Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qwasmimagecapture.cpp
Go to the documentation of this file.
1// Copyright (C) 2022 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
5#include <qimagewriter.h>
9#include <private/qstdweb_p.h>
10#include <QDir>
11
12#include <emscripten/val.h>
13
15
16using namespace Qt::Literals;
17
18Q_LOGGING_CATEGORY(qWasmImageCapture, "qt.multimedia.wasm.imagecapture")
19/* TODO
20signals:
21imageExposed
22*/
24
25QWasmImageCapture::~QWasmImageCapture() = default;
26
27int QWasmImageCapture::capture(const QString &fileName)
28{
30 emit error(m_lastId, QImageCapture::NotReadyError, msgCameraNotReady());
31 return -1;
32 }
33
34 QString imageFilenName;
35 if (fileName.isEmpty())
36 imageFilenName = QDir::homePath() + u"/image.jpg"_s;
37 else
38 imageFilenName = fileName;
39
40 QImage image = takePicture();
41 if (image.isNull())
42 return -1;
43
44 QImageWriter writer(imageFilenName);
45 // TODO
46 // writer.setQuality(quality);
47 // writer.setFormat("png");
48
49 if (writer.write(image)) {
50 qCDebug(qWasmImageCapture) << Q_FUNC_INFO << "image saved";
51 emit imageSaved(m_lastId, fileName);
52 } else {
53 QImageCapture::Error err = (writer.error() == QImageWriter::UnsupportedFormatError)
54 ? QImageCapture::FormatError
55 : QImageCapture::ResourceError;
56
57 emit error(m_lastId, err, writer.errorString());
58 }
59
60 return m_lastId;
61}
62
64{
66 emit error(m_lastId, QImageCapture::NotReadyError, msgCameraNotReady());
67 return -1;
68 }
69
70 QImage image = takePicture();
71 if (image.isNull())
72 return -1;
73
74 emit imageCaptured(m_lastId, image);
75 return m_lastId;
76}
77
78QImage QWasmImageCapture::takePicture()
79{
80 m_lastId++;
81
82 // Try the fast path: grab the current frame and convert via RHI.
83 QVideoFrame thisFrame = m_captureSession->videoSink()->videoFrame();
84 QImage image;
85 if (thisFrame.isValid()) {
86 emit imageAvailable(m_lastId, thisFrame);
87 image = thisFrame.toImage();
88 }
89
90 if (image.isNull()) {
91 qCDebug(qWasmImageCapture) << Q_FUNC_INFO << "image capture failed";
92 emit error(m_lastId, QImageCapture::ResourceError, QStringLiteral("Capture failed"));
93 return QImage();
94 }
95
96 emit imageCaptured(m_lastId, image);
97 if (m_settings.resolution().isValid() && m_settings.resolution() != image.size())
98 image = image.scaled(m_settings.resolution());
99
100 return image;
101}
102
104{
105 return m_isReadyForCapture;
106}
107
109{
110 return m_settings;
111}
112
113void QWasmImageCapture::setImageSettings(const QImageEncoderSettings &settings)
114{
115 m_settings = settings;
116}
117
119{
120 if (m_isReadyForCapture != isReady) {
121 m_isReadyForCapture = isReady;
122 emit readyForCaptureChanged(m_isReadyForCapture);
123 }
124}
125
126void QWasmImageCapture::setCaptureSession(QPlatformMediaCaptureSession *session)
127{
128 QWasmMediaCaptureSession *captureSession = static_cast<QWasmMediaCaptureSession *>(session);
129 // nullptr clears
130 if (m_captureSession == captureSession)
131 return;
132
133 if (captureSession) {
134 m_lastId = 0;
135 m_captureSession = captureSession;
136 }
137 m_captureSession = captureSession;
138}
139
140QT_END_NAMESPACE
\inmodule QtMultimedia
QObject * parent
Definition qobject.h:74
The QVideoFrame class represents a frame of video data.
Definition qvideoframe.h:27
int capture(const QString &fileName) override
void setReadyForCapture(bool isReady)
bool isReadyForCapture() const override
void setImageSettings(const QImageEncoderSettings &settings) override
void setCaptureSession(QPlatformMediaCaptureSession *session)
QImageEncoderSettings imageSettings() const override
int captureToBuffer() override
Combined button and popup list for selecting options.
Q_LOGGING_CATEGORY(lcEventDispatcher, "qt.eventdispatcher")