[libcamera-devel] [PATCH] android: camera_device: Stop camera when re-configuring it
Niklas Söderlund
niklas.soderlund at ragnatech.se
Fri Dec 4 17:08:06 CET 2020
Hi Jacopo,
Thanks for your work.
On 2020-12-04 15:39:55 +0100, Jacopo Mondi wrote:
> The Android camera device HAL3 specification does not require a
> camera to go through any explicit close() call between configurations.
> It is legit for a camera to be configured, a number of requests
> processed and the 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 mean, that two
> camera configuration attempts part of 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
> in the camera HAL CameraDevice class.
>
> 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
>
> Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
>
> ---
> Alternatively, the camera can be stopped at the very beginning of the
> configureStream() function. But in that case the camera gets stopped
> even if the configuration attempt fails (ie at validation time).
>
> As both behaviour seems to be compliant with what Android expects, I decided
> to stop the camera only if the configuration is valid.
I'm leaning a bit towards also stopping the camera if the configuration
fails, from a power perspective it would it not make most sens? I'm head
deep in other PM work so maybe I'm biased ;-) As our current goal is to
pass CTS I don't think there is a need to bikesheed on this and this is
clearly a step in the right direction,
Reviewed-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
> ---
>
> src/android/camera_device.cpp | 9 ++++++++-
> 1 file changed, 8 insertions(+), 1 deletion(-)
>
> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
> index 675af5705055..2500994e2f6a 100644
> --- a/src/android/camera_device.cpp
> +++ b/src/android/camera_device.cpp
> @@ -1341,8 +1341,15 @@ int CameraDevice::configureStreams(camera3_stream_configuration_t *stream_list)
>
> /*
> * Once the CameraConfiguration has been adjusted/validated
> - * it can be applied to the camera.
> + * it can be applied to the camera, which has to be stopped if
> + * in running state.
> */
> + if (running_) {
> + worker_.stop();
> + camera_->stop();
> + running_ = false;
> + }
> +
> int ret = camera_->configure(config_.get());
> if (ret) {
> LOG(HAL, Error) << "Failed to configure camera '"
> --
> 2.29.1
>
> _______________________________________________
> libcamera-devel mailing list
> libcamera-devel at lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel
--
Regards,
Niklas Söderlund
More information about the libcamera-devel
mailing list