summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorUmang Jain <umang.jain@ideasonboard.com>2021-08-14 10:39:12 +0530
committerUmang Jain <umang.jain@ideasonboard.com>2021-08-16 13:22:11 +0530
commitc2437e8cdefc7ae7efbfbd8662d822a02133084d (patch)
tree56186c95e4739e1f945c61316b65ea4444ef839c /src
parent3c5732d04a879d71d928e200d399c8d61b0da27a (diff)
ipa: vimc: Send and retrieve FrameBuffers from IPA
Plumb through VIMC mojo interface to enable buffers passing. VIMC does not have parameters or statistics buffers but we can mimick the typical case of passing IPA buffers from pipeline handler to IPA using mock buffers. The mock IPA buffers are FrameBuffers which are dmabuf backed (in other words, mmap()able through MappedFramebuffer inside the IPA). This commits shows: - Passing the parameter buffer from the pipeline handler to the IPA through functions defined in mojom interface. - Passing request controls ControlList to the IPA. Any tests using VIMC will now loop in the IPA paths. Any tests running in isolated mode will help us to test IPA IPC code paths especially around (de)serialization of data passing from pipeline handlers to the IPA. Future IPA interface tests can simply extend the vimc mojom interface to achieve/test a specific use case as required. Signed-off-by: Umang Jain <umang.jain@ideasonboard.com> Reviewed-by: Paul Elder <paul.elder@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Diffstat (limited to 'src')
-rw-r--r--src/ipa/vimc/vimc.cpp19
-rw-r--r--src/libcamera/pipeline/vimc/vimc.cpp11
2 files changed, 30 insertions, 0 deletions
diff --git a/src/ipa/vimc/vimc.cpp b/src/ipa/vimc/vimc.cpp
index 7d9d22d0..8481b82b 100644
--- a/src/ipa/vimc/vimc.cpp
+++ b/src/ipa/vimc/vimc.cpp
@@ -43,6 +43,9 @@ public:
void mapBuffers(const std::vector<IPABuffer> &buffers) override;
void unmapBuffers(const std::vector<unsigned int> &ids) override;
+ void fillParams(uint32_t frame, uint32_t bufferId) override;
+ void processControls(uint32_t frame, const ControlList &controls) override;
+
private:
void initTrace();
void trace(enum ipa::vimc::IPAOperationCode operation);
@@ -126,6 +129,22 @@ void IPAVimc::unmapBuffers(const std::vector<unsigned int> &ids)
}
}
+void IPAVimc::fillParams([[maybe_unused]] uint32_t frame, uint32_t bufferId)
+{
+ auto it = buffers_.find(bufferId);
+ if (it == buffers_.end()) {
+ LOG(IPAVimc, Error) << "Could not find parameter buffer";
+ return;
+ }
+
+ paramsFilled.emit(bufferId);
+}
+
+void IPAVimc::processControls([[maybe_unused]] uint32_t frame,
+ [[maybe_unused]] const ControlList &controls)
+{
+}
+
void IPAVimc::initTrace()
{
struct stat fifoStat;
diff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp
index e434cfbe..92b30f2e 100644
--- a/src/libcamera/pipeline/vimc/vimc.cpp
+++ b/src/libcamera/pipeline/vimc/vimc.cpp
@@ -52,6 +52,7 @@ public:
int init();
int allocateMockIPABuffers();
void bufferReady(FrameBuffer *buffer);
+ void paramsFilled(unsigned int id);
MediaDevice *media_;
std::unique_ptr<CameraSensor> sensor_;
@@ -431,6 +432,8 @@ int PipelineHandlerVimc::queueRequestDevice(Camera *camera, Request *request)
if (ret < 0)
return ret;
+ data->ipa_->processControls(request->sequence(), request->controls());
+
return 0;
}
@@ -464,6 +467,8 @@ bool PipelineHandlerVimc::match(DeviceEnumerator *enumerator)
return false;
}
+ data->ipa_->paramsFilled.connect(data.get(), &VimcCameraData::paramsFilled);
+
std::string conf = data->ipa_->configurationFile("vimc.conf");
data->ipa_->init(IPASettings{ conf, data->sensor_->model() });
@@ -568,6 +573,8 @@ void VimcCameraData::bufferReady(FrameBuffer *buffer)
pipe_->completeBuffer(request, buffer);
pipe_->completeRequest(request);
+
+ ipa_->fillParams(request->sequence(), mockIPABufs_[0]->cookie());
}
int VimcCameraData::allocateMockIPABuffers()
@@ -585,6 +592,10 @@ int VimcCameraData::allocateMockIPABuffers()
return video_->exportBuffers(kBufCount, &mockIPABufs_);
}
+void VimcCameraData::paramsFilled([[maybe_unused]] unsigned int id)
+{
+}
+
REGISTER_PIPELINE_HANDLER(PipelineHandlerVimc)
} /* namespace libcamera */