[libcamera-devel] [PATCH v2 9/9] RFC: Stop PostProcessor when camera is stopped

Laurent Pinchart laurent.pinchart at ideasonboard.com
Mon Sep 13 03:28:50 CEST 2021


Hi Umang,

Thank you for the patch.

On Fri, Sep 10, 2021 at 12:36:38PM +0530, Umang Jain wrote:
> Stopping the post-processor thread from CameraDevice is not ideal.

Why is so ? I think that explicit start() and stop() functions for
CameraStream() could make sense.

> But it temporarily avoids the crash on stopping the camera.

What crash ?

> Signed-off-by: Umang Jain <umang.jain at ideasonboard.com>
> ---
>  src/android/camera_device.cpp | 8 ++++++++
>  src/android/camera_stream.h   | 7 +++++++
>  2 files changed, 15 insertions(+)
> 
> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
> index 73eb5758..fa2db72f 100644
> --- a/src/android/camera_device.cpp
> +++ b/src/android/camera_device.cpp
> @@ -425,6 +425,14 @@ int CameraDevice::open(const hw_module_t *hardwareModule)
>  
>  void CameraDevice::close()
>  {
> +	for (CameraStream &cameraStream : streams_) {
> +		/* CameraStream doesn't have user defined destructor as
> +		 * it is MoveConstructible. Stop the post-processor thread

Why does being move-constructible prevent having a user-defined
destructor ? Adding a user-defined destructor will prevent the compiler
from adding an implicitly-declared move constructor, but you could add
an explicit

	CameraStream(CameraStream &&other) = default;

Or better,

	CameraStream(CameraStream &&other);

in camera_device.h, and

CameraStream::CameraStream(CameraStream &&other) = default;

in camera_device.cpp to avoid making it inline.

> +		 * from here before clearing streams_.
> +		 */
> +		cameraStream.stopPostProcessorThread();
> +	}
> +
>  	streams_.clear();
>  
>  	stop();
> diff --git a/src/android/camera_stream.h b/src/android/camera_stream.h
> index dbb7eee3..bd37473e 100644
> --- a/src/android/camera_stream.h
> +++ b/src/android/camera_stream.h
> @@ -133,6 +133,13 @@ public:
>  		    const Camera3RequestDescriptor *context);
>  	libcamera::FrameBuffer *getBuffer();
>  	void putBuffer(libcamera::FrameBuffer *buffer);
> +	void stopPostProcessorThread()
> +	{
> +		if (thread_) {
> +			thread_->exit();
> +			thread_->wait();
> +		}
> +	}
>  
>  	enum ProcessStatus {
>  		Succeeded,

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list