[libcamera-devel] [PATCH v3 2/4] pipeline: vimc: Allocate mock IPA buffers

paul.elder at ideasonboard.com paul.elder at ideasonboard.com
Sat Aug 14 07:36:44 CEST 2021


Hi Umang,

On Sat, Aug 14, 2021 at 10:39:10AM +0530, Umang Jain wrote:
> VIMC is a virtual test driver that doesn't have statistics or
> parameters buffers that are typically passed from a pipeline
> handler to its platform IPA. To increase the test coverage going
> forward, we can atleast mimick the typical interaction of how
> a pipeline handler and IPA interacts, and use it to increase the
> test coverage.
> 
> Hence, create simple (single plane) dmabuf-backed FrameBuffers,
> which can act as mock IPA buffers and can be memory mapped(mmap)
> to VIMC IPA. To create these buffers, temporarily hijack the output
> video node and configure it with a V4L2DeviceFormat. Buffers then
> can be exported from the output video node using
> V4L2VideoDevice::exportBuffers(). These buffers will be mimicked as
> IPA buffers in subsequent commits.
> 
> Signed-off-by: Umang Jain <umang.jain at ideasonboard.com>
> Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> ---
>  src/libcamera/pipeline/vimc/vimc.cpp | 23 +++++++++++++++++++++++
>  1 file changed, 23 insertions(+)
> 
> diff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp
> index 4c92729d..2dfa1418 100644
> --- a/src/libcamera/pipeline/vimc/vimc.cpp
> +++ b/src/libcamera/pipeline/vimc/vimc.cpp
> @@ -50,6 +50,7 @@ public:
>  	}
>  
>  	int init();
> +	int allocateMockIPABuffers();
>  	void bufferReady(FrameBuffer *buffer);
>  
>  	MediaDevice *media_;
> @@ -61,6 +62,7 @@ public:
>  	Stream stream_;
>  
>  	std::unique_ptr<ipa::vimc::IPAProxyVimc> ipa_;
> +	std::vector<std::unique_ptr<FrameBuffer>> mockIPABufs_;
>  };
>  
>  class VimcCameraConfiguration : public CameraConfiguration
> @@ -500,6 +502,12 @@ int VimcCameraData::init()
>  	if (raw_->open())
>  		return -ENODEV;
>  
> +	ret = allocateMockIPABuffers();
> +	if (!ret) {
> +		LOG(VIMC, Warning) << "Cannot allocate mock IPA buffers";
> +		return ret;
> +	}
> +
>  	/* Initialise the supported controls. */
>  	const ControlInfoMap &controls = sensor_->controls();
>  	ControlInfoMap::Map ctrls;
> @@ -548,6 +556,21 @@ void VimcCameraData::bufferReady(FrameBuffer *buffer)
>  	pipe_->completeRequest(request);
>  }
>  
> +int VimcCameraData::allocateMockIPABuffers()
> +{
> +	constexpr unsigned int kBufCount = 2;
> +
> +	V4L2DeviceFormat format;
> +	format.fourcc = video_->toV4L2PixelFormat(formats::BGR888);
> +	format.size = Size (160, 120);
> +
> +	int ret = video_->setFormat(&format);
> +	if (ret < 0)
> +		return ret;
> +
> +	return video_->exportBuffers(kBufCount, &mockIPABufs_);

Do we ever need to free these buffers?


Paul

> +}
> +
>  REGISTER_PIPELINE_HANDLER(PipelineHandlerVimc)
>  
>  } /* namespace libcamera */
> -- 
> 2.31.1
> 


More information about the libcamera-devel mailing list