summaryrefslogtreecommitdiffstats
path: root/src/plugins/avfoundation/camera/avfimagecapturecontrol.mm
diff options
context:
space:
mode:
authorVal Doroshchuk <valentyn.doroshchuk@qt.io>2020-07-23 16:09:27 +0200
committerVal Doroshchuk <valentyn.doroshchuk@qt.io>2020-09-10 14:51:16 +0200
commitcdd87907722aff14c393dba02b7e43c924b60d06 (patch)
treea44b236839973ee090371cdb85cfe66ff967788f /src/plugins/avfoundation/camera/avfimagecapturecontrol.mm
parent7ebd95868747b304f1695fe1e7f25df73774b1dc (diff)
AVF: Introduce QCameraCaptureDestinationControl_iid
Can be used like: QCameraImageCapture->setCaptureDestination( QCameraImageCapture::CaptureToBuffer | QCameraImageCapture::CaptureToFile); Both CaptureToBuffer and CaptureToFile are supported. If CaptureToBuffer is requested, then it sends imageAvailble signal If CaptureToFile is requested, it sends imageSaved imageCaptured is sent only if there is the video frame available. (e.g. when abstract video surface is used as viewfinder) Pick-to: 5.15 Fixes: QTBUG-85470 Change-Id: If22281e4d0eacfb0d38f8b1c8b676191817f592e Reviewed-by: Ihor Dutchak <ihor.youw@gmail.com> Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
Diffstat (limited to 'src/plugins/avfoundation/camera/avfimagecapturecontrol.mm')
-rw-r--r--src/plugins/avfoundation/camera/avfimagecapturecontrol.mm31
1 files changed, 25 insertions, 6 deletions
diff --git a/src/plugins/avfoundation/camera/avfimagecapturecontrol.mm b/src/plugins/avfoundation/camera/avfimagecapturecontrol.mm
index 58d42bcaf..f2c019fdc 100644
--- a/src/plugins/avfoundation/camera/avfimagecapturecontrol.mm
+++ b/src/plugins/avfoundation/camera/avfimagecapturecontrol.mm
@@ -42,6 +42,8 @@
#include "avfcameraservice.h"
#include "avfcamerautility.h"
#include "avfcameracontrol.h"
+#include "avfcapturedestinationcontrol.h"
+#include <private/qmemoryvideobuffer_p.h>
#include <QtCore/qurl.h>
#include <QtCore/qfile.h>
@@ -111,12 +113,16 @@ int AVFImageCaptureControl::capture(const QString &fileName)
return m_lastCaptureId;
}
- QString actualFileName = m_storageLocation.generateFileName(fileName,
- QCamera::CaptureStillImage,
- QLatin1String("img_"),
- QLatin1String("jpg"));
+ auto destination = m_service->captureDestinationControl()->captureDestination();
+ QString actualFileName;
+ if (destination & QCameraImageCapture::CaptureToFile) {
+ actualFileName = m_storageLocation.generateFileName(fileName,
+ QCamera::CaptureStillImage,
+ QLatin1String("img_"),
+ QLatin1String("jpg"));
- qDebugCamera() << "Capture image to" << actualFileName;
+ qDebugCamera() << "Capture image to" << actualFileName;
+ }
CaptureRequest request = { m_lastCaptureId, QSharedPointer<QSemaphore>::create()};
m_requestsMutex.lock();
@@ -152,11 +158,24 @@ int AVFImageCaptureControl::capture(const QString &fileName)
// so we cannot reliably check the camera's status. Instead, we wait
// with a timeout and treat a failure to acquire a semaphore as an error.
if (!m_service->videoOutput() || request.previewReady->tryAcquire(1, 1000)) {
- qDebugCamera() << "Image capture completed:" << actualFileName;
+ qDebugCamera() << "Image capture completed";
NSData *nsJpgData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageSampleBuffer];
QByteArray jpgData = QByteArray::fromRawData((const char *)[nsJpgData bytes], [nsJpgData length]);
+ if (destination & QCameraImageCapture::CaptureToBuffer) {
+ QBuffer data(&jpgData);
+ QImageReader reader(&data, "JPEG");
+ QSize size = reader.size();
+ QVideoFrame frame(new QMemoryVideoBuffer(QByteArray(jpgData.constData(), jpgData.size()), -1), size, QVideoFrame::Format_Jpeg);
+ QMetaObject::invokeMethod(this, "imageAvailable", Qt::QueuedConnection,
+ Q_ARG(int, request.captureId),
+ Q_ARG(QVideoFrame, frame));
+ }
+
+ if (!(destination & QCameraImageCapture::CaptureToFile))
+ return;
+
QFile f(actualFileName);
if (f.open(QFile::WriteOnly)) {
if (f.write(jpgData) != -1) {