[libcamera-devel] [PATCH v2 2/7] qcam: Move requestCompleted signal mapping

Laurent Pinchart laurent.pinchart at ideasonboard.com
Fri Feb 14 12:19:32 CET 2020


Hi Kieran,

Thank you for the patch.

On Fri, Feb 14, 2020 at 12:18:05AM +0000, Kieran Bingham wrote:
> The MainWindow connects a handler to the Camera requestCompleted signal
> when the camera is opened, but never disconnects it.
> 
> Move the connection to the startCapture() function, and ensure that it
> is disconnected again when the stream is stopped.
> 
> This ensures that we can successfully tear down the stream, and restart
> with a new camera.

The commit also adds a camera_->stop() call in an error path, it should
be mentioned in the commit message (or split to a separate patch).

> Signed-off-by: Kieran Bingham <kieran.bingham at ideasonboard.com>

I think we could avoid the nasty error_disconnect by splitting out code
to openCamera/closeCamera methods. This patch however does the job for
now, so

Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>

> ---
>  src/qcam/main_window.cpp | 12 +++++++++---
>  1 file changed, 9 insertions(+), 3 deletions(-)
> 
> diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp
> index db14245d7f51..38d7063363f0 100644
> --- a/src/qcam/main_window.cpp
> +++ b/src/qcam/main_window.cpp
> @@ -113,8 +113,6 @@ int MainWindow::openCamera(CameraManager *cm)
>  
>  	std::cout << "Using camera " << camera_->name() << std::endl;
>  
> -	camera_->requestCompleted.connect(this, &MainWindow::requestComplete);
> -
>  	return 0;
>  }
>  
> @@ -212,17 +210,23 @@ int MainWindow::startCapture()
>  		goto error;
>  	}
>  
> +	camera_->requestCompleted.connect(this, &MainWindow::requestComplete);
> +
>  	for (Request *request : requests) {
>  		ret = camera_->queueRequest(request);
>  		if (ret < 0) {
>  			std::cerr << "Can't queue request" << std::endl;
> -			goto error;
> +			goto error_disconnect;
>  		}
>  	}
>  
>  	isCapturing_ = true;
>  	return 0;
>  
> +error_disconnect:
> +	camera_->requestCompleted.disconnect(this, &MainWindow::requestComplete);
> +	camera_->stop();
> +
>  error:
>  	for (Request *request : requests)
>  		delete request;
> @@ -249,6 +253,8 @@ void MainWindow::stopCapture()
>  	if (ret)
>  		std::cout << "Failed to stop capture" << std::endl;
>  
> +	camera_->requestCompleted.disconnect(this, &MainWindow::requestComplete);
> +
>  	for (auto &iter : mappedBuffers_) {
>  		void *memory = iter.second.first;
>  		unsigned int length = iter.second.second;

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list