diff options
author | Niklas Söderlund <niklas.soderlund@ragnatech.se> | 2020-01-10 18:41:30 +0100 |
---|---|---|
committer | Niklas Söderlund <niklas.soderlund@ragnatech.se> | 2020-01-12 16:10:38 +0100 |
commit | c89cfa534ba1d35e35de7d33c57a6c2906a5b11f (patch) | |
tree | 750a2919d7f91405407474bd3e9aaebff1867403 /src/cam/buffer_writer.cpp | |
parent | 164fbf17ff4f9798b4d43606d7cd70578ed46747 (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.cpp | 27 |
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); |