diff options
author | Christian Stromme <christian.stromme@qt.io> | 2016-12-06 18:25:24 +0100 |
---|---|---|
committer | Christian Stromme <christian.stromme@qt.io> | 2018-01-22 20:50:21 +0000 |
commit | e2bcf5d44e5f0217605c3fdf9b1e7c0b4a3bee73 (patch) | |
tree | aec6f075971ab21bb99ab1f8abdc28fea0b4bec9 /src/plugins/directshow/camera | |
parent | c20d3fa8c42d3ea0a088f208b55dfc66b58f6674 (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/plugins/directshow/camera')
-rw-r--r-- | src/plugins/directshow/camera/dscameraservice.cpp | 20 | ||||
-rw-r--r-- | src/plugins/directshow/camera/dscameraservice.h | 2 | ||||
-rw-r--r-- | src/plugins/directshow/camera/dscamerasession.cpp | 22 | ||||
-rw-r--r-- | src/plugins/directshow/camera/dscamerasession.h | 8 |
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; |