summaryrefslogtreecommitdiffstats
path: root/src/plugins/winrt/qwinrtcameracontrol.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/winrt/qwinrtcameracontrol.cpp')
-rw-r--r--src/plugins/winrt/qwinrtcameracontrol.cpp109
1 files changed, 70 insertions, 39 deletions
diff --git a/src/plugins/winrt/qwinrtcameracontrol.cpp b/src/plugins/winrt/qwinrtcameracontrol.cpp
index c32a5f2e2..a28d57219 100644
--- a/src/plugins/winrt/qwinrtcameracontrol.cpp
+++ b/src/plugins/winrt/qwinrtcameracontrol.cpp
@@ -42,6 +42,7 @@
#include "qwinrtvideodeviceselectorcontrol.h"
#include "qwinrtcameraimagecapturecontrol.h"
#include "qwinrtimageencodercontrol.h"
+#include "qwinrtcameraflashcontrol.h"
#include "qwinrtcamerafocuscontrol.h"
#include "qwinrtcameralockscontrol.h"
@@ -554,6 +555,7 @@ public:
QPointer<QWinRTVideoDeviceSelectorControl> videoDeviceSelector;
QPointer<QWinRTCameraImageCaptureControl> imageCaptureControl;
QPointer<QWinRTImageEncoderControl> imageEncoderControl;
+ QPointer<QWinRTCameraFlashControl> cameraFlashControl;
QPointer<QWinRTCameraFocusControl> cameraFocusControl;
QPointer<QWinRTCameraLocksControl> cameraLocksControl;
QAtomicInt framesMapped;
@@ -578,6 +580,7 @@ QWinRTCameraControl::QWinRTCameraControl(QObject *parent)
d->videoDeviceSelector = new QWinRTVideoDeviceSelectorControl(this);
d->imageCaptureControl = new QWinRTCameraImageCaptureControl(this);
d->imageEncoderControl = new QWinRTImageEncoderControl(this);
+ d->cameraFlashControl = new QWinRTCameraFlashControl(this);
d->cameraFocusControl = new QWinRTCameraFocusControl(this);
d->cameraLocksControl = new QWinRTCameraLocksControl(this);
@@ -815,6 +818,12 @@ QImageEncoderControl *QWinRTCameraControl::imageEncoderControl() const
return d->imageEncoderControl;
}
+QCameraFlashControl *QWinRTCameraControl::cameraFlashControl() const
+{
+ Q_D(const QWinRTCameraControl);
+ return d->cameraFlashControl;
+}
+
QCameraFocusControl *QWinRTCameraControl::cameraFocusControl() const
{
Q_D(const QWinRTCameraControl);
@@ -875,7 +884,8 @@ HRESULT QWinRTCameraControl::initialize()
emit statusChanged(d->status);
}
- HRESULT hr = QEventDispatcherWinRT::runOnXamlThread([this, d]() {
+ boolean isFocusSupported;
+ HRESULT hr = QEventDispatcherWinRT::runOnXamlThread([this, d, &isFocusSupported]() {
HRESULT hr;
ComPtr<IInspectable> capture;
hr = RoActivateInstance(Wrappers::HString::MakeReference(RuntimeClass_Windows_Media_Capture_MediaCapture).Get(),
@@ -940,7 +950,8 @@ HRESULT QWinRTCameraControl::initialize()
hr = advancedVideoDeviceController->get_FocusControl(&d->focusControl);
Q_ASSERT_SUCCEEDED(hr);
- boolean isFocusSupported;
+ d->cameraFlashControl->initialize(advancedVideoDeviceController);
+
hr = d->focusControl->get_Supported(&isFocusSupported);
Q_ASSERT_SUCCEEDED(hr);
if (isFocusSupported) {
@@ -949,11 +960,7 @@ HRESULT QWinRTCameraControl::initialize()
qCDebug(lcMMCamera) << "Focus supported, but no control for regions of interest available";
hr = initializeFocus();
Q_ASSERT_SUCCEEDED(hr);
- } else {
- d->cameraFocusControl->setSupportedFocusMode(0);
- d->cameraFocusControl->setSupportedFocusPointMode(QSet<QCameraFocus::FocusPointMode>());
}
- d->cameraLocksControl->initialize();
Q_ASSERT_SUCCEEDED(hr);
ComPtr<IMediaDeviceController> deviceController;
@@ -1029,6 +1036,12 @@ HRESULT QWinRTCameraControl::initialize()
return S_OK;
});
+ if (!isFocusSupported) {
+ d->cameraFocusControl->setSupportedFocusMode(0);
+ d->cameraFocusControl->setSupportedFocusPointMode(QSet<QCameraFocus::FocusPointMode>());
+ }
+ d->cameraLocksControl->initialize();
+
if (SUCCEEDED(hr) && d->state != QCamera::LoadedState) {
d->state = QCamera::LoadedState;
emit stateChanged(d->state);
@@ -1228,30 +1241,34 @@ bool QWinRTCameraControl::focus()
{
Q_D(QWinRTCameraControl);
HRESULT hr;
- AsyncStatus status = AsyncStatus::Completed;
- if (d->focusOperation) {
- ComPtr<IAsyncInfo> info;
- hr = d->focusOperation.As(&info);
- Q_ASSERT_SUCCEEDED(hr);
- info->get_Status(&status);
- }
-
- if (!d->focusControl || status == AsyncStatus::Started)
+ if (!d->focusControl)
return false;
QEventDispatcherWinRT::runOnXamlThread([&d, &hr]() {
+ if (d->focusOperation) {
+ ComPtr<IAsyncInfo> info;
+ hr = d->focusOperation.As(&info);
+ Q_ASSERT_SUCCEEDED(hr);
+
+ AsyncStatus status = AsyncStatus::Completed;
+ hr = info->get_Status(&status);
+ Q_ASSERT_SUCCEEDED(hr);
+ if (status == AsyncStatus::Started)
+ return E_ASYNC_OPERATION_NOT_STARTED;
+ }
+
hr = d->focusControl->FocusAsync(&d->focusOperation);
Q_ASSERT_SUCCEEDED(hr);
+
+ const long errorCode = HRESULT_CODE(hr);
+ if (errorCode == ERROR_OPERATION_IN_PROGRESS
+ || errorCode == ERROR_WRITE_PROTECT) {
+ return E_ASYNC_OPERATION_NOT_STARTED;
+ }
+ Q_ASSERT_SUCCEEDED(hr);
return S_OK;
});
- const long errorCode = HRESULT_CODE(hr);
- if (errorCode == ERROR_OPERATION_IN_PROGRESS
- || errorCode == ERROR_WRITE_PROTECT) {
- return false;
- }
- Q_ASSERT_SUCCEEDED(hr);
- hr = QWinRTFunctions::await(d->focusOperation, QWinRTFunctions::ProcessThreadEvents);
- Q_ASSERT_SUCCEEDED(hr);
+
return hr == S_OK;
}
@@ -1272,15 +1289,22 @@ bool QWinRTCameraControl::lockFocus()
Q_D(QWinRTCameraControl);
if (!d->focusControl)
return false;
- ComPtr<IFocusControl2> focusControl2;
- HRESULT hr = d->focusControl.As(&focusControl2);
- Q_ASSERT_SUCCEEDED(hr);
+
+ bool result = false;
ComPtr<IAsyncAction> op;
- hr = focusControl2->LockAsync(&op);
- if (HRESULT_CODE(hr) == ERROR_WRITE_PROTECT)
- return false;
- Q_ASSERT_SUCCEEDED(hr);
- return QWinRTFunctions::await(op) == S_OK;
+ HRESULT hr;
+ hr = QEventDispatcherWinRT::runOnXamlThread([d, &result, &op]() {
+ ComPtr<IFocusControl2> focusControl2;
+ HRESULT hr = d->focusControl.As(&focusControl2);
+ Q_ASSERT_SUCCEEDED(hr);
+ hr = focusControl2->LockAsync(&op);
+ if (HRESULT_CODE(hr) == ERROR_WRITE_PROTECT)
+ return S_OK;
+ Q_ASSERT_SUCCEEDED(hr);
+ result = true;
+ return hr;
+ });
+ return result ? (QWinRTFunctions::await(op) == S_OK) : false;
}
bool QWinRTCameraControl::unlockFocus()
@@ -1288,15 +1312,22 @@ bool QWinRTCameraControl::unlockFocus()
Q_D(QWinRTCameraControl);
if (!d->focusControl)
return false;
- ComPtr<IFocusControl2> focusControl2;
- HRESULT hr = d->focusControl.As(&focusControl2);
- Q_ASSERT_SUCCEEDED(hr);
+
+ bool result = false;
ComPtr<IAsyncAction> op;
- hr = focusControl2->UnlockAsync(&op);
- if (HRESULT_CODE(hr) == ERROR_WRITE_PROTECT)
- return false;
- Q_ASSERT_SUCCEEDED(hr);
- return QWinRTFunctions::await(op) == S_OK;
+ HRESULT hr;
+ hr = QEventDispatcherWinRT::runOnXamlThread([d, &result, &op]() {
+ ComPtr<IFocusControl2> focusControl2;
+ HRESULT hr = d->focusControl.As(&focusControl2);
+ Q_ASSERT_SUCCEEDED(hr);
+ hr = focusControl2->UnlockAsync(&op);
+ if (HRESULT_CODE(hr) == ERROR_WRITE_PROTECT)
+ return S_OK;
+ Q_ASSERT_SUCCEEDED(hr);
+ result = true;
+ return hr;
+ });
+ return result ? (QWinRTFunctions::await(op) == S_OK) : false;
}
#else // !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PHONE_APP)