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>
This commit is contained in:
Niklas Söderlund 2020-01-10 18:41:30 +01:00
parent 164fbf17ff
commit c89cfa534b
3 changed files with 30 additions and 5 deletions

View file

@ -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);

View file

@ -7,6 +7,7 @@
#ifndef __LIBCAMERA_BUFFER_WRITER_H__
#define __LIBCAMERA_BUFFER_WRITER_H__
#include <map>
#include <string>
#include <libcamera/buffer.h>
@ -15,12 +16,16 @@ class BufferWriter
{
public:
BufferWriter(const std::string &pattern = "frame-#.bin");
~BufferWriter();
void mapBuffer(libcamera::FrameBuffer *buffer);
int write(libcamera::FrameBuffer *buffer,
const std::string &streamName);
private:
std::string pattern_;
std::map<int, std::pair<void *, unsigned int>> mappedBuffers_;
};
#endif /* __LIBCAMERA_BUFFER_WRITER_H__ */

View file

@ -116,6 +116,9 @@ int Capture::capture(EventLoop *loop, FrameBufferAllocator *allocator)
<< std::endl;
return ret;
}
if (writer_)
writer_->mapBuffer(buffer.get());
}
requests.push_back(request);