summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNiklas Söderlund <niklas.soderlund@ragnatech.se>2019-12-17 01:27:11 +0100
committerNiklas Söderlund <niklas.soderlund@ragnatech.se>2020-01-12 16:10:38 +0100
commit07156a2713609e7f4b53e240167c7e460b244a71 (patch)
tree6fd3868bff3a1890239082ee6314ca0704f20301
parentc89cfa534ba1d35e35de7d33c57a6c2906a5b11f (diff)
qcam: Cache buffer memory mapping
With the buffer allocator in use it's possible to cache the dmabuf memory mappings when starting the camera instead of mapping and unmapping them each time. Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
-rw-r--r--src/qcam/main_window.cpp28
-rw-r--r--src/qcam/main_window.h1
2 files changed, 23 insertions, 6 deletions
diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp
index 701a2b9a..047bf15e 100644
--- a/src/qcam/main_window.cpp
+++ b/src/qcam/main_window.cpp
@@ -201,6 +201,13 @@ int MainWindow::startCapture()
}
requests.push_back(request);
+
+ /* Map memory buffers and cache the mappings. */
+ 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);
}
titleTimer_.start(2000);
@@ -230,6 +237,13 @@ error:
for (Request *request : requests)
delete request;
+ for (auto &iter : mappedBuffers_) {
+ void *memory = iter.second.first;
+ unsigned int length = iter.second.second;
+ munmap(memory, length);
+ }
+ mappedBuffers_.clear();
+
camera_->freeBuffers();
return ret;
}
@@ -243,6 +257,13 @@ void MainWindow::stopCapture()
if (ret)
std::cout << "Failed to stop capture" << std::endl;
+ for (auto &iter : mappedBuffers_) {
+ void *memory = iter.second.first;
+ unsigned int length = iter.second.second;
+ munmap(memory, length);
+ }
+ mappedBuffers_.clear();
+
camera_->freeBuffers();
isCapturing_ = false;
@@ -297,15 +318,10 @@ int MainWindow::display(FrameBuffer *buffer)
if (buffer->planes().size() != 1)
return -EINVAL;
- /* \todo Once the FrameBuffer is done cache mapped memory. */
const FrameBuffer::Plane &plane = buffer->planes().front();
- void *memory = mmap(NULL, plane.length, PROT_READ, MAP_SHARED,
- plane.fd.fd(), 0);
-
+ void *memory = mappedBuffers_[plane.fd.fd()].first;
unsigned char *raw = static_cast<unsigned char *>(memory);
viewfinder_->display(raw, buffer->metadata().planes[0].bytesused);
- munmap(memory, plane.length);
-
return 0;
}
diff --git a/src/qcam/main_window.h b/src/qcam/main_window.h
index 05cde4ce..04fb9e3e 100644
--- a/src/qcam/main_window.h
+++ b/src/qcam/main_window.h
@@ -71,6 +71,7 @@ private:
uint32_t framesCaptured_;
ViewFinder *viewfinder_;
+ std::map<int, std::pair<void *, unsigned int>> mappedBuffers_;
};
#endif /* __QCAM_MAIN_WINDOW__ */