diff options
author | Samuel Nevala <samuel.nevala@intopalo.com> | 2015-10-14 10:48:00 +0300 |
---|---|---|
committer | Samuel Nevala <samuel.nevala@intopalo.com> | 2015-10-15 06:19:14 +0000 |
commit | 787dcd9e4d40d9d59b90544e4c4bdea13ef532b8 (patch) | |
tree | 0650f73eaa9794265c43e69c38ce899e91b8cfcc /src/plugins/winrt/qwinrtcameracontrol.cpp | |
parent | d50a09965ae53e02caabdbcf4994ed9bc0ea3293 (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.cpp | 26 |
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; |