diff options
-rw-r--r-- | include/libcamera/ipa/vimc.mojom | 11 | ||||
-rw-r--r-- | src/ipa/vimc/vimc.cpp | 19 | ||||
-rw-r--r-- | src/libcamera/pipeline/vimc/vimc.cpp | 11 |
3 files changed, 40 insertions, 1 deletions
diff --git a/include/libcamera/ipa/vimc.mojom b/include/libcamera/ipa/vimc.mojom index 8cb240d3..e3b14e38 100644 --- a/include/libcamera/ipa/vimc.mojom +++ b/include/libcamera/ipa/vimc.mojom @@ -29,8 +29,17 @@ interface IPAVimcInterface { mapBuffers(array<libcamera.IPABuffer> buffers); unmapBuffers(array<uint32> ids); + + /* + * The vimc driver doesn't use parameters buffers. To maximize coverage + * of unit tests that rely on the VIMC pipeline handler, we still define + * interface functions that mimick how other pipeline handlers typically + * handle parameters at runtime. + */ + [async] fillParams(uint32 frame, uint32 bufferId); + [async] processControls(uint32 frame, libcamera.ControlList controls); }; interface IPAVimcEventInterface { - dummyEvent(uint32 val); + paramsFilled(uint32 bufferId); }; 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 */ |