diff options
author | Hirokazu Honda <hiroh@chromium.org> | 2021-08-26 20:25:35 +0900 |
---|---|---|
committer | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2021-08-30 18:08:02 +0300 |
commit | 1d2263dd3d7dc68d8d1920682952e17d0a22ed95 (patch) | |
tree | d91cd47b9f4b6c581f9d03ba030abe3fd81dfeb0 /src/qcam | |
parent | 73994ec6bcc99e8df342d7c076d1b01261848c34 (diff) |
qcam: main_window: Use offset mapping FrameBuffer
FrameBuffer::Plane has offset info now. This uses the offset
in mapping FrameBuffer in MainWindow.
Signed-off-by: Hirokazu Honda <hiroh@chromium.org>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Diffstat (limited to 'src/qcam')
-rw-r--r-- | src/qcam/main_window.cpp | 15 | ||||
-rw-r--r-- | src/qcam/main_window.h | 1 |
2 files changed, 12 insertions, 4 deletions
diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp index 1adaae60..3669c0b9 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,10 +473,14 @@ 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()] = { static_cast<uint8_t *>(memory), plane.length }; + planeData_[buffer.get()] = { static_cast<uint8_t *>(memory) + plane.offset, + plane.length }; /* Store buffers on the free list. */ freeBuffers_[stream].enqueue(buffer.get()); @@ -542,6 +547,7 @@ error: munmap(buffer.data(), buffer.size()); } mappedBuffers_.clear(); + planeData_.clear(); freeBuffers_.clear(); @@ -578,6 +584,7 @@ void MainWindow::stopCapture() munmap(buffer.data(), buffer.size()); } mappedBuffers_.clear(); + planeData_.clear(); requests_.clear(); freeQueue_.clear(); @@ -674,10 +681,10 @@ void MainWindow::processRaw(FrameBuffer *buffer, "DNG Files (*.dng)"); if (!filename.isEmpty()) { - const Span<uint8_t> &mapped = mappedBuffers_[buffer]; + uint8_t *memory = planeData_[buffer].data(); DNGWriter::write(filename.toStdString().c_str(), camera_.get(), rawStream_->configuration(), metadata, buffer, - mapped.data()); + memory); } #endif @@ -754,7 +761,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 6788de8d..28244bca 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 *, Span<uint8_t>> mappedBuffers_; + std::map<FrameBuffer *, Span<uint8_t>> planeData_; /* Capture state, buffers queue and statistics */ bool isCapturing_; |