diff options
Diffstat (limited to 'src/plugins/directshow/camera')
-rw-r--r-- | src/plugins/directshow/camera/dscamerasession.cpp | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/src/plugins/directshow/camera/dscamerasession.cpp b/src/plugins/directshow/camera/dscamerasession.cpp index 9e1be9606..64532d04b 100644 --- a/src/plugins/directshow/camera/dscamerasession.cpp +++ b/src/plugins/directshow/camera/dscamerasession.cpp @@ -668,7 +668,7 @@ void DSCameraSession::onFrameAvailable(const char *frameData, long len) QMutexLocker locker(&m_captureMutex); if (m_currentImageId != -1 && !m_capturedFrame.isValid()) { m_capturedFrame = m_currentFrame; - emit imageExposed(m_currentImageId); + QMetaObject::invokeMethod(this, "imageExposed", Qt::QueuedConnection, Q_ARG(int, m_currentImageId)); } QMetaObject::invokeMethod(this, "presentFrame", Qt::QueuedConnection); @@ -685,6 +685,9 @@ void DSCameraSession::presentFrame() m_presentMutex.unlock(); + QImage captureImage; + int captureId; + m_captureMutex.lock(); if (m_capturedFrame.isValid()) { @@ -692,27 +695,31 @@ void DSCameraSession::presentFrame() m_capturedFrame.map(QAbstractVideoBuffer::ReadOnly); - QImage image = QImage(m_capturedFrame.bits(), - m_previewSize.width(), m_previewSize.height(), - QImage::Format_RGB32); + captureImage = QImage(m_capturedFrame.bits(), + m_previewSize.width(), m_previewSize.height(), + QImage::Format_RGB32); - image = image.mirrored(m_needsHorizontalMirroring); // also causes a deep copy of the data + captureImage = captureImage.mirrored(m_needsHorizontalMirroring); // also causes a deep copy of the data m_capturedFrame.unmap(); - emit imageCaptured(m_currentImageId, image); + captureId = m_currentImageId; QtConcurrent::run(this, &DSCameraSession::saveCapturedImage, - m_currentImageId, image, m_imageCaptureFileName); + m_currentImageId, captureImage, m_imageCaptureFileName); m_imageCaptureFileName.clear(); m_currentImageId = -1; - updateReadyForCapture(); m_capturedFrame = QVideoFrame(); } m_captureMutex.unlock(); + + if (!captureImage.isNull()) + emit imageCaptured(captureId, captureImage); + + updateReadyForCapture(); } void DSCameraSession::saveCapturedImage(int id, const QImage &image, const QString &path) |