[libcamera-devel,v2,13/21] qcam: viewfinder: Add MappedBuffer to store memory mapping information

Message ID 20200323173559.21109-14-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 new MappedBuffer structure replaces the std::pair<> used in the
mapped buffers map, and allows passing data to the ViewFinder::display()
function in a more structured way.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
---
 src/qcam/main_window.cpp | 20 ++++++--------------
 src/qcam/main_window.h   |  4 ++--
 src/qcam/viewfinder.cpp  |  6 ++++--
 src/qcam/viewfinder.h    | 10 +++++++++-
 4 files changed, 21 insertions(+), 19 deletions(-)

Patch

diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp
index cb8f769e9bb8..d10c542c0b6d 100644
--- a/src/qcam/main_window.cpp
+++ b/src/qcam/main_window.cpp
@@ -27,8 +27,6 @@ 
 #include <libcamera/camera_manager.h>
 #include <libcamera/version.h>
 
-#include "viewfinder.h"
-
 using namespace libcamera;
 
 /**
@@ -354,8 +352,7 @@  int MainWindow::startCapture()
 		const FrameBuffer::Plane &plane = buffer->planes().front();
 		void *memory = mmap(NULL, plane.length, PROT_READ, MAP_SHARED,
 				    plane.fd.fd(), 0);
-		mappedBuffers_[plane.fd.fd()] =
-			std::make_pair(memory, plane.length);
+		mappedBuffers_[buffer.get()] = { memory, plane.length };
 	}
 
 	/* Start the title timer and the camera. */
@@ -395,9 +392,8 @@  error:
 		delete request;
 
 	for (auto &iter : mappedBuffers_) {
-		void *memory = iter.second.first;
-		unsigned int length = iter.second.second;
-		munmap(memory, length);
+		const MappedBuffer &buffer = iter.second;
+		munmap(buffer.memory, buffer.size);
 	}
 	mappedBuffers_.clear();
 
@@ -425,9 +421,8 @@  void MainWindow::stopCapture()
 	camera_->requestCompleted.disconnect(this, &MainWindow::requestComplete);
 
 	for (auto &iter : mappedBuffers_) {
-		void *memory = iter.second.first;
-		unsigned int length = iter.second.second;
-		munmap(memory, length);
+		const MappedBuffer &buffer = iter.second;
+		munmap(buffer.memory, buffer.size);
 	}
 	mappedBuffers_.clear();
 
@@ -534,10 +529,7 @@  int MainWindow::display(FrameBuffer *buffer)
 	if (buffer->planes().size() != 1)
 		return -EINVAL;
 
-	const FrameBuffer::Plane &plane = buffer->planes().front();
-	void *memory = mappedBuffers_[plane.fd.fd()].first;
-	unsigned char *raw = static_cast<unsigned char *>(memory);
-	viewfinder_->display(raw, buffer->metadata().planes[0].bytesused);
+	viewfinder_->display(buffer, &mappedBuffers_[buffer]);
 
 	return 0;
 }
diff --git a/src/qcam/main_window.h b/src/qcam/main_window.h
index c662a2ef3bcf..71206bc96fc4 100644
--- a/src/qcam/main_window.h
+++ b/src/qcam/main_window.h
@@ -24,11 +24,11 @@ 
 #include <libcamera/stream.h>
 
 #include "../cam/options.h"
+#include "viewfinder.h"
 
 using namespace libcamera;
 
 class QAction;
-class ViewFinder;
 
 enum {
 	OptCamera = 'c',
@@ -89,7 +89,7 @@  private:
 	FrameBufferAllocator *allocator_;
 
 	std::unique_ptr<CameraConfiguration> config_;
-	std::map<int, std::pair<void *, unsigned int>> mappedBuffers_;
+	std::map<FrameBuffer *, MappedBuffer> mappedBuffers_;
 
 	/* Capture state, buffers queue and statistics */
 	bool isCapturing_;
diff --git a/src/qcam/viewfinder.cpp b/src/qcam/viewfinder.cpp
index 066ac605e7b4..d00edc33dfb7 100644
--- a/src/qcam/viewfinder.cpp
+++ b/src/qcam/viewfinder.cpp
@@ -24,7 +24,8 @@  ViewFinder::~ViewFinder()
 	delete image_;
 }
 
-void ViewFinder::display(const unsigned char *raw, size_t size)
+void ViewFinder::display(const libcamera::FrameBuffer *buffer,
+			 MappedBuffer *map)
 {
 	QMutexLocker locker(&mutex_);
 
@@ -34,7 +35,8 @@  void ViewFinder::display(const unsigned char *raw, size_t size)
 	 * impacting performances.
 	 */
 
-	converter_.convert(raw, size, image_);
+	converter_.convert(static_cast<unsigned char *>(map->memory),
+			   buffer->metadata().planes[0].bytesused, image_);
 	update();
 }
 
diff --git a/src/qcam/viewfinder.h b/src/qcam/viewfinder.h
index a019c3a470ea..735a6b67e91d 100644
--- a/src/qcam/viewfinder.h
+++ b/src/qcam/viewfinder.h
@@ -7,16 +7,24 @@ 
 #ifndef __QCAM_VIEWFINDER_H__
 #define __QCAM_VIEWFINDER_H__
 
+#include <stddef.h>
+
 #include <QMutex>
 #include <QSize>
 #include <QWidget>
 
+#include <libcamera/buffer.h>
 #include <libcamera/pixelformats.h>
 
 #include "format_converter.h"
 
 class QImage;
 
+struct MappedBuffer {
+	void *memory;
+	size_t size;
+};
+
 class ViewFinder : public QWidget
 {
 public:
@@ -24,7 +32,7 @@  public:
 	~ViewFinder();
 
 	int setFormat(const libcamera::PixelFormat &format, const QSize &size);
-	void display(const unsigned char *rgb, size_t size);
+	void display(const libcamera::FrameBuffer *buffer, MappedBuffer *map);
 
 	QImage getCurrentImage();