diff options
Diffstat (limited to 'src/plugins/multimedia/windows/mediacapture/qwindowscamera.cpp')
-rw-r--r-- | src/plugins/multimedia/windows/mediacapture/qwindowscamera.cpp | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/src/plugins/multimedia/windows/mediacapture/qwindowscamera.cpp b/src/plugins/multimedia/windows/mediacapture/qwindowscamera.cpp new file mode 100644 index 000000000..d5e25e1c5 --- /dev/null +++ b/src/plugins/multimedia/windows/mediacapture/qwindowscamera.cpp @@ -0,0 +1,101 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include "qwindowscamera_p.h" + +#include "qwindowsmediadevicesession_p.h" +#include "qwindowsmediacapture_p.h" +#include <qcameradevice.h> + +QT_BEGIN_NAMESPACE + +QWindowsCamera::QWindowsCamera(QCamera *camera) + : QPlatformCamera(camera) +{ +} + +QWindowsCamera::~QWindowsCamera() = default; + +bool QWindowsCamera::isActive() const +{ + return m_active; +} + +void QWindowsCamera::setActive(bool active) +{ + if (m_active == active) + return; + if (m_cameraDevice.isNull() && active) + return; + m_active = active; + if (m_mediaDeviceSession) + m_mediaDeviceSession->setActive(active); + + emit activeChanged(m_active); +} + +void QWindowsCamera::setCamera(const QCameraDevice &camera) +{ + if (m_cameraDevice == camera) + return; + m_cameraDevice = camera; + if (m_mediaDeviceSession) + m_mediaDeviceSession->setActiveCamera(camera); +} + +void QWindowsCamera::setCaptureSession(QPlatformMediaCaptureSession *session) +{ + QWindowsMediaCaptureService *captureService = static_cast<QWindowsMediaCaptureService *>(session); + if (m_captureService == captureService) + return; + + if (m_mediaDeviceSession) { + m_mediaDeviceSession->disconnect(this); + m_mediaDeviceSession->setActive(false); + m_mediaDeviceSession->setCameraFormat({}); + m_mediaDeviceSession->setActiveCamera({}); + } + + m_captureService = captureService; + if (!m_captureService) { + m_mediaDeviceSession = nullptr; + return; + } + + m_mediaDeviceSession = m_captureService->session(); + Q_ASSERT(m_mediaDeviceSession); + + m_mediaDeviceSession->setActive(false); + m_mediaDeviceSession->setActiveCamera(m_cameraDevice); + m_mediaDeviceSession->setCameraFormat(m_cameraFormat); + m_mediaDeviceSession->setActive(m_active); + + connect(m_mediaDeviceSession, &QWindowsMediaDeviceSession::activeChanged, + this, &QWindowsCamera::onActiveChanged); +} + +bool QWindowsCamera::setCameraFormat(const QCameraFormat &format) +{ + if (!format.isNull() && !m_cameraDevice.videoFormats().contains(format)) + return false; + + m_cameraFormat = format.isNull() ? findBestCameraFormat(m_cameraDevice) : format; + + if (m_mediaDeviceSession) + m_mediaDeviceSession->setCameraFormat(m_cameraFormat); + return true; +} + +void QWindowsCamera::onActiveChanged(bool active) +{ + if (m_active == active) + return; + if (m_cameraDevice.isNull() && active) + return; + m_active = active; + emit activeChanged(m_active); +} + +QT_END_NAMESPACE + +#include "moc_qwindowscamera_p.cpp" |