mirror of
https://git.libcamera.org/libcamera/libcamera.git
synced 2025-07-20 02:45:08 +03:00
pipeline: raspberrypi: Use MappedFrameBuffer for embedded data buffers
Use a MappedFrameBuffer to mmap embedded data buffers for the pipeline handler to use in the cases where the sensor does not fill it in. This avoids the need to mmap and unmap on every frame. Signed-off-by: Naushir Patuck <naush@raspberrypi.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
This commit is contained in:
parent
d14a3f8ae6
commit
6f51e39d78
1 changed files with 25 additions and 8 deletions
|
@ -24,6 +24,7 @@
|
|||
#include <linux/videodev2.h>
|
||||
|
||||
#include "libcamera/internal/bayer_format.h"
|
||||
#include "libcamera/internal/buffer.h"
|
||||
#include "libcamera/internal/camera_sensor.h"
|
||||
#include "libcamera/internal/device_enumerator.h"
|
||||
#include "libcamera/internal/ipa_manager.h"
|
||||
|
@ -165,6 +166,12 @@ public:
|
|||
/* Stores the ids of the buffers mapped in the IPA. */
|
||||
std::unordered_set<unsigned int> ipaBuffers_;
|
||||
|
||||
/*
|
||||
* Map of (internal) mmaped embedded data buffers, to avoid having to
|
||||
* map/unmap on every frame.
|
||||
*/
|
||||
std::map<unsigned int, MappedFrameBuffer> mappedEmbeddedBuffers_;
|
||||
|
||||
/* DMAHEAP allocation helper. */
|
||||
RPi::DmaHeap dmaHeap_;
|
||||
FileDescriptor lsTable_;
|
||||
|
@ -1061,6 +1068,13 @@ int PipelineHandlerRPi::prepareBuffers(Camera *camera)
|
|||
return ret;
|
||||
}
|
||||
|
||||
if (!data->sensorMetadata_) {
|
||||
for (auto const &it : data->unicam_[Unicam::Embedded].getBuffers()) {
|
||||
MappedFrameBuffer fb(it.second, PROT_READ | PROT_WRITE);
|
||||
data->mappedEmbeddedBuffers_.emplace(it.first, std::move(fb));
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Pass the stats and embedded data buffers to the IPA. No other
|
||||
* buffers need to be passed.
|
||||
|
@ -1099,6 +1113,7 @@ void PipelineHandlerRPi::freeBuffers(Camera *camera)
|
|||
std::vector<unsigned int> ipaBuffers(data->ipaBuffers_.begin(), data->ipaBuffers_.end());
|
||||
data->ipa_->unmapBuffers(ipaBuffers);
|
||||
data->ipaBuffers_.clear();
|
||||
data->mappedEmbeddedBuffers_.clear();
|
||||
|
||||
for (auto const stream : data->streams_)
|
||||
stream->releaseBuffers();
|
||||
|
@ -1349,14 +1364,16 @@ void RPiCameraData::unicamBufferDequeue(FrameBuffer *buffer)
|
|||
* metadata buffer.
|
||||
*/
|
||||
if (!sensorMetadata_) {
|
||||
const FrameBuffer &fb = buffer->planes();
|
||||
uint32_t *mem = static_cast<uint32_t *>(::mmap(nullptr, fb.planes()[0].length,
|
||||
PROT_READ | PROT_WRITE,
|
||||
MAP_SHARED,
|
||||
fb.planes()[0].fd.fd(), 0));
|
||||
mem[0] = ctrl[V4L2_CID_EXPOSURE];
|
||||
mem[1] = ctrl[V4L2_CID_ANALOGUE_GAIN];
|
||||
munmap(mem, fb.planes()[0].length);
|
||||
unsigned int bufferId = unicam_[Unicam::Embedded].getBufferId(buffer);
|
||||
auto it = mappedEmbeddedBuffers_.find(bufferId);
|
||||
if (it != mappedEmbeddedBuffers_.end()) {
|
||||
uint32_t *mem = reinterpret_cast<uint32_t *>(it->second.maps()[0].data());
|
||||
mem[0] = ctrl[V4L2_CID_EXPOSURE];
|
||||
mem[1] = ctrl[V4L2_CID_ANALOGUE_GAIN];
|
||||
} else {
|
||||
LOG(RPI, Warning) << "Failed to find embedded buffer "
|
||||
<< bufferId;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue