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

Kieran Bingham kieran.bingham at ideasonboard.com
Mon Mar 23 17:16:04 CET 2020


Hi Laurent,

On 23/03/2020 14:21, Laurent Pinchart wrote:
> 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.
> 

Seems reasonable for now ...

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

> Signed-off-by: Laurent Pinchart <laurent.pinchart at 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(-)
> 
> diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp
> index 184345b0e2a6..c0feb91a6fb1 100644
> --- a/src/qcam/main_window.cpp
> +++ b/src/qcam/main_window.cpp
> @@ -28,8 +28,6 @@
>  #include <libcamera/camera_manager.h>
>  #include <libcamera/version.h>
>  
> -#include "viewfinder.h"
> -
>  using namespace libcamera;
>  
>  /**
> @@ -350,8 +348,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. */
> @@ -391,9 +388,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();
>  
> @@ -421,9 +417,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();
>  
> @@ -529,10 +524,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]);

Wow, yes that's simpler!

>  
>  	return 0;
>  }
> diff --git a/src/qcam/main_window.h b/src/qcam/main_window.h
> index fcde88c14f77..0918ae5307d8 100644
> --- a/src/qcam/main_window.h
> +++ b/src/qcam/main_window.h
> @@ -23,11 +23,11 @@
>  #include <libcamera/stream.h>
>  
>  #include "../cam/options.h"
> +#include "viewfinder.h"
>  
>  using namespace libcamera;
>  
>  class QAction;
> -class ViewFinder;
>  
>  enum {
>  	OptCamera = 'c',
> @@ -85,7 +85,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();
>  
> 

-- 
Regards
--
Kieran


More information about the libcamera-devel mailing list