74 using namespace Qt::Literals::StringLiterals;
79 QMetaObject::invokeMethod(
84 QImageCapture::ResourceError,
85 QPlatformImageCapture::msgImageCaptureNotSet());
93 QMetaObject::invokeMethod(
98 QImageCapture::ResourceError,
99 u"No camera available."_s);
104 if (m_pendingImages.size() >= MaxPendingImagesCount) {
107 QMetaObject::invokeMethod(
112 QImageCapture::NotReadyError,
113 QPlatformImageCapture::msgCameraNotReady());
120 m_pendingImages.enqueue({ m_lastId, fileName, QMediaMetaData{} });
128 auto *captureSession =
static_cast<QFFmpegMediaCaptureSession *>(session);
129 if (m_session == captureSession)
133 m_session->disconnect(
this);
135 m_pendingImages.clear();
138 m_session = captureSession;
141 connect(m_session, &QFFmpegMediaCaptureSession::primaryActiveVideoSourceChanged,
this,
142 &QFFmpegImageCapture::onVideoSourceChanged);
149 if (m_pendingImages.empty()) {
151 "QImageCapture backend received an event to cancel a pending capture, "
152 "but no captures are pending. Most likely an internal Qt bug.";
156 PendingImage cancelledImage = m_pendingImages.dequeue();
158 emit QPlatformImageCapture::error(cancelledImage.id, error, errorMsg);
160 updateReadyForCapture();
176 if (m_pendingImages.empty())
179 auto pending = m_pendingImages.dequeue();
181 qCDebug(qLcImageCapture) <<
"Taking image" << pending.id;
183 emit imageExposed(pending.id);
185 emit imageMetadataAvailable(pending.id, pending.metaData);
186 emit imageAvailable(pending.id, frame);
187 QImage image = frame.toImage();
188 if (m_settings.resolution().isValid() && m_settings.resolution() != image.size())
189 image = image.scaled(m_settings.resolution());
191 emit imageCaptured(pending.id, image);
192 if (!pending.filename.isEmpty()) {
193 const char *fmt =
nullptr;
194 switch (m_settings.format()) {
195 case QImageCapture::UnspecifiedFormat:
196 case QImageCapture::JPEG:
199 case QImageCapture::PNG:
202 case QImageCapture::WebP:
205 case QImageCapture::Tiff:
210 switch (m_settings.quality()) {
211 case QImageCapture::VeryLowQuality:
214 case QImageCapture::LowQuality:
217 case QImageCapture::NormalQuality:
219 case QImageCapture::HighQuality:
222 case QImageCapture::VeryHighQuality:
227 QImageWriter writer(pending.filename, fmt);
228 writer.setQuality(quality);
230 if (writer.write(image)) {
231 emit imageSaved(pending.id, pending.filename);
233 QImageCapture::Error err = QImageCapture::ResourceError;
234 if (writer.error() == QImageWriter::UnsupportedFormatError)
235 err = QImageCapture::FormatError;
236 emit error(pending.id, err, writer.errorString());
276 const auto supportedFormats = QPlatformMediaIntegration::instance()->formatInfo()->imageFormats;
277 if (supportedFormats.isEmpty()) {
278 emit error(-1, QImageCapture::FormatError, u"No image formats supported, can't capture."_s);
281 if (s.format() == QImageCapture::UnspecifiedFormat) {
282 auto f = QImageCapture::JPEG;
283 if (!supportedFormats.contains(f))
284 f = supportedFormats.first();
286 }
else if (!supportedFormats.contains(settings.format())) {
287 emit error(-1, QImageCapture::FormatError, u"Image format not supported."_s);
291 m_settings = settings;