[libcamera-devel] [PATCH v6 7/8] libcamera: raspberrypi: Plumb user transform through to IPA

Kieran Bingham kieran.bingham at ideasonboard.com
Wed Sep 2 14:42:25 CEST 2020


Hi David,

On 02/09/2020 11:44, David Plowman wrote:
> This commit plumbs the user transform from the Raspberry Pi pipeline
> handler through to the IPA. Note that the transform is actually
> handled in the sensor (by setting the h/v flip bits), so the IPAs need
> to understand the orientation of the image they receive.
> 
> Once in the IPA we add it to the CameraMode description, so that it
> becomes automatically available to all the individual control
> algorithms.
> 
> The IPA configure method has to be reordered just a little so as to
> fill in the transform in the camera mode before calling SwitchMode.
> 
> Signed-off-by: David Plowman <david.plowman at raspberrypi.com>
> Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>

Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>

> ---
>  src/ipa/raspberrypi/controller/camera_mode.h  |  4 ++
>  src/ipa/raspberrypi/raspberrypi.cpp           | 48 +++++++++++--------
>  .../pipeline/raspberrypi/raspberrypi.cpp      |  5 +-
>  3 files changed, 35 insertions(+), 22 deletions(-)
> 
> diff --git a/src/ipa/raspberrypi/controller/camera_mode.h b/src/ipa/raspberrypi/controller/camera_mode.h
> index 875bab3..920f11b 100644
> --- a/src/ipa/raspberrypi/controller/camera_mode.h
> +++ b/src/ipa/raspberrypi/controller/camera_mode.h
> @@ -6,6 +6,8 @@
>   */
>  #pragma once
>  
> +#include <libcamera/transform.h>
> +
>  // Description of a "camera mode", holding enough information for control
>  // algorithms to adapt their behaviour to the different modes of the camera,
>  // including binning, scaling, cropping etc.
> @@ -33,6 +35,8 @@ struct CameraMode {
>  	double noise_factor;
>  	// line time in nanoseconds
>  	double line_length;
> +	// any camera transform *not* reflected already in the camera tuning
> +	libcamera::Transform transform;
>  };
>  
>  #ifdef __cplusplus
> diff --git a/src/ipa/raspberrypi/raspberrypi.cpp b/src/ipa/raspberrypi/raspberrypi.cpp
> index 4557016..c730326 100644
> --- a/src/ipa/raspberrypi/raspberrypi.cpp
> +++ b/src/ipa/raspberrypi/raspberrypi.cpp
> @@ -232,6 +232,33 @@ void IPARPi::configure(const CameraSensorInfo &sensorInfo,
>  	/* Re-assemble camera mode using the sensor info. */
>  	setMode(sensorInfo);
>  
> +	/*
> +	 * The ipaConfig.data always gives us the user transform first. Note that
> +	 * this will always make the LS table pointer (if present) element 1.
> +	 */
> +	mode_.transform = static_cast<libcamera::Transform>(ipaConfig.data[0]);

I hope Paul's IPC/IDL work will help clarify how data is passed from
Pipeline handler to IPA, so I'll take this as a given for now.


> +
> +	/* Store the lens shading table pointer and handle if available. */
> +	if (ipaConfig.operation & RPI_IPA_CONFIG_LS_TABLE) {
> +		/* Remove any previous table, if there was one. */
> +		if (lsTable_) {
> +			munmap(lsTable_, MAX_LS_GRID_SIZE);
> +			lsTable_ = nullptr;
> +		}
> +
> +		/* Map the LS table buffer into user space (now element 1). */
> +		lsTableHandle_ = FileDescriptor(ipaConfig.data[1]);
> +		if (lsTableHandle_.isValid()) {
> +			lsTable_ = mmap(nullptr, MAX_LS_GRID_SIZE, PROT_READ | PROT_WRITE,
> +					MAP_SHARED, lsTableHandle_.fd(), 0);
> +
> +			if (lsTable_ == MAP_FAILED) {
> +				LOG(IPARPI, Error) << "dmaHeap mmap failure for LS table.";
> +				lsTable_ = nullptr;
> +			}
> +		}
> +	}
> +
>  	/* Pass the camera mode to the CamHelper to setup algorithms. */
>  	helper_->SetCameraMode(mode_);
>  
> @@ -280,27 +307,6 @@ void IPARPi::configure(const CameraSensorInfo &sensorInfo,
>  	}
>  
>  	lastMode_ = mode_;
> -
> -	/* Store the lens shading table pointer and handle if available. */
> -	if (ipaConfig.operation & RPI_IPA_CONFIG_LS_TABLE) {
> -		/* Remove any previous table, if there was one. */
> -		if (lsTable_) {
> -			munmap(lsTable_, MAX_LS_GRID_SIZE);
> -			lsTable_ = nullptr;
> -		}
> -
> -		/* Map the LS table buffer into user space. */
> -		lsTableHandle_ = FileDescriptor(ipaConfig.data[0]);
> -		if (lsTableHandle_.isValid()) {
> -			lsTable_ = mmap(nullptr, MAX_LS_GRID_SIZE, PROT_READ | PROT_WRITE,
> -					MAP_SHARED, lsTableHandle_.fd(), 0);
> -
> -			if (lsTable_ == MAP_FAILED) {
> -				LOG(IPARPI, Error) << "dmaHeap mmap failure for LS table.";
> -				lsTable_ = nullptr;
> -			}
> -		}
> -	}
>  }
>  
>  void IPARPi::mapBuffers(const std::vector<IPABuffer> &buffers)
> diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> index 29112da..728973a 100644
> --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp
> @@ -1252,6 +1252,9 @@ int RPiCameraData::configureIPA()
>  	entityControls.emplace(0, unicam_[Unicam::Image].dev()->controls());
>  	entityControls.emplace(1, isp_[Isp::Input].dev()->controls());
>  
> +	/* Always send the user transform to the IPA. */
> +	ipaConfig.data = { static_cast<unsigned int>(userTransform_) };
> +
>  	/* Allocate the lens shading table via dmaHeap and pass to the IPA. */
>  	if (!lsTable_.isValid()) {
>  		lsTable_ = dmaHeap_.alloc("ls_grid", MAX_LS_GRID_SIZE);
> @@ -1260,7 +1263,7 @@ int RPiCameraData::configureIPA()
>  
>  		/* Allow the IPA to mmap the LS table via the file descriptor. */
>  		ipaConfig.operation = RPI_IPA_CONFIG_LS_TABLE;
> -		ipaConfig.data = { static_cast<unsigned int>(lsTable_.fd()) };
> +		ipaConfig.data.push_back(static_cast<unsigned int>(lsTable_.fd()));
>  	}
>  
>  	CameraSensorInfo sensorInfo = {};
> 

-- 
Regards
--
Kieran


More information about the libcamera-devel mailing list