summaryrefslogtreecommitdiffstats
path: root/src/plugins/directshow/camera/dscamerasession.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/directshow/camera/dscamerasession.cpp')
-rw-r--r--src/plugins/directshow/camera/dscamerasession.cpp78
1 files changed, 64 insertions, 14 deletions
diff --git a/src/plugins/directshow/camera/dscamerasession.cpp b/src/plugins/directshow/camera/dscamerasession.cpp
index dc0dfc8b3..9b642872a 100644
--- a/src/plugins/directshow/camera/dscamerasession.cpp
+++ b/src/plugins/directshow/camera/dscamerasession.cpp
@@ -51,24 +51,27 @@
#include "directshowcameraglobal.h"
#include "directshowmediatype.h"
#include "directshowutils.h"
+#include "directshowvideoprobecontrol.h"
QT_BEGIN_NAMESPACE
DSCameraSession::DSCameraSession(QObject *parent)
: QObject(parent)
- , m_graphBuilder(Q_NULLPTR)
- , m_filterGraph(Q_NULLPTR)
+ , m_graphBuilder(nullptr)
+ , m_filterGraph(nullptr)
, m_sourceDeviceName(QLatin1String("default"))
- , m_sourceFilter(Q_NULLPTR)
+ , m_sourceFilter(nullptr)
, m_needsHorizontalMirroring(false)
- , m_previewSampleGrabber(Q_NULLPTR)
- , m_nullRendererFilter(Q_NULLPTR)
+ , m_previewSampleGrabber(nullptr)
+ , m_nullRendererFilter(nullptr)
, m_previewStarted(false)
- , m_surface(Q_NULLPTR)
+ , m_surface(nullptr)
, m_previewPixelFormat(QVideoFrame::Format_Invalid)
, m_readyForCapture(false)
, m_imageIdCounter(0)
, m_currentImageId(-1)
+ , m_captureDestinations(QCameraImageCapture::CaptureToFile)
+ , m_videoProbeControl(nullptr)
, m_status(QCamera::UnloadedStatus)
{
connect(this, SIGNAL(statusChanged(QCamera::Status)),
@@ -354,6 +357,39 @@ bool DSCameraSession::getCameraControlInterface(IAMCameraControl **cameraControl
return true;
}
+bool DSCameraSession::isCaptureDestinationSupported(QCameraImageCapture::CaptureDestinations destination) const
+{
+ return destination & (QCameraImageCapture::CaptureToFile | QCameraImageCapture::CaptureToBuffer);
+}
+
+QCameraImageCapture::CaptureDestinations DSCameraSession::captureDestination() const
+{
+ return m_captureDestinations;
+}
+
+void DSCameraSession::setCaptureDestination(QCameraImageCapture::CaptureDestinations destinations)
+{
+ if (m_captureDestinations == destinations)
+ return;
+
+ m_captureDestinations = destinations;
+ Q_EMIT captureDestinationChanged(m_captureDestinations);
+}
+
+void DSCameraSession::addVideoProbe(DirectShowVideoProbeControl *probe)
+{
+ const QMutexLocker locker(&m_probeMutex);
+ m_videoProbeControl = probe;
+}
+
+void DSCameraSession::removeVideoProbe(DirectShowVideoProbeControl *probe)
+{
+ Q_UNUSED(probe);
+ Q_ASSERT(m_videoProbeControl == probe);
+ const QMutexLocker locker(&m_probeMutex);
+ m_videoProbeControl = nullptr;
+}
+
bool DSCameraSession::load()
{
unload();
@@ -547,6 +583,12 @@ void DSCameraSession::onFrameAvailable(double time, const QByteArray &data)
m_presentMutex.unlock();
+ {
+ const QMutexLocker locker(&m_probeMutex);
+ if (m_currentFrame.isValid() && m_videoProbeControl)
+ Q_EMIT m_videoProbeControl->videoFrameProbed(m_currentFrame);
+ }
+
// Image capture
QMutexLocker locker(&m_captureMutex);
if (m_currentImageId != -1 && !m_capturedFrame.isValid()) {
@@ -586,8 +628,8 @@ void DSCameraSession::presentFrame()
m_capturedFrame.unmap();
- QtConcurrent::run(this, &DSCameraSession::saveCapturedImage,
- m_currentImageId, captureImage, m_imageCaptureFileName);
+ QtConcurrent::run(this, &DSCameraSession::processCapturedImage,
+ m_currentImageId, m_captureDestinations, captureImage, m_imageCaptureFileName);
m_imageCaptureFileName.clear();
m_currentImageId = -1;
@@ -603,14 +645,22 @@ void DSCameraSession::presentFrame()
updateReadyForCapture();
}
-void DSCameraSession::saveCapturedImage(int id, const QImage &image, const QString &path)
+void DSCameraSession::processCapturedImage(int id,
+ QCameraImageCapture::CaptureDestinations captureDestinations,
+ const QImage &image,
+ const QString &path)
{
- if (image.save(path, "JPG")) {
- emit imageSaved(id, path);
- } else {
- emit captureError(id, QCameraImageCapture::ResourceError,
- tr("Could not save image to file."));
+ if (captureDestinations & QCameraImageCapture::CaptureToFile) {
+ if (image.save(path, "JPG")) {
+ Q_EMIT imageSaved(id, path);
+ } else {
+ Q_EMIT captureError(id, QCameraImageCapture::ResourceError,
+ tr("Could not save image to file."));
+ }
}
+
+ if (captureDestinations & QCameraImageCapture::CaptureToBuffer)
+ Q_EMIT imageAvailable(id, QVideoFrame(image));
}
bool DSCameraSession::createFilterGraph()