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:
parent
164fbf17ff
commit
c89cfa534b
3 changed files with 30 additions and 5 deletions
|
@ -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)
|
int BufferWriter::write(FrameBuffer *buffer, const std::string &streamName)
|
||||||
{
|
{
|
||||||
std::string filename;
|
std::string filename;
|
||||||
|
@ -44,9 +65,7 @@ int BufferWriter::write(FrameBuffer *buffer, const std::string &streamName)
|
||||||
return -errno;
|
return -errno;
|
||||||
|
|
||||||
for (const FrameBuffer::Plane &plane : buffer->planes()) {
|
for (const FrameBuffer::Plane &plane : buffer->planes()) {
|
||||||
/* \todo Once the FrameBuffer is done cache mapped memory. */
|
void *data = mappedBuffers_[plane.fd.fd()].first;
|
||||||
void *data = mmap(NULL, plane.length, PROT_READ, MAP_SHARED,
|
|
||||||
plane.fd.fd(), 0);
|
|
||||||
unsigned int length = plane.length;
|
unsigned int length = plane.length;
|
||||||
|
|
||||||
ret = ::write(fd, data, length);
|
ret = ::write(fd, data, length);
|
||||||
|
@ -61,8 +80,6 @@ int BufferWriter::write(FrameBuffer *buffer, const std::string &streamName)
|
||||||
<< length << std::endl;
|
<< length << std::endl;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
munmap(data, length);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
close(fd);
|
close(fd);
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
#ifndef __LIBCAMERA_BUFFER_WRITER_H__
|
#ifndef __LIBCAMERA_BUFFER_WRITER_H__
|
||||||
#define __LIBCAMERA_BUFFER_WRITER_H__
|
#define __LIBCAMERA_BUFFER_WRITER_H__
|
||||||
|
|
||||||
|
#include <map>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#include <libcamera/buffer.h>
|
#include <libcamera/buffer.h>
|
||||||
|
@ -15,12 +16,16 @@ class BufferWriter
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
BufferWriter(const std::string &pattern = "frame-#.bin");
|
BufferWriter(const std::string &pattern = "frame-#.bin");
|
||||||
|
~BufferWriter();
|
||||||
|
|
||||||
|
void mapBuffer(libcamera::FrameBuffer *buffer);
|
||||||
|
|
||||||
int write(libcamera::FrameBuffer *buffer,
|
int write(libcamera::FrameBuffer *buffer,
|
||||||
const std::string &streamName);
|
const std::string &streamName);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::string pattern_;
|
std::string pattern_;
|
||||||
|
std::map<int, std::pair<void *, unsigned int>> mappedBuffers_;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* __LIBCAMERA_BUFFER_WRITER_H__ */
|
#endif /* __LIBCAMERA_BUFFER_WRITER_H__ */
|
||||||
|
|
|
@ -116,6 +116,9 @@ int Capture::capture(EventLoop *loop, FrameBufferAllocator *allocator)
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (writer_)
|
||||||
|
writer_->mapBuffer(buffer.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
requests.push_back(request);
|
requests.push_back(request);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue