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>
This commit is contained in:
committed by
Laurent Pinchart
parent
8708904fad
commit
470513b6a7
@@ -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)
|
||||
|
||||
@@ -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__ */
|
||||
|
||||
Reference in New Issue
Block a user