summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVal Doroshchuk <valentyn.doroshchuk@qt.io>2019-03-25 14:42:42 +0100
committerVaL Doroshchuk <valentyn.doroshchuk@qt.io>2019-05-03 12:48:44 +0000
commit6e6871ad398318d61840705de9d057d8eb7726f5 (patch)
tree777bcd7e6bf257445129eedcb3bef34d51190f2e
parent21f752806077e05249f9c357f14e9f0294920ecb (diff)
downloadqtmultimedia-6e6871ad398318d61840705de9d057d8eb7726f5.tar.gz
Android: Don't postpone setting of camera's state
Currently if the application is inactive, the state is postponed to be set and processed when the app becomes active. This also postpones stateChanged() signal and saving the state value, while it should be set (but not processed) immediately as done in another backends. Added a fix to store the state and emit stateChanged regardless of activity of the application. When the application becames available, the state will be processed. In case of an error while opening the camera: - UnloadedState is emitted - CameraError - UnloadedStatus Change-Id: Ie376d29366168a6b15eccea884f385070f94fe35 Task-number: QTBUG-73582 Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
-rw-r--r--src/plugins/android/src/mediacapture/qandroidcamerasession.cpp40
-rw-r--r--src/plugins/android/src/mediacapture/qandroidcamerasession.h2
2 files changed, 23 insertions, 19 deletions
diff --git a/src/plugins/android/src/mediacapture/qandroidcamerasession.cpp b/src/plugins/android/src/mediacapture/qandroidcamerasession.cpp
index 8ba3ed12c..efcd56580 100644
--- a/src/plugins/android/src/mediacapture/qandroidcamerasession.cpp
+++ b/src/plugins/android/src/mediacapture/qandroidcamerasession.cpp
@@ -114,16 +114,22 @@ bool QAndroidCameraSession::isCaptureModeSupported(QCamera::CaptureModes mode) c
void QAndroidCameraSession::setState(QCamera::State state)
{
+ if (m_state == state)
+ return;
+
+ m_state = state;
+ emit stateChanged(m_state);
+
// If the application is inactive, the camera shouldn't be started. Save the desired state
// instead and it will be set when the application becomes active.
- if (qApp->applicationState() != Qt::ApplicationActive) {
+ if (qApp->applicationState() == Qt::ApplicationActive)
+ setStateHelper(state);
+ else
m_savedState = state;
- return;
- }
-
- if (m_state == state)
- return;
+}
+void QAndroidCameraSession::setStateHelper(QCamera::State state)
+{
switch (state) {
case QCamera::UnloadedState:
close();
@@ -131,20 +137,19 @@ void QAndroidCameraSession::setState(QCamera::State state)
case QCamera::LoadedState:
case QCamera::ActiveState:
if (!m_camera && !open()) {
+ m_state = QCamera::UnloadedState;
+ emit stateChanged(m_state);
emit error(QCamera::CameraError, QStringLiteral("Failed to open camera"));
+ m_status = QCamera::UnloadedStatus;
+ emit statusChanged(m_status);
return;
}
- if (state == QCamera::ActiveState) {
- if (!startPreview())
- return;
- } else if (state == QCamera::LoadedState) {
+ if (state == QCamera::ActiveState)
+ startPreview();
+ else if (state == QCamera::LoadedState)
stopPreview();
- }
break;
}
-
- m_state = state;
- emit stateChanged(m_state);
}
void QAndroidCameraSession::updateAvailableCameras()
@@ -202,12 +207,9 @@ bool QAndroidCameraSession::open()
m_camera->notifyNewFrames(m_videoProbes.count() || m_previewCallback);
emit opened();
- } else {
- m_status = QCamera::UnavailableStatus;
+ emit statusChanged(m_status);
}
- emit statusChanged(m_status);
-
return m_camera != 0;
}
@@ -899,7 +901,7 @@ void QAndroidCameraSession::onApplicationStateChanged(Qt::ApplicationState state
break;
case Qt::ApplicationActive:
if (m_savedState != -1) {
- setState(QCamera::State(m_savedState));
+ setStateHelper(QCamera::State(m_savedState));
m_savedState = -1;
}
break;
diff --git a/src/plugins/android/src/mediacapture/qandroidcamerasession.h b/src/plugins/android/src/mediacapture/qandroidcamerasession.h
index d08f2f6ac..b51dcc628 100644
--- a/src/plugins/android/src/mediacapture/qandroidcamerasession.h
+++ b/src/plugins/android/src/mediacapture/qandroidcamerasession.h
@@ -165,6 +165,8 @@ private:
static QVideoFrame::PixelFormat QtPixelFormatFromAndroidImageFormat(AndroidCamera::ImageFormat);
static AndroidCamera::ImageFormat AndroidImageFormatFromQtPixelFormat(QVideoFrame::PixelFormat);
+ void setStateHelper(QCamera::State state);
+
int m_selectedCamera;
AndroidCamera *m_camera;
int m_nativeOrientation;