[libcamera-devel] [PATCH v2 09/11] libcamera: ipu3: Map buffers in IPA
Niklas Söderlund
niklas.soderlund at ragnatech.se
Tue Dec 29 17:03:16 CET 2020
Map and unmap the parameters and statistic buffers in the IPA when the
pipeline handler allocates and frees the buffers.
Signed-off-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
---
src/libcamera/pipeline/ipu3/ipu3.cpp | 26 ++++++++++++++++++++++++++
1 file changed, 26 insertions(+)
diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
index 95f1b75dc8be5d40..141066c528890c8e 100644
--- a/src/libcamera/pipeline/ipu3/ipu3.cpp
+++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
@@ -138,6 +138,8 @@ private:
ImgUDevice imgu1_;
MediaDevice *cio2MediaDev_;
MediaDevice *imguMediaDev_;
+
+ std::vector<IPABuffer> ipaBuffers_;
};
IPU3CameraConfiguration::IPU3CameraConfiguration(IPU3CameraData *data)
@@ -583,6 +585,23 @@ int PipelineHandlerIPU3::allocateBuffers(Camera *camera)
if (ret < 0)
return ret;
+ /* Map buffers to the IPA. */
+ unsigned int ipaBufferId = 1;
+
+ for (const std::unique_ptr<FrameBuffer> &buffer : imgu->paramBuffers_) {
+ buffer->setCookie(ipaBufferId++);
+ ipaBuffers_.push_back({ .id = buffer->cookie(),
+ .planes = buffer->planes() });
+ }
+
+ for (const std::unique_ptr<FrameBuffer> &buffer : imgu->statBuffers_) {
+ buffer->setCookie(ipaBufferId++);
+ ipaBuffers_.push_back({ .id = buffer->cookie(),
+ .planes = buffer->planes() });
+ }
+
+ data->ipa_->mapBuffers(ipaBuffers_);
+
return 0;
}
@@ -590,6 +609,13 @@ int PipelineHandlerIPU3::freeBuffers(Camera *camera)
{
IPU3CameraData *data = cameraData(camera);
+ std::vector<unsigned int> ids;
+ for (IPABuffer &ipabuf : ipaBuffers_)
+ ids.push_back(ipabuf.id);
+
+ data->ipa_->unmapBuffers(ids);
+ ipaBuffers_.clear();
+
data->imgu_->freeBuffers();
return 0;
--
2.29.2
More information about the libcamera-devel
mailing list