diff options
author | Val Doroshchuk <valentyn.doroshchuk@qt.io> | 2020-07-23 16:09:27 +0200 |
---|---|---|
committer | Val Doroshchuk <valentyn.doroshchuk@qt.io> | 2020-09-10 14:51:16 +0200 |
commit | cdd87907722aff14c393dba02b7e43c924b60d06 (patch) | |
tree | a44b236839973ee090371cdb85cfe66ff967788f /src/plugins/avfoundation/camera/avfimagecapturecontrol.mm | |
parent | 7ebd95868747b304f1695fe1e7f25df73774b1dc (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.mm | 31 |
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) { |