diff options
author | Hirokazu Honda <hiroh@chromium.org> | 2021-08-26 20:25:33 +0900 |
---|---|---|
committer | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2021-08-30 18:08:02 +0300 |
commit | 470513b6a7734ced9beea2e1d673a37ba0f82b35 (patch) | |
tree | b564fcd793176eac3c7b797710037a94f01fcaa0 /src | |
parent | 8708904fad6f4ff94a30e2b3b537012b7c637c4d (diff) |
cam: file_sink: Use offset in mapping FrameBuffer
This fixes the way of mapping FrameBuffer in FrameSink by
using offset.
Signed-off-by: Hirokazu Honda <hiroh@chromium.org>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/cam/file_sink.cpp | 20 | ||||
-rw-r--r-- | src/cam/file_sink.h | 1 |
2 files changed, 16 insertions, 5 deletions
diff --git a/src/cam/file_sink.cpp b/src/cam/file_sink.cpp index 2d30694a..0b529e3e 100644 --- a/src/cam/file_sink.cpp +++ b/src/cam/file_sink.cpp @@ -51,12 +51,22 @@ int FileSink::configure(const libcamera::CameraConfiguration &config) void FileSink::mapBuffer(FrameBuffer *buffer) { + /* \todo use MappedFrameBuffer. */ for (const FrameBuffer::Plane &plane : buffer->planes()) { - void *memory = mmap(NULL, plane.length, PROT_READ, MAP_SHARED, - plane.fd.fd(), 0); + const int fd = plane.fd.fd(); + if (mappedBuffers_.find(fd) == mappedBuffers_.end()) { + /** + * \todo Should we try to only map the portions of the + * dmabuf that are used by planes ? + */ + size_t length = lseek(fd, 0, SEEK_END); + void *memory = mmap(NULL, plane.length, PROT_READ, + MAP_SHARED, fd, 0); + mappedBuffers_[fd] = std::make_pair(memory, length); + } - mappedBuffers_[plane.fd.fd()] = - std::make_pair(memory, plane.length); + void *memory = mappedBuffers_[fd].first; + planeData_[&plane] = static_cast<uint8_t *>(memory) + plane.offset; } } @@ -102,7 +112,7 @@ void FileSink::writeBuffer(const Stream *stream, FrameBuffer *buffer) const FrameBuffer::Plane &plane = buffer->planes()[i]; const FrameMetadata::Plane &meta = buffer->metadata().planes[i]; - void *data = mappedBuffers_[plane.fd.fd()].first; + uint8_t *data = planeData_[&plane]; unsigned int length = std::min(meta.bytesused, plane.length); if (meta.bytesused > plane.length) diff --git a/src/cam/file_sink.h b/src/cam/file_sink.h index c3eb230a..c12325d9 100644 --- a/src/cam/file_sink.h +++ b/src/cam/file_sink.h @@ -33,6 +33,7 @@ private: std::map<const libcamera::Stream *, std::string> streamNames_; std::string pattern_; std::map<int, std::pair<void *, unsigned int>> mappedBuffers_; + std::map<const libcamera::FrameBuffer::Plane *, uint8_t *> planeData_; }; #endif /* __CAM_FILE_SINK_H__ */ |