summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacopo Mondi <jacopo@jmondi.org>2020-12-04 15:26:47 +0100
committerJacopo Mondi <jacopo@jmondi.org>2020-12-07 14:26:42 +0100
commit8fed613562677dd2402b6f67f0090fcba3301f1f (patch)
tree52ad27e18b5d708afa33ec4cbc0aa5a941c5f603
parent1889cdc2e91cc378d239c9b155bbabbdb7827b67 (diff)
android: camera_device: Stop camera when re-configuring it
The Android camera device HAL3 specification does not require a camera to go through any explicit close() call between configurations. It is legitimate for a camera to be configured, a number of requests processed and then re-configured again without any explicit stop. The libcamera Android camera HAL starts the Camera at the first handled request, and only stops it at camera close time. This means that two camera configuration attempts in the same streaming session are only interleaved by capture requests handling. The libcamera::Camera state machine requires the Camera to be stopped before any configuration take place, and this currently doesn't happen. Fix this by stopping the camera and the associated worker thread if a configuration attempt is performed while the Camera is in running state. This patch fixes cros_camera_test: Camera3PreviewTest/Camera3SinglePreviewTest.Camera3BasicPreviewTest/0 Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
-rw-r--r--src/android/camera_device.cpp7
1 files changed, 7 insertions, 0 deletions
diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
index 017a15ca..872c7b18 100644
--- a/src/android/camera_device.cpp
+++ b/src/android/camera_device.cpp
@@ -1223,6 +1223,13 @@ PixelFormat CameraDevice::toPixelFormat(int format) const
*/
int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)
{
+ /* Before any configuration attempt, stop the camera if it's running. */
+ if (running_) {
+ worker_.stop();
+ camera_->stop();
+ running_ = false;
+ }
+
/*
* Generate an empty configuration, and construct a StreamConfiguration
* for each camera3_stream to add to it.