[libcamera-devel,RFC,06/10] qcam: main_window: Use offset mapping FrameBuffer
diff mbox series

Message ID 20210816043138.957984-7-hiroh@chromium.org
State Superseded
Headers show
Series
  • Add offset to FrameBuffer::Plane
Related show

Commit Message

Hirokazu Honda Aug. 16, 2021, 4:31 a.m. UTC
FrameBuffer::Plane has offset info now. This uses the offset
in mapping FrameBuffer in MainWindow.

Signed-off-by: Hirokazu Honda <hiroh@chromium.org>
---
 src/qcam/main_window.cpp | 15 ++++++++++-----
 src/qcam/main_window.h   |  1 +
 2 files changed, 11 insertions(+), 5 deletions(-)

Comments

Laurent Pinchart Aug. 18, 2021, 12:27 a.m. UTC | #1
Hi Hiro,

Thank you for the patch.

On Mon, Aug 16, 2021 at 01:31:34PM +0900, Hirokazu Honda wrote:
> FrameBuffer::Plane has offset info now. This uses the offset
> in mapping FrameBuffer in MainWindow.
> 
> Signed-off-by: Hirokazu Honda <hiroh@chromium.org>
> ---
>  src/qcam/main_window.cpp | 15 ++++++++++-----
>  src/qcam/main_window.h   |  1 +
>  2 files changed, 11 insertions(+), 5 deletions(-)
> 
> diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp
> index 39d034de..f815d281 100644
> --- a/src/qcam/main_window.cpp
> +++ b/src/qcam/main_window.cpp
> @@ -10,6 +10,7 @@
>  #include <iomanip>
>  #include <string>
>  #include <sys/mman.h>
> +#include <unistd.h>
>  
>  #include <QComboBox>
>  #include <QCoreApplication>
> @@ -472,9 +473,11 @@ int MainWindow::startCapture()
>  		for (const std::unique_ptr<FrameBuffer> &buffer : allocator_->buffers(stream)) {
>  			/* Map memory buffers and cache the mappings. */
>  			const FrameBuffer::Plane &plane = buffer->planes().front();
> -			void *memory = mmap(NULL, plane.length, PROT_READ, MAP_SHARED,
> +			size_t length = lseek(plane.fd.fd(), 0, SEEK_END);
> +			void *memory = mmap(NULL, length, PROT_READ, MAP_SHARED,
>  					    plane.fd.fd(), 0);
> -			mappedBuffers_[buffer.get()] = { memory, plane.length };
> +			mappedBuffers_[buffer.get()] = { memory, length };
> +			planeData_[buffer.get()] = { static_cast<uint8_t *>(memory) + plane.offset, plane.length };

Maybe with line wrap ? Up to you.

			planeData_[buffer.get()] = {
				static_cast<uint8_t *>(memory) + plane.offset,
				plane.length
			};

>  
>  			/* Store buffers on the free list. */
>  			freeBuffers_[stream].enqueue(buffer.get());
> @@ -541,6 +544,7 @@ error:
>  		munmap(buffer.memory, buffer.size);
>  	}
>  	mappedBuffers_.clear();
> +	planeData_.clear();
>  
>  	freeBuffers_.clear();
>  
> @@ -577,6 +581,7 @@ void MainWindow::stopCapture()
>  		munmap(buffer.memory, buffer.size);
>  	}
>  	mappedBuffers_.clear();
> +	planeData_.clear();
>  
>  	requests_.clear();
>  	freeQueue_.clear();
> @@ -673,10 +678,10 @@ void MainWindow::processRaw(FrameBuffer *buffer,
>  							"DNG Files (*.dng)");
>  
>  	if (!filename.isEmpty()) {
> -		const MappedBuffer &mapped = mappedBuffers_[buffer];
> +		void *memory = planeData_[buffer].memory;
>  		DNGWriter::write(filename.toStdString().c_str(), camera_.get(),
>  				 rawStream_->configuration(), metadata, buffer,
> -				 mapped.memory);
> +				 memory);
>  	}
>  #endif
>  
> @@ -753,7 +758,7 @@ void MainWindow::processViewfinder(FrameBuffer *buffer)
>  		<< "fps:" << Qt::fixed << qSetRealNumberPrecision(2) << fps;
>  
>  	/* Render the frame on the viewfinder. */
> -	viewfinder_->render(buffer, &mappedBuffers_[buffer]);
> +	viewfinder_->render(buffer, &planeData_[buffer]);
>  }
>  
>  void MainWindow::queueRequest(FrameBuffer *buffer)
> diff --git a/src/qcam/main_window.h b/src/qcam/main_window.h
> index 85d56ce4..d7ea994c 100644
> --- a/src/qcam/main_window.h
> +++ b/src/qcam/main_window.h
> @@ -107,6 +107,7 @@ private:
>  
>  	std::unique_ptr<CameraConfiguration> config_;
>  	std::map<FrameBuffer *, MappedBuffer> mappedBuffers_;
> +	std::map<FrameBuffer *, MappedBuffer> planeData_;

