[libcamera-devel] [RFC PATCH 06/10] qcam: main_window: Use offset mapping FrameBuffer
Hirokazu Honda
hiroh at chromium.org
Mon Aug 16 06:31:34 CEST 2021
FrameBuffer::Plane has offset info now. This uses the offset
in mapping FrameBuffer in MainWindow.
Signed-off-by: Hirokazu Honda <hiroh at 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 };
/* 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_;
--
2.33.0.rc1.237.g0d66db33f3-goog
More information about the libcamera-devel
mailing list