[libcamera-devel] [PATCH v2 6/7] pipeline: ipa: raspberrypi: Use IPA cookies
David Plowman
david.plowman at raspberrypi.com
Fri Sep 23 12:42:09 CEST 2022
Hi Naush
Thanks for the patch.
On Mon, 5 Sept 2022 at 08:40, Naushir Patuck via libcamera-devel
<libcamera-devel at lists.libcamera.org> wrote:
>
> Pass an IPA cookie from the IPA to the pipeline handler through the
> setDelayedControls signal. This cookie is the index of the current
> RPiController::Metadata context used for the frame. The cookie is subsequently
> passed into DelayedControls together with the controls to action.
>
> The IPA cookie is then returned from DelayedControls when the frame with the
> applied controls has been returned from the sensor, and eventually passed back
> to the IPA from the signalIspPrepare signal.
>
> Signed-off-by: Naushir Patuck <naush at raspberrypi.com>
Not a lot to add to this one either... LGTM.
Reviewed-by: David Plowman <david.plowman at raspberrypi.com>
Tested-by: David Plowman <david.plowman at raspberrypi.com>
Thanks!
David
> ---
> include/libcamera/ipa/raspberrypi.mojom | 3 ++-
> src/ipa/raspberrypi/raspberrypi.cpp | 2 +-
> src/libcamera/pipeline/raspberrypi/raspberrypi.cpp | 12 +++++++-----
> 3 files changed, 10 insertions(+), 7 deletions(-)
>
> diff --git a/include/libcamera/ipa/raspberrypi.mojom b/include/libcamera/ipa/raspberrypi.mojom
> index c0de435b7b33..fb806a1518d5 100644
> --- a/include/libcamera/ipa/raspberrypi.mojom
> +++ b/include/libcamera/ipa/raspberrypi.mojom
> @@ -36,6 +36,7 @@ struct ISPConfig {
> uint32 bayerBufferId;
> bool embeddedBufferPresent;
> libcamera.ControlList controls;
> + uint32 ipaCookie;
> };
>
> struct IPAConfig {
> @@ -136,5 +137,5 @@ interface IPARPiEventInterface {
> runIsp(uint32 bufferId);
> embeddedComplete(uint32 bufferId);
> setIspControls(libcamera.ControlList controls);
> - setDelayedControls(libcamera.ControlList controls);
> + setDelayedControls(libcamera.ControlList controls, uint32 ipaCookie);
> };
> diff --git a/src/ipa/raspberrypi/raspberrypi.cpp b/src/ipa/raspberrypi/raspberrypi.cpp
> index 63cccda901c1..0e80ef9c7b95 100644
> --- a/src/ipa/raspberrypi/raspberrypi.cpp
> +++ b/src/ipa/raspberrypi/raspberrypi.cpp
> @@ -1144,7 +1144,7 @@ void IPARPi::processStats(unsigned int bufferId)
> ControlList ctrls(sensorCtrls_);
> applyAGC(&agcStatus, ctrls);
>
> - setDelayedControls.emit(ctrls);
> + setDelayedControls.emit(ctrls, metadataIdx_);
> }
> }
>
> diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> index d34a906c3cea..4d4c9e1fb9c4 100644
> --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> @@ -208,7 +208,7 @@ public:
> void runIsp(uint32_t bufferId);
> void embeddedComplete(uint32_t bufferId);
> void setIspControls(const ControlList &controls);
> - void setDelayedControls(const ControlList &controls);
> + void setDelayedControls(const ControlList &controls, uint32_t ipaCookie);
> void setSensorControls(ControlList &controls);
> void unicamTimeout();
>
> @@ -259,6 +259,7 @@ public:
> struct BayerFrame {
> FrameBuffer *buffer;
> ControlList controls;
> + unsigned int ipaCookie;
> };
>
> std::queue<BayerFrame> bayerQueue_;
> @@ -1784,9 +1785,9 @@ void RPiCameraData::setIspControls(const ControlList &controls)
> handleState();
> }
>
> -void RPiCameraData::setDelayedControls(const ControlList &controls)
> +void RPiCameraData::setDelayedControls(const ControlList &controls, uint32_t ipaCookie)
> {
> - if (!delayedCtrls_->push(controls))
> + if (!delayedCtrls_->push(controls, ipaCookie))
> LOG(RPI, Error) << "V4L2 DelayedControl set failed";
> handleState();
> }
> @@ -1848,13 +1849,13 @@ void RPiCameraData::unicamBufferDequeue(FrameBuffer *buffer)
> * Lookup the sensor controls used for this frame sequence from
> * DelayedControl and queue them along with the frame buffer.
> */
> - auto [ctrl, cookie] = delayedCtrls_->get(buffer->metadata().sequence);
> + auto [ctrl, ipaCookie] = delayedCtrls_->get(buffer->metadata().sequence);
> /*
> * Add the frame timestamp to the ControlList for the IPA to use
> * as it does not receive the FrameBuffer object.
> */
> ctrl.set(controls::SensorTimestamp, buffer->metadata().timestamp);
> - bayerQueue_.push({ buffer, std::move(ctrl) });
> + bayerQueue_.push({ buffer, std::move(ctrl), ipaCookie });
> } else {
> embeddedQueue_.push(buffer);
> }
> @@ -2148,6 +2149,7 @@ void RPiCameraData::tryRunPipeline()
> ipa::RPi::ISPConfig ispPrepare;
> ispPrepare.bayerBufferId = ipa::RPi::MaskBayerData | bayerId;
> ispPrepare.controls = std::move(bayerFrame.controls);
> + ispPrepare.ipaCookie = bayerFrame.ipaCookie;
>
> if (embeddedBuffer) {
> unsigned int embeddedId = unicam_[Unicam::Embedded].getBufferId(embeddedBuffer);
> --
> 2.25.1
>
More information about the libcamera-devel
mailing list