Could you store the memory in a Span<uint8_t> instead of a MappedBuffer
? I've sent a patch to replace MappedBuffer with Span in qcam, so you'll
likely notice when rebasing.

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

>  
>  	/* Capture state, buffers queue and statistics */
>  	bool isCapturing_;

Patch
diff mbox series

diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp
index 39d034de..f815d281 100644
--- a/src/qcam/main_window.cpp
+++ b/src/qcam/main_window.cpp
@@ -10,6 +10,7 @@ 
 #include <iomanip>
 #include <string>
 #include <sys/mman.h>
+#include <unistd.h>
 
 #include <QComboBox>
 #include <QCoreApplication>
@@ -472,9 +473,11 @@  int MainWindow::startCapture()
 		for (const std::unique_ptr<FrameBuffer> &buffer : allocator_->buffers(stream)) {
 			/* Map memory buffers and cache the mappings. */
 			const FrameBuffer::Plane &plane = buffer->planes().front();
-			void *memory = mmap(NULL, plane.length, PROT_READ, MAP_SHARED,
+			size_t length = lseek(plane.fd.fd(), 0, SEEK_END);
+			void *memory = mmap(NULL, length, PROT_READ, MAP_SHARED,
 					    plane.fd.fd(), 0);
-			mappedBuffers_[buffer.get()] = { memory, plane.length };
+			mappedBuffers_[buffer.get()] = { memory, length };
+			planeData_[buffer.get()] = { static_cast<uint8_t *>(memory) + plane.offset, plane.length };
 
 			/* Store buffers on the free list. */
 			freeBuffers_[stream].enqueue(buffer.get());
@@ -541,6 +544,7 @@  error:
 		munmap(buffer.memory, buffer.size);
 	}
 	mappedBuffers_.clear();
+	planeData_.clear();
 
 	freeBuffers_.clear();
 
@@ -577,6 +581,7 @@  void MainWindow::stopCapture()
 		munmap(buffer.memory, buffer.size);
 	}
 	mappedBuffers_.clear();
+	planeData_.clear();
 
 	requests_.clear();
 	freeQueue_.clear();
@@ -673,10 +678,10 @@  void MainWindow::processRaw(FrameBuffer *buffer,
 							"DNG Files (*.dng)");
 
 	if (!filename.isEmpty()) {
-		const MappedBuffer &mapped = mappedBuffers_[buffer];
+		void *memory = planeData_[buffer].memory;
 		DNGWriter::write(filename.toStdString().c_str(), camera_.get(),
 				 rawStream_->configuration(), metadata, buffer,
-				 mapped.memory);
+				 memory);
 	}
 #endif
 
@@ -753,7 +758,7 @@  void MainWindow::processViewfinder(FrameBuffer *buffer)
 		<< "fps:" << Qt::fixed << qSetRealNumberPrecision(2) << fps;
 
 	/* Render the frame on the viewfinder. */
-	viewfinder_->render(buffer, &mappedBuffers_[buffer]);
+	viewfinder_->render(buffer, &planeData_[buffer]);
 }
 
 void MainWindow::queueRequest(FrameBuffer *buffer)
diff --git a/src/qcam/main_window.h b/src/qcam/main_window.h
index 85d56ce4..d7ea994c 100644
--- a/src/qcam/main_window.h
+++ b/src/qcam/main_window.h
@@ -107,6 +107,7 @@  private:
 
 	std::unique_ptr<CameraConfiguration> config_;
 	std::map<FrameBuffer *, MappedBuffer> mappedBuffers_;
+	std::map<FrameBuffer *, MappedBuffer> planeData_;
 
 	/* Capture state, buffers queue and statistics */
 	bool isCapturing_;