[libcamera-devel] [PATCH 07/13] pipeline: ipa: raspberrypi: Replace IPA metadataReady() call
Jacopo Mondi
jacopo.mondi at ideasonboard.com
Wed Apr 26 18:18:44 CEST 2023
Hi Naush
On Wed, Apr 26, 2023 at 02:10:51PM +0100, Naushir Patuck via libcamera-devel wrote:
> Remove the IPA -> pipeline metadataReady() call to signify the return
> Request metdata is ready to be consumed. Instead, replace this with a
> new pipeline -> IPA reportMetadata() call that explicitly ask the IPA
> to fill in the Request metdata at an appropriate time.
>
> This change allows the pipeline handler to dictate when it receives the
> metadata from the IPA if the structure of the pipeline were to ever
> change.
>
> Signed-off-by: Naushir Patuck <naush at raspberrypi.com>
Reviewed-by: Jacopo Mondi <jacopo.mondi at ideasonboard.com>
Thanks
j
> ---
> include/libcamera/ipa/raspberrypi.mojom | 2 ++
> src/ipa/rpi/vc4/raspberrypi.cpp | 9 ++++-----
> src/libcamera/pipeline/rpi/vc4/raspberrypi.cpp | 18 +++++++-----------
> 3 files changed, 13 insertions(+), 16 deletions(-)
>
> diff --git a/include/libcamera/ipa/raspberrypi.mojom b/include/libcamera/ipa/raspberrypi.mojom
> index 7d56248f4ab3..620f13ba9717 100644
> --- a/include/libcamera/ipa/raspberrypi.mojom
> +++ b/include/libcamera/ipa/raspberrypi.mojom
> @@ -82,6 +82,8 @@ interface IPARPiInterface {
>
> [async] prepareIsp(PrepareParams params);
> [async] processStats(ProcessParams params);
> +
> + reportMetadata(uint32 ipaContext) => (libcamera.ControlList controls);
> };
>
> interface IPARPiEventInterface {
> diff --git a/src/ipa/rpi/vc4/raspberrypi.cpp b/src/ipa/rpi/vc4/raspberrypi.cpp
> index d737f1d662a0..e3ca8e2f7cbe 100644
> --- a/src/ipa/rpi/vc4/raspberrypi.cpp
> +++ b/src/ipa/rpi/vc4/raspberrypi.cpp
> @@ -154,7 +154,7 @@ private:
> bool validateLensControls();
> void applyControls(const ControlList &controls);
> void prepare(const PrepareParams ¶ms);
> - void reportMetadata(unsigned int ipaContext);
> + void reportMetadata(unsigned int ipaContext, ControlList *controls) override;
> void fillDeviceStatus(const ControlList &sensorControls, unsigned int ipaContext);
> RPiController::StatisticsPtr fillStatistics(bcm2835_isp_stats *stats) const;
> void process(unsigned int bufferId, unsigned int ipaContext);
> @@ -565,7 +565,6 @@ void IPARPi::processStats(const ProcessParams ¶ms)
> if (processPending_ && frameCount_ > mistrustCount_)
> process(params.buffers.stats, context);
>
> - reportMetadata(context);
> processStatsComplete.emit(params.buffers);
> }
>
> @@ -586,9 +585,9 @@ void IPARPi::prepareIsp(const PrepareParams ¶ms)
> prepareIspComplete.emit(params.buffers);
> }
>
> -void IPARPi::reportMetadata(unsigned int ipaContext)
> +void IPARPi::reportMetadata(unsigned int ipaContext, ControlList *controls)
> {
> - RPiController::Metadata &rpiMetadata = rpiMetadata_[ipaContext];
> + RPiController::Metadata &rpiMetadata = rpiMetadata_[ipaContext % rpiMetadata_.size()];
> std::unique_lock<RPiController::Metadata> lock(rpiMetadata);
>
> /*
> @@ -697,7 +696,7 @@ void IPARPi::reportMetadata(unsigned int ipaContext)
> libcameraMetadata_.set(controls::AfPauseState, p);
> }
>
> - metadataReady.emit(libcameraMetadata_);
> + *controls = std::move(libcameraMetadata_);
> }
>
> bool IPARPi::validateSensorControls()
> diff --git a/src/libcamera/pipeline/rpi/vc4/raspberrypi.cpp b/src/libcamera/pipeline/rpi/vc4/raspberrypi.cpp
> index 30ce6feab0d1..bd66468683df 100644
> --- a/src/libcamera/pipeline/rpi/vc4/raspberrypi.cpp
> +++ b/src/libcamera/pipeline/rpi/vc4/raspberrypi.cpp
> @@ -207,7 +207,6 @@ public:
> void enumerateVideoDevices(MediaLink *link);
>
> void processStatsComplete(const ipa::RPi::BufferIds &buffers);
> - void metadataReady(const ControlList &metadata);
> void prepareIspComplete(const ipa::RPi::BufferIds &buffers);
> void setIspControls(const ControlList &controls);
> void setDelayedControls(const ControlList &controls, uint32_t delayContext);
> @@ -1652,7 +1651,6 @@ int RPiCameraData::loadIPA(ipa::RPi::InitResult *result)
>
> ipa_->processStatsComplete.connect(this, &RPiCameraData::processStatsComplete);
> ipa_->prepareIspComplete.connect(this, &RPiCameraData::prepareIspComplete);
> - ipa_->metadataReady.connect(this, &RPiCameraData::metadataReady);
> ipa_->setIspControls.connect(this, &RPiCameraData::setIspControls);
> ipa_->setDelayedControls.connect(this, &RPiCameraData::setDelayedControls);
> ipa_->setLensControls.connect(this, &RPiCameraData::setLensControls);
> @@ -1892,17 +1890,12 @@ void RPiCameraData::processStatsComplete(const ipa::RPi::BufferIds &buffers)
> FrameBuffer *buffer = isp_[Isp::Stats].getBuffers().at(buffers.stats & RPi::MaskID);
>
> handleStreamBuffer(buffer, &isp_[Isp::Stats]);
> - state_ = State::IpaComplete;
> - handleState();
> -}
>
> -void RPiCameraData::metadataReady(const ControlList &metadata)
> -{
> - if (!isRunning())
> - return;
> -
> - /* Add to the Request metadata buffer what the IPA has provided. */
> + /* Last thing to do is to fill up the request metadata. */
> Request *request = requestQueue_.front();
> + ControlList metadata;
> +
> + ipa_->reportMetadata(request->sequence(), &metadata);
> request->metadata().merge(metadata);
>
> /*
> @@ -1923,6 +1916,9 @@ void RPiCameraData::metadataReady(const ControlList &metadata)
>
> sensor_->setControls(&ctrls);
> }
> +
> + state_ = State::IpaComplete;
> + handleState();
> }
>
> void RPiCameraData::prepareIspComplete(const ipa::RPi::BufferIds &buffers)
> --
> 2.34.1
>
More information about the libcamera-devel
mailing list