summaryrefslogtreecommitdiffstats
path: root/src/plugins/winrt/qwinrtcameracontrol.cpp
diff options
context:
space:
mode:
authorSamuel Nevala <samuel.nevala@intopalo.com>2015-10-14 10:48:00 +0300
committerSamuel Nevala <samuel.nevala@intopalo.com>2015-10-15 06:19:14 +0000
commit787dcd9e4d40d9d59b90544e4c4bdea13ef532b8 (patch)
tree0650f73eaa9794265c43e69c38ce899e91b8cfcc /src/plugins/winrt/qwinrtcameracontrol.cpp
parentd50a09965ae53e02caabdbcf4994ed9bc0ea3293 (diff)
winrt: Prevent camera device from being suspended.
On certain Lumia devices video buffer gets page locked when camera is stopped. Subsequent call to video frame map/unmap leads to camera device suspension. As a fix delay camera unload until all mapped video frames are unmapped and return early from video frame map when camera is not active. Task-Id: QTBUG-48672 Change-Id: If547b9d430727bbe0e12cd8c07a30aeff81d13e3 Reviewed-by: Andrew Knight <andrew.knight@intopalo.com>
Diffstat (limited to 'src/plugins/winrt/qwinrtcameracontrol.cpp')
-rw-r--r--src/plugins/winrt/qwinrtcameracontrol.cpp26
1 files changed, 26 insertions, 0 deletions
diff --git a/src/plugins/winrt/qwinrtcameracontrol.cpp b/src/plugins/winrt/qwinrtcameracontrol.cpp
index 3489048d8..0db4cdb0d 100644
--- a/src/plugins/winrt/qwinrtcameracontrol.cpp
+++ b/src/plugins/winrt/qwinrtcameracontrol.cpp
@@ -524,6 +524,8 @@ public:
QPointer<QWinRTImageEncoderControl> imageEncoderControl;
QPointer<QWinRTCameraFocusControl> cameraFocusControl;
QPointer<QWinRTCameraLocksControl> cameraLocksControl;
+ QAtomicInt framesMapped;
+ QEventLoop *delayClose;
};
QWinRTCameraControl::QWinRTCameraControl(QObject *parent)
@@ -531,6 +533,7 @@ QWinRTCameraControl::QWinRTCameraControl(QObject *parent)
{
Q_D(QWinRTCameraControl);
+ d->delayClose = nullptr;
d->state = QCamera::UnloadedState;
d->status = QCamera::UnloadedStatus;
d->captureMode = QCamera::CaptureStillImage;
@@ -612,6 +615,14 @@ void QWinRTCameraControl::setState(QCamera::State state)
case QCamera::UnloadedState: {
// Stop the camera if it is running (transition to LoadedState)
if (d->status == QCamera::ActiveStatus) {
+ if (d->framesMapped > 0) {
+ qWarning("%d QVideoFrame(s) mapped when closing down camera. Camera will wait for unmap before closing down.",
+ d->framesMapped);
+ if (!d->delayClose)
+ d->delayClose = new QEventLoop(this);
+ d->delayClose->exec();
+ }
+
ComPtr<IAsyncAction> op;
hr = d->capturePreview->StopPreviewAsync(&op);
RETURN_VOID_AND_EMIT_ERROR("Failed to stop camera preview");
@@ -1208,6 +1219,21 @@ bool QWinRTCameraControl::unlockFocus()
#endif // !Q_OS_WINPHONE
+void QWinRTCameraControl::frameMapped()
+{
+ Q_D(QWinRTCameraControl);
+ ++d->framesMapped;
+}
+
+void QWinRTCameraControl::frameUnmapped()
+{
+ Q_D(QWinRTCameraControl);
+ --d->framesMapped;
+ Q_ASSERT(d->framesMapped >= 0);
+ if (!d->framesMapped && d->delayClose && d->delayClose->isRunning())
+ d->delayClose->exit();
+}
+
HRESULT QWinRTCameraControl::onCaptureFailed(IMediaCapture *, IMediaCaptureFailedEventArgs *args)
{
HRESULT hr;