From 8fed613562677dd2402b6f67f0090fcba3301f1f Mon Sep 17 00:00:00 2001 From: Jacopo Mondi Date: Fri, 4 Dec 2020 15:26:47 +0100 Subject: android: camera_device: Stop camera when re-configuring it MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Reviewed-by: Niklas Söderlund Reviewed-by: Laurent Pinchart Signed-off-by: Jacopo Mondi --- src/android/camera_device.cpp | 7 +++++++ 1 file changed, 7 insertions(+) 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. -- cgit v1.2.1