74 qCDebug(qLcImageCapture) <<
"do capture";
78 QMetaObject::invokeMethod(
this,
"error", Qt::QueuedConnection,
80 Q_ARG(
int, QImageCapture::ResourceError),
81 Q_ARG(QString, QPlatformImageCapture::msgImageCaptureNotSet()));
83 qCDebug(qLcImageCapture) <<
"error 1";
89 QMetaObject::invokeMethod(
this,
"error", Qt::QueuedConnection,
91 Q_ARG(
int, QImageCapture::ResourceError),
92 Q_ARG(QString,tr(
"No camera available.")));
94 qCDebug(qLcImageCapture) <<
"error 2";
97 if (m_pendingImages.size() >= MaxPendingImagesCount) {
100 QMetaObject::invokeMethod(
this,
"error", Qt::QueuedConnection,
102 Q_ARG(
int, QImageCapture::NotReadyError),
103 Q_ARG(QString, QPlatformImageCapture::msgCameraNotReady()));
105 qCDebug(qLcImageCapture) <<
"error 3";
111 m_pendingImages.enqueue({ m_lastId, fileName, QMediaMetaData{} });
119 auto *captureSession =
static_cast<QFFmpegMediaCaptureSession *>(session);
120 if (m_session == captureSession)
124 m_session->disconnect(
this);
126 m_pendingImages.clear();
129 m_session = captureSession;
132 connect(m_session, &QFFmpegMediaCaptureSession::primaryActiveVideoSourceChanged,
this,
133 &QFFmpegImageCapture::onVideoSourceChanged);
140 if (m_pendingImages.empty()) {
142 "QImageCapture backend received an event to cancel a pending capture, "
143 "but no captures are pending. Most likely an internal Qt bug.";
147 PendingImage cancelledImage = m_pendingImages.dequeue();
149 emit QPlatformImageCapture::error(cancelledImage.id, error, errorMsg);
151 updateReadyForCapture();
167 if (m_pendingImages.empty())
170 auto pending = m_pendingImages.dequeue();
172 qCDebug(qLcImageCapture) <<
"Taking image" << pending.id;
174 emit imageExposed(pending.id);
176 emit imageMetadataAvailable(pending.id, pending.metaData);
177 emit imageAvailable(pending.id, frame);
178 QImage image = frame.toImage();
179 if (m_settings.resolution().isValid() && m_settings.resolution() != image.size())
180 image = image.scaled(m_settings.resolution());
182 emit imageCaptured(pending.id, image);
183 if (!pending.filename.isEmpty()) {
184 const char *fmt =
nullptr;
185 switch (m_settings.format()) {
186 case QImageCapture::UnspecifiedFormat:
187 case QImageCapture::JPEG:
190 case QImageCapture::PNG:
193 case QImageCapture::WebP:
196 case QImageCapture::Tiff:
201 switch (m_settings.quality()) {
202 case QImageCapture::VeryLowQuality:
205 case QImageCapture::LowQuality:
208 case QImageCapture::NormalQuality:
210 case QImageCapture::HighQuality:
213 case QImageCapture::VeryHighQuality:
218 QImageWriter writer(pending.filename, fmt);
219 writer.setQuality(quality);
221 if (writer.write(image)) {
222 emit imageSaved(pending.id, pending.filename);
224 QImageCapture::Error err = QImageCapture::ResourceError;
225 if (writer.error() == QImageWriter::UnsupportedFormatError)
226 err = QImageCapture::FormatError;
227 emit error(pending.id, err, writer.errorString());
267 const auto supportedFormats = QPlatformMediaIntegration::instance()->formatInfo()->imageFormats;
268 if (supportedFormats.isEmpty()) {
269 emit error(-1, QImageCapture::FormatError, u"No image formats supported, can't capture."_s);
272 if (s.format() == QImageCapture::UnspecifiedFormat) {
273 auto f = QImageCapture::JPEG;
274 if (!supportedFormats.contains(f))
275 f = supportedFormats.first();
277 }
else if (!supportedFormats.contains(settings.format())) {
278 emit error(-1, QImageCapture::FormatError, u"Image format not supported."_s);
282 m_settings = settings;