summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorChristian Stromme <christian.stromme@qt.io>2016-12-06 18:25:24 +0100
committerChristian Stromme <christian.stromme@qt.io>2018-01-22 20:50:21 +0000
commite2bcf5d44e5f0217605c3fdf9b1e7c0b4a3bee73 (patch)
treeaec6f075971ab21bb99ab1f8abdc28fea0b4bec9 /src
parentc20d3fa8c42d3ea0a088f208b55dfc66b58f6674 (diff)
DirectShow: Add video probe support for the camera
This change makes it possible to use the QVideoProbe class with the camera. [ChangeLog][DirectShow] Added support for video probes in the camera. Change-Id: Ib353e80e68ea2dcc5b33fd81863f4b6613257e45 Reviewed-by: Andy Shaw <andy.shaw@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/plugins/directshow/camera/dscameraservice.cpp20
-rw-r--r--src/plugins/directshow/camera/dscameraservice.h2
-rw-r--r--src/plugins/directshow/camera/dscamerasession.cpp22
-rw-r--r--src/plugins/directshow/camera/dscamerasession.h8
4 files changed, 52 insertions, 0 deletions
diff --git a/src/plugins/directshow/camera/dscameraservice.cpp b/src/plugins/directshow/camera/dscameraservice.cpp
index 71c0f685a..b4031c829 100644
--- a/src/plugins/directshow/camera/dscameraservice.cpp
+++ b/src/plugins/directshow/camera/dscameraservice.cpp
@@ -51,6 +51,7 @@
#include "directshowcameraexposurecontrol.h"
#include "directshowcameracapturedestinationcontrol.h"
#include "directshowcameracapturebufferformatcontrol.h"
+#include "directshowvideoprobecontrol.h"
QT_BEGIN_NAMESPACE
@@ -66,6 +67,7 @@ DSCameraService::DSCameraService(QObject *parent):
, m_exposureControl(new DirectShowCameraExposureControl(m_session))
, m_captureDestinationControl(new DirectShowCameraCaptureDestinationControl(m_session))
, m_captureBufferFormatControl(new DirectShowCameraCaptureBufferFormatControl)
+ , m_videoProbeControl(nullptr)
{
}
@@ -81,6 +83,7 @@ DSCameraService::~DSCameraService()
delete m_exposureControl;
delete m_captureDestinationControl;
delete m_captureBufferFormatControl;
+ delete m_videoProbeControl;
}
QMediaControl* DSCameraService::requestControl(const char *name)
@@ -116,6 +119,15 @@ QMediaControl* DSCameraService::requestControl(const char *name)
if (qstrcmp(name, QCameraCaptureBufferFormatControl_iid) == 0)
return m_captureBufferFormatControl;
+ if (qstrcmp(name, QMediaVideoProbeControl_iid) == 0) {
+ if (!m_videoProbeControl)
+ m_videoProbeControl = new DirectShowVideoProbeControl;
+
+ m_videoProbeControl->ref();
+ m_session->addVideoProbe(m_videoProbeControl);
+ return m_videoProbeControl;
+ }
+
return 0;
}
@@ -126,6 +138,14 @@ void DSCameraService::releaseControl(QMediaControl *control)
m_videoRenderer = 0;
return;
}
+
+ if (control == m_videoProbeControl) {
+ m_session->removeVideoProbe(m_videoProbeControl);
+ if (!m_videoProbeControl->deref()) {
+ delete m_videoProbeControl;
+ m_videoProbeControl = nullptr;
+ }
+ }
}
QT_END_NAMESPACE
diff --git a/src/plugins/directshow/camera/dscameraservice.h b/src/plugins/directshow/camera/dscameraservice.h
index bf2e31435..b437a2c10 100644
--- a/src/plugins/directshow/camera/dscameraservice.h
+++ b/src/plugins/directshow/camera/dscameraservice.h
@@ -55,6 +55,7 @@ class DSCameraImageProcessingControl;
class DirectShowCameraExposureControl;
class DirectShowCameraCaptureDestinationControl;
class DirectShowCameraCaptureBufferFormatControl;
+class DirectShowVideoProbeControl;
class DSCameraService : public QMediaService
{
@@ -78,6 +79,7 @@ private:
DirectShowCameraExposureControl *m_exposureControl;
DirectShowCameraCaptureDestinationControl *m_captureDestinationControl;
DirectShowCameraCaptureBufferFormatControl *m_captureBufferFormatControl;
+ DirectShowVideoProbeControl *m_videoProbeControl;
};
QT_END_NAMESPACE
diff --git a/src/plugins/directshow/camera/dscamerasession.cpp b/src/plugins/directshow/camera/dscamerasession.cpp
index 82125d4f6..9b642872a 100644
--- a/src/plugins/directshow/camera/dscamerasession.cpp
+++ b/src/plugins/directshow/camera/dscamerasession.cpp
@@ -51,6 +51,7 @@
#include "directshowcameraglobal.h"
#include "directshowmediatype.h"
#include "directshowutils.h"
+#include "directshowvideoprobecontrol.h"
QT_BEGIN_NAMESPACE
@@ -70,6 +71,7 @@ DSCameraSession::DSCameraSession(QObject *parent)
, m_imageIdCounter(0)
, m_currentImageId(-1)
, m_captureDestinations(QCameraImageCapture::CaptureToFile)
+ , m_videoProbeControl(nullptr)
, m_status(QCamera::UnloadedStatus)
{
connect(this, SIGNAL(statusChanged(QCamera::Status)),
@@ -374,6 +376,20 @@ void DSCameraSession::setCaptureDestination(QCameraImageCapture::CaptureDestinat
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();
@@ -567,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()) {
diff --git a/src/plugins/directshow/camera/dscamerasession.h b/src/plugins/directshow/camera/dscamerasession.h
index 85bddbc9e..e28015534 100644
--- a/src/plugins/directshow/camera/dscamerasession.h
+++ b/src/plugins/directshow/camera/dscamerasession.h
@@ -77,6 +77,7 @@ struct ICaptureGraphBuilder2;
QT_BEGIN_NAMESPACE
class DirectShowSampleGrabber;
+class DirectShowVideoProbeControl;
class DSCameraSession : public QObject
{
@@ -125,6 +126,9 @@ public:
QCameraImageCapture::CaptureDestinations captureDestination() const;
void setCaptureDestination(QCameraImageCapture::CaptureDestinations destinations);
+ void addVideoProbe(DirectShowVideoProbeControl *probe);
+ void removeVideoProbe(DirectShowVideoProbeControl *probe);
+
Q_SIGNALS:
void statusChanged(QCamera::Status);
void imageExposed(int id);
@@ -217,6 +221,10 @@ private:
QVideoFrame m_capturedFrame;
QCameraImageCapture::CaptureDestinations m_captureDestinations;
+ // Video probe
+ QMutex m_probeMutex;
+ DirectShowVideoProbeControl *m_videoProbeControl;
+
// Internal state
QCamera::Status m_status;