summaryrefslogtreecommitdiff
path: root/src/cam/buffer_writer.cpp
diff options
context:
space:
mode:
authorNiklas Söderlund <niklas.soderlund@ragnatech.se>2020-01-10 18:41:30 +0100
committerNiklas Söderlund <niklas.soderlund@ragnatech.se>2020-01-12 16:10:38 +0100
commitc89cfa534ba1d35e35de7d33c57a6c2906a5b11f (patch)
tree750a2919d7f91405407474bd3e9aaebff1867403 /src/cam/buffer_writer.cpp
parent164fbf17ff4f9798b4d43606d7cd70578ed46747 (diff)
cam: 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>
Diffstat (limited to 'src/cam/buffer_writer.cpp')
-rw-r--r--src/cam/buffer_writer.cpp27
1 files changed, 22 insertions, 5 deletions
diff --git a/src/cam/buffer_writer.cpp b/src/cam/buffer_writer.cpp
index 1d7366c8..c5a5eb46 100644
--- a/src/cam/buffer_writer.cpp
+++ b/src/cam/buffer_writer.cpp
@@ -22,6 +22,27 @@ BufferWriter::BufferWriter(const std::string &pattern)
{
}
+BufferWriter::~BufferWriter()
+{
+ for (auto &iter : mappedBuffers_) {
+ void *memory = iter.second.first;
+ unsigned int length = iter.second.second;
+ munmap(memory, length);
+ }
+ mappedBuffers_.clear();
+}
+
+void BufferWriter::mapBuffer(FrameBuffer *buffer)
+{
+ for (const FrameBuffer::Plane &plane : buffer->planes()) {
+ void *memory = mmap(NULL, plane.length, PROT_READ, MAP_SHARED,
+ plane.fd.fd(), 0);
+
+ mappedBuffers_[plane.fd.fd()] =
+ std::make_pair(memory, plane.length);
+ }
+}
+
int BufferWriter::write(FrameBuffer *buffer, const std::string &streamName)
{
std::string filename;
@@ -44,9 +65,7 @@ int BufferWriter::write(FrameBuffer *buffer, const std::string &streamName)
return -errno;
for (const FrameBuffer::Plane &plane : buffer->planes()) {
- /* \todo Once the FrameBuffer is done cache mapped memory. */
- void *data = mmap(NULL, plane.length, PROT_READ, MAP_SHARED,
- plane.fd.fd(), 0);
+ void *data = mappedBuffers_[plane.fd.fd()].first;
unsigned int length = plane.length;
ret = ::write(fd, data, length);
@@ -61,8 +80,6 @@ int BufferWriter::write(FrameBuffer *buffer, const std::string &streamName)
<< length << std::endl;
break;
}
-
- munmap(data, length);
}
close(fd);