[PATCH 1/3] ipa: simple: softisp: Extend to pass metadata

Laurent Pinchart laurent.pinchart at ideasonboard.com
Tue Jun 18 01:37:14 CEST 2024


Hi Kieran,

Thank you for the patch.

On Tue, Jun 18, 2024 at 12:25:23AM +0100, Kieran Bingham wrote:
> Extend the Simple IPA IPC to support returning a metadata controllist

s/controllist/ControlList/

> when the process call has completed.
> 
> For efficiency, use the existing signal setIspParams() directly
> to avoid having an extra async callback to return the metadata.
> 
> Merge the metadata reported by the ISP into any completing
> request to provide to the application.
> 
> This should be further extended or improved to make use of the frame
> context structures so that the metadata is tied to a specific frame and
> request completion.
> 
> Signed-off-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
> ---
>  include/libcamera/internal/software_isp/software_isp.h | 5 ++++-
>  include/libcamera/ipa/soft.mojom                       | 2 +-
>  src/ipa/simple/soft_simple.cpp                         | 4 +++-
>  src/libcamera/pipeline/simple/simple.cpp               | 7 +++++--
>  src/libcamera/software_isp/software_isp.cpp            | 6 ++++--
>  5 files changed, 17 insertions(+), 7 deletions(-)
> 
> diff --git a/include/libcamera/internal/software_isp/software_isp.h b/include/libcamera/internal/software_isp/software_isp.h
> index c5338c05b99b..2631f40ef22a 100644
> --- a/include/libcamera/internal/software_isp/software_isp.h
> +++ b/include/libcamera/internal/software_isp/software_isp.h
> @@ -80,8 +80,10 @@ public:
>  	Signal<> ispStatsReady;
>  	Signal<const ControlList &> setSensorControls;
>  
> +	const ControlList &metadata() { return metadata_; }
> +
>  private:
> -	void saveIspParams();
> +	void saveIspParams(const ControlList &metadata);
>  	void setSensorCtrls(const ControlList &sensorControls);
>  	void statsReady();
>  	void inputReady(FrameBuffer *input);
> @@ -92,6 +94,7 @@ private:
>  	SharedMemObject<DebayerParams> sharedParams_;
>  	DebayerParams debayerParams_;
>  	DmaBufAllocator dmaHeap_;
> +	ControlList metadata_;
>  
>  	std::unique_ptr<ipa::soft::IPAProxySoft> ipa_;
>  };
> diff --git a/include/libcamera/ipa/soft.mojom b/include/libcamera/ipa/soft.mojom
> index 3aa2066ebaa0..1a0221df7660 100644
> --- a/include/libcamera/ipa/soft.mojom
> +++ b/include/libcamera/ipa/soft.mojom
> @@ -24,5 +24,5 @@ interface IPASoftInterface {
>  
>  interface IPASoftEventInterface {
>  	setSensorControls(libcamera.ControlList sensorControls);
> -	setIspParams();
> +	setIspParams(libcamera.ControlList metadata);
>  };
> diff --git a/src/ipa/simple/soft_simple.cpp b/src/ipa/simple/soft_simple.cpp
> index b7746ce09206..09c7b575301e 100644
> --- a/src/ipa/simple/soft_simple.cpp
> +++ b/src/ipa/simple/soft_simple.cpp
> @@ -250,6 +250,8 @@ void IPASoftSimple::processStats(const ControlList &sensorControls)
>  	SwIspStats::Histogram histogram = stats_->yHistogram;
>  	if (ignoreUpdates_ > 0)
>  		blackLevel_.update(histogram);
> +
> +	ControlList metadata(controls::controls);
>  	const uint8_t blackLevel = blackLevel_.get();
>  
>  	/*
> @@ -303,7 +305,7 @@ void IPASoftSimple::processStats(const ControlList &sensorControls)
>  		params_->blue[i] = gammaTable_[idx];
>  	}
>  
> -	setIspParams.emit();
> +	setIspParams.emit(metadata);
>  
>  	/* \todo Switch to the libipa/algorithm.h API someday. */
>  
> diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp
> index eb36578e320e..accdb744d61b 100644
> --- a/src/libcamera/pipeline/simple/simple.cpp
> +++ b/src/libcamera/pipeline/simple/simple.cpp
> @@ -860,10 +860,13 @@ void SimpleCameraData::bufferReady(FrameBuffer *buffer)
>  			return;
>  		}
>  
> -		if (converter_)
> +		if (converter_) {
>  			converter_->queueBuffers(buffer, conversionQueue_.front());
> -		else
> +		} else {
>  			swIsp_->queueBuffers(buffer, conversionQueue_.front());
> +			if (request)
> +				request->metadata().merge(swIsp_->metadata());

You're shoving metadata in a random request here, that really makes me
cringe. It's not just that there's no frame context tracking on the IPA
side, the pipeline handler side is wrong too.

> +		}
>  
>  		conversionQueue_.pop();
>  		return;
> diff --git a/src/libcamera/software_isp/software_isp.cpp b/src/libcamera/software_isp/software_isp.cpp
> index 20fb6f48fdf9..efbbea2d2279 100644
> --- a/src/libcamera/software_isp/software_isp.cpp
> +++ b/src/libcamera/software_isp/software_isp.cpp
> @@ -68,7 +68,8 @@ LOG_DEFINE_CATEGORY(SoftwareIsp)
>  SoftwareIsp::SoftwareIsp(PipelineHandler *pipe, const CameraSensor *sensor)
>  	: dmaHeap_(DmaBufAllocator::DmaBufAllocatorFlag::CmaHeap |
>  		   DmaBufAllocator::DmaBufAllocatorFlag::SystemHeap |
> -		   DmaBufAllocator::DmaBufAllocatorFlag::UDmaBuf)
> +		   DmaBufAllocator::DmaBufAllocatorFlag::UDmaBuf),
> +	  metadata_(controls::controls)
>  {
>  	/*
>  	 * debayerParams_ must be initialized because the initial value is used for
> @@ -349,9 +350,10 @@ void SoftwareIsp::process(FrameBuffer *input, FrameBuffer *output)
>  			       ConnectionTypeQueued, input, output, debayerParams_);
>  }
>  
> -void SoftwareIsp::saveIspParams()
> +void SoftwareIsp::saveIspParams(const ControlList &metadata)
>  {
>  	debayerParams_ = *sharedParams_;
> +	metadata_.merge(metadata, ControlList::MergePolicy::OverwriteExisting);
>  }
>  
>  void SoftwareIsp::setSensorCtrls(const ControlList &sensorControls)

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list