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

Message ID 20200323173559.21109-16-laurent.pinchart@ideasonboard.com
State Accepted
Headers show
Series
  • qcam: Bypass format conversion when not required
Related show

Commit Message

Laurent Pinchart March 23, 2020, 5:35 p.m. UTC
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.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@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(-)

Patch

diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp
index 3711a02c7fdc..e872bdd7ba86 100644
--- a/src/qcam/main_window.cpp
+++ b/src/qcam/main_window.cpp
@@ -63,6 +63,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();
 
@@ -518,15 +520,8 @@  void MainWindow::processCapture()
 		<< "timestamp:" << metadata.timestamp
 		<< "fps:" << 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 33522115b6be..5d6251c83070 100644
--- a/src/qcam/main_window.h
+++ b/src/qcam/main_window.h
@@ -55,6 +55,8 @@  private Q_SLOTS:
 
 	void saveImageAs();
 
+	void queueRequest(FrameBuffer *buffer);
+
 private:
 	int createToolbars();
 
@@ -66,8 +68,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;