[libcamera-devel] [RFC PATCH v2 11/12] pipeline: ipu3: Set request metadata for FULL compliance

Laurent Pinchart laurent.pinchart at ideasonboard.com
Tue Apr 27 07:18:10 CEST 2021


Hi Paul,

Thank you for the patch.

On Thu, Apr 22, 2021 at 06:41:01PM +0900, Paul Elder wrote:
> Set the request metadata as required by FULL hardware level.

Let's document that this isn't the final implementation, controls need
to be plumbed to the IPA.

> Signed-off-by: Paul Elder <paul.elder at ideasonboard.com>
> ---
>  src/libcamera/pipeline/ipu3/ipu3.cpp | 67 ++++++++++++++++++++++++++--
>  1 file changed, 64 insertions(+), 3 deletions(-)
> 
> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
> index 70a5e9ce..de90b9fe 100644
> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp
> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
> @@ -75,7 +75,8 @@ class IPU3CameraData : public CameraData
>  {
>  public:
>  	IPU3CameraData(PipelineHandler *pipe)
> -		: CameraData(pipe), exposureTime_(0), supportsFlips_(false)
> +		: CameraData(pipe), exposureTime_(0), supportsFlips_(false),
> +		  lastTimestamp_(0)
>  	{
>  	}
>  
> @@ -106,6 +107,8 @@ public:
>  private:
>  	void queueFrameAction(unsigned int id,
>  			      const ipa::ipu3::IPU3Action &action);
> +
> +	int64_t lastTimestamp_;
>  };
>  
>  class IPU3CameraConfiguration : public CameraConfiguration
> @@ -1249,12 +1252,65 @@ void IPU3CameraData::imguOutputBufferReady(FrameBuffer *buffer)
>  
>  	request->metadata().set(controls::draft::PipelineDepth, 3);
>  	/* \todo Move the ExposureTime control to the IPA. */
> -	request->metadata().set(controls::ExposureTime, exposureTime_);
> +	request->metadata().set(controls::ExposureTime,
> +				request->controls().contains(controls::ExposureTime) ?
> +				request->controls().get(controls::ExposureTime) :
> +				exposureTime_);
>  	/* \todo Actually apply the scaler crop region to the ImgU. */
>  	if (request->controls().contains(controls::ScalerCrop))
>  		cropRegion_ = request->controls().get(controls::ScalerCrop);
>  	request->metadata().set(controls::ScalerCrop, cropRegion_);
>  
> +	request->metadata().set(controls::draft::BlackLevelLocked,
> +				request->controls().contains(controls::draft::BlackLevelLocked) ?
> +			        request->controls().get(controls::draft::BlackLevelLocked) :
> +				false);

Lots of copy & paste boilerplate. It should ideally be replaced with a
(template) helper function. As this will go away anyway I'm OK with it
for the time being.

> +
> +	request->metadata().set(controls::AeLocked,
> +				request->controls().contains(controls::AeLocked) ?
> +				request->controls().get(controls::AeLocked) :
> +				false);
> +
> +	request->metadata().set(controls::draft::AePrecaptureTrigger,
> +				request->controls().contains(controls::draft::AePrecaptureTrigger) ?
> +				request->controls().get(controls::draft::AePrecaptureTrigger) :
> +				controls::draft::AePrecaptureTriggerIdle);
> +
> +	request->metadata().set(controls::AwbMode,
> +				request->controls().contains(controls::AwbMode) ?
> +				request->controls().get(controls::AwbMode) :
> +				controls::AwbAuto);
> +
> +	request->metadata().set(controls::AwbLocked,
> +				request->controls().contains(controls::AwbLocked) ?
> +				request->controls().get(controls::AwbLocked) :
> +				false);
> +
> +	request->metadata().set(controls::draft::EdgeMode,
> +				request->controls().contains(controls::draft::EdgeMode) ?
> +				request->controls().get(controls::draft::EdgeMode) :
> +				(uint8_t)controls::draft::EdgeModeOff);
> +
> +	request->metadata().set(controls::draft::NoiseReductionMode,
> +				request->controls().contains(controls::draft::NoiseReductionMode) ?
> +				request->controls().get(controls::draft::NoiseReductionMode) :
> +				controls::draft::NoiseReductionModeOff);
> +
> +	request->metadata().set(controls::draft::SensorSensitivity,
> +				request->controls().contains(controls::draft::SensorSensitivity) ?
> +				request->controls().get(controls::draft::SensorSensitivity) :
> +				32);
> +
> +	if (request->metadata().get(controls::draft::FrameDuration) <
> +	    request->metadata().get(controls::ExposureTime) * 1000)
> +			request->metadata().set(controls::draft::FrameDuration,
> +						request->metadata().get(controls::ExposureTime) * 1000);
> +
> +	request->metadata().set(controls::draft::TonemapMode,
> +				request->controls().contains(controls::draft::TonemapMode) ?
> +				request->controls().get(controls::draft::TonemapMode) :
> +				(uint8_t)controls::draft::TonemapModeFast);
> +
>  	if (frameInfos_.tryComplete(info))
>  		pipe_->completeRequest(request);
>  }
> @@ -1280,8 +1336,13 @@ void IPU3CameraData::cio2BufferReady(FrameBuffer *buffer)
>  	 * \todo The sensor timestamp should be better estimated by connecting
>  	 * to the V4L2Device::frameStart signal.
>  	 */
> +	int64_t timestamp = buffer->metadata().timestamp;
>  	request->metadata().set(controls::SensorTimestamp,
> -				buffer->metadata().timestamp);
> +				timestamp);
> +
> +	request->metadata().set(controls::draft::FrameDuration,
> +				timestamp - lastTimestamp_);
> +	lastTimestamp_ = timestamp;

Same comment as before, this should not be measured.

>  
>  	/* If the buffer is cancelled force a complete of the whole request. */
>  	if (buffer->metadata().status == FrameMetadata::FrameCancelled) {

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list