[libcamera-devel] [PATCH 15/21] qcam: viewfinder: Make the viewfinder hold a reference to a buffer

Kieran Bingham kieran.bingham at ideasonboard.com
Mon Mar 23 18:09:29 CET 2020


Hi Laurent,

On 23/03/2020 14:21, Laurent Pinchart wrote:
> The viewfinder is currently expected to render frames to the screen
> synchronously in the display() function, or at least to copy data so
> that the buffer can be queued in a new request when the function
> returns. This prevents optimisations when the capture format is
> identical to the display format.
> 
> Make the viewfinder take ownership of the buffer, and notify of its
> release through a signal. The release is currently still synchronous,
> this will be addressed in a subsequent patch.
> 
> Rename the ViewFinder::display() function to render() to better describe
> its purpose, as it's meant to start the rendering and not display the
> frame synchronously.

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

> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> ---
>  src/qcam/main_window.cpp | 13 ++++---------
>  src/qcam/main_window.h   |  4 ++--
>  src/qcam/meson.build     |  1 +
>  src/qcam/viewfinder.cpp  |  5 +++--
>  src/qcam/viewfinder.h    |  7 ++++++-
>  5 files changed, 16 insertions(+), 14 deletions(-)
> 
> diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp
> index ad0d6bf4f3e5..b68e171c5e01 100644
> --- a/src/qcam/main_window.cpp
> +++ b/src/qcam/main_window.cpp
> @@ -64,6 +64,8 @@ MainWindow::MainWindow(CameraManager *cm, const OptionsParser::Options &options)
>  	connect(&titleTimer_, SIGNAL(timeout()), this, SLOT(updateTitle()));
>  
>  	viewfinder_ = new ViewFinder(this);
> +	connect(viewfinder_, &ViewFinder::renderComplete,
> +		this, &MainWindow::queueRequest);
>  	setCentralWidget(viewfinder_);
>  	adjustSize();
>  
> @@ -513,15 +515,8 @@ void MainWindow::processCapture()
>  		<< "timestamp:" << metadata.timestamp
>  		<< "fps:" << Qt::fixed << qSetRealNumberPrecision(2) << fps;
>  
> -	/* Display the buffer and requeue it to the camera. */
> -	display(buffer);
> -
> -	queueRequest(buffer);
> -}
> -
> -void MainWindow::display(FrameBuffer *buffer)
> -{
> -	viewfinder_->display(buffer, &mappedBuffers_[buffer]);
> +	/* Render the frame on the viewfinder. */
> +	viewfinder_->render(buffer, &mappedBuffers_[buffer]);
>  }
>  
>  void MainWindow::queueRequest(FrameBuffer *buffer)
> diff --git a/src/qcam/main_window.h b/src/qcam/main_window.h
> index 03db761b58e4..1a2ccbd632b0 100644
> --- a/src/qcam/main_window.h
> +++ b/src/qcam/main_window.h
> @@ -54,6 +54,8 @@ private Q_SLOTS:
>  
>  	void saveImageAs();
>  
> +	void queueRequest(FrameBuffer *buffer);
> +
>  private:
>  	int createToolbars();
>  
> @@ -65,8 +67,6 @@ private:
>  
>  	void requestComplete(Request *request);
>  	void processCapture();
> -	void display(FrameBuffer *buffer);
> -	void queueRequest(FrameBuffer *buffer);
>  
>  	/* UI elements */
>  	QToolBar *toolbar_;
> diff --git a/src/qcam/meson.build b/src/qcam/meson.build
> index 214bfb12aabb..c256d06f8ccf 100644
> --- a/src/qcam/meson.build
> +++ b/src/qcam/meson.build
> @@ -8,6 +8,7 @@ qcam_sources = files([
>  
>  qcam_moc_headers = files([
>      'main_window.h',
> +    'viewfinder.h',
>  ])
>  
>  qcam_resources = files([
> diff --git a/src/qcam/viewfinder.cpp b/src/qcam/viewfinder.cpp
> index b8feabd5d189..2a35932e0b79 100644
> --- a/src/qcam/viewfinder.cpp
> +++ b/src/qcam/viewfinder.cpp
> @@ -25,8 +25,7 @@ ViewFinder::~ViewFinder()
>  	delete image_;
>  }
>  
> -void ViewFinder::display(const libcamera::FrameBuffer *buffer,
> -			 MappedBuffer *map)
> +void ViewFinder::render(libcamera::FrameBuffer *buffer, MappedBuffer *map)
>  {
>  	if (buffer->planes().size() != 1) {
>  		qWarning() << "Multi-planar buffers are not supported";
> @@ -44,6 +43,8 @@ void ViewFinder::display(const libcamera::FrameBuffer *buffer,
>  	converter_.convert(static_cast<unsigned char *>(map->memory),
>  			   buffer->metadata().planes[0].bytesused, image_);
>  	update();
> +
> +	renderComplete(buffer);
>  }
>  
>  QImage ViewFinder::getCurrentImage()
> diff --git a/src/qcam/viewfinder.h b/src/qcam/viewfinder.h
> index 735a6b67e91d..784fcceda5bd 100644
> --- a/src/qcam/viewfinder.h
> +++ b/src/qcam/viewfinder.h
> @@ -27,15 +27,20 @@ struct MappedBuffer {
>  
>  class ViewFinder : public QWidget
>  {
> +	Q_OBJECT
> +
>  public:
>  	ViewFinder(QWidget *parent);
>  	~ViewFinder();
>  
>  	int setFormat(const libcamera::PixelFormat &format, const QSize &size);
> -	void display(const libcamera::FrameBuffer *buffer, MappedBuffer *map);
> +	void render(libcamera::FrameBuffer *buffer, MappedBuffer *map);
>  
>  	QImage getCurrentImage();
>  
> +Q_SIGNALS:
> +	void renderComplete(libcamera::FrameBuffer *buffer);
> +
>  protected:
>  	void paintEvent(QPaintEvent *) override;
>  	QSize sizeHint() const override;
> 

-- 
Regards
--
Kieran


More information about the libcamera-devel mailing list