[libcamera-devel] [PATCH v2 15/16] libcamera: pipeline: Support importing buffers

Niklas Söderlund niklas.soderlund at ragnatech.se
Sun Jul 14 13:01:36 CEST 2019


Hi Jacopo, Laurent,

Thanks for your patch.

On 2019-07-13 20:23:50 +0300, Laurent Pinchart wrote:
> From: Jacopo Mondi <jacopo at jmondi.org>
> 
> Add support for importing external buffers in all pipeline handlers.
> 
> Use the stream memory type in the pipeline handlers during buffer
> allocation to import buffers to or export buffers from the video device.
> 
> Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>

Reviewed-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>

> ---
>  src/libcamera/pipeline/ipu3/ipu3.cpp     | 49 ++++++++++++++++++------
>  src/libcamera/pipeline/rkisp1/rkisp1.cpp |  6 ++-
>  src/libcamera/pipeline/uvcvideo.cpp      |  5 ++-
>  src/libcamera/pipeline/vimc.cpp          |  5 ++-
>  4 files changed, 51 insertions(+), 14 deletions(-)
> 
> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp
> index 488e89f25c5e..9ac5a5387dec 100644
> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp
> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp
> @@ -69,8 +69,9 @@ public:
>  	int configureOutput(ImgUOutput *output,
>  			    const StreamConfiguration &cfg);
>  
> -	int importBuffers(BufferPool *pool);
> -	int exportBuffers(ImgUOutput *output, BufferPool *pool);
> +	int importInputBuffers(BufferPool *pool);
> +	int importOutputBuffers(ImgUOutput *output, BufferPool *pool);
> +	int exportOutputBuffers(ImgUOutput *output, BufferPool *pool);
>  	void freeBuffers();
>  
>  	int start();
> @@ -605,7 +606,7 @@ int PipelineHandlerIPU3::allocateBuffers(Camera *camera,
>  	if (!pool)
>  		return -ENOMEM;
>  
> -	ret = imgu->importBuffers(pool);
> +	ret = imgu->importInputBuffers(pool);
>  	if (ret)
>  		goto error;
>  
> @@ -616,7 +617,7 @@ int PipelineHandlerIPU3::allocateBuffers(Camera *camera,
>  	 */
>  	bufferCount = pool->count();
>  	imgu->stat_.pool->createBuffers(bufferCount);
> -	ret = imgu->exportBuffers(&imgu->stat_, imgu->stat_.pool);
> +	ret = imgu->exportOutputBuffers(&imgu->stat_, imgu->stat_.pool);
>  	if (ret)
>  		goto error;
>  
> @@ -625,7 +626,10 @@ int PipelineHandlerIPU3::allocateBuffers(Camera *camera,
>  		IPU3Stream *stream = static_cast<IPU3Stream *>(s);
>  		ImgUDevice::ImgUOutput *dev = stream->device_;
>  
> -		ret = imgu->exportBuffers(dev, &stream->bufferPool());
> +		if (stream->memoryType() == InternalMemory)
> +			ret = imgu->exportOutputBuffers(dev, &stream->bufferPool());
> +		else
> +			ret = imgu->importOutputBuffers(dev, &stream->bufferPool());
>  		if (ret)
>  			goto error;
>  	}
> @@ -637,8 +641,8 @@ int PipelineHandlerIPU3::allocateBuffers(Camera *camera,
>  	if (!outStream->active_) {
>  		bufferCount = vfStream->configuration().bufferCount;
>  		outStream->device_->pool->createBuffers(bufferCount);
> -		ret = imgu->exportBuffers(outStream->device_,
> -					  outStream->device_->pool);
> +		ret = imgu->exportOutputBuffers(outStream->device_,
> +						outStream->device_->pool);
>  		if (ret)
>  			goto error;
>  	}
> @@ -646,8 +650,8 @@ int PipelineHandlerIPU3::allocateBuffers(Camera *camera,
>  	if (!vfStream->active_) {
>  		bufferCount = outStream->configuration().bufferCount;
>  		vfStream->device_->pool->createBuffers(bufferCount);
> -		ret = imgu->exportBuffers(vfStream->device_,
> -					  vfStream->device_->pool);
> +		ret = imgu->exportOutputBuffers(vfStream->device_,
> +						vfStream->device_->pool);
>  		if (ret)
>  			goto error;
>  	}
> @@ -1113,7 +1117,7 @@ int ImgUDevice::configureOutput(ImgUOutput *output,
>   * \param[in] pool The buffer pool to import
>   * \return 0 on success or a negative error code otherwise
>   */
> -int ImgUDevice::importBuffers(BufferPool *pool)
> +int ImgUDevice::importInputBuffers(BufferPool *pool)
>  {
>  	int ret = input_->importBuffers(pool);
>  	if (ret) {
> @@ -1134,7 +1138,7 @@ int ImgUDevice::importBuffers(BufferPool *pool)
>   *
>   * \return 0 on success or a negative error code otherwise
>   */
> -int ImgUDevice::exportBuffers(ImgUOutput *output, BufferPool *pool)
> +int ImgUDevice::exportOutputBuffers(ImgUOutput *output, BufferPool *pool)
>  {
>  	int ret = output->dev->exportBuffers(pool);
>  	if (ret) {
> @@ -1146,6 +1150,29 @@ int ImgUDevice::exportBuffers(ImgUOutput *output, BufferPool *pool)
>  	return 0;
>  }
>  
> +/**
> + * \brief Reserve buffers in \a output from the provided \a pool
> + * \param[in] output The ImgU output device
> + * \param[in] pool The buffer pool used to reserve buffers in \a output
> + *
> + * Reserve a number of buffers equal to the number of buffers in \a pool
> + * in the \a output device.
> + *
> + * \return 0 on success or a negative error code otherwise
> + */
> +int ImgUDevice::importOutputBuffers(ImgUOutput *output, BufferPool *pool)
> +{
> +	int ret = output->dev->importBuffers(pool);
> +	if (ret) {
> +		LOG(IPU3, Error)
> +			<< "Failed to import buffer in " << output->name
> +			<< " ImgU device";
> +		return ret;
> +	}
> +
> +	return 0;
> +}
> +
>  /**
>   * \brief Release buffers for all the ImgU video devices
>   */
> diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> index cc33a2cb2572..efa9604bc1e3 100644
> --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp
> @@ -319,7 +319,11 @@ int PipelineHandlerRkISP1::allocateBuffers(Camera *camera,
>  					   const std::set<Stream *> &streams)
>  {
>  	Stream *stream = *streams.begin();
> -	return video_->exportBuffers(&stream->bufferPool());
> +
> +	if (stream->memoryType() == InternalMemory)
> +		return video_->exportBuffers(&stream->bufferPool());
> +	else
> +		return video_->importBuffers(&stream->bufferPool());
>  }
>  
>  int PipelineHandlerRkISP1::freeBuffers(Camera *camera,
> diff --git a/src/libcamera/pipeline/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo.cpp
> index b299c5da8471..8965210550d2 100644
> --- a/src/libcamera/pipeline/uvcvideo.cpp
> +++ b/src/libcamera/pipeline/uvcvideo.cpp
> @@ -200,7 +200,10 @@ int PipelineHandlerUVC::allocateBuffers(Camera *camera,
>  
>  	LOG(UVC, Debug) << "Requesting " << cfg.bufferCount << " buffers";
>  
> -	return data->video_->exportBuffers(&stream->bufferPool());
> +	if (stream->memoryType() == InternalMemory)
> +		return data->video_->exportBuffers(&stream->bufferPool());
> +	else
> +		return data->video_->importBuffers(&stream->bufferPool());
>  }
>  
>  int PipelineHandlerUVC::freeBuffers(Camera *camera,
> diff --git a/src/libcamera/pipeline/vimc.cpp b/src/libcamera/pipeline/vimc.cpp
> index 7d96c3645c06..61b68a32ea50 100644
> --- a/src/libcamera/pipeline/vimc.cpp
> +++ b/src/libcamera/pipeline/vimc.cpp
> @@ -202,7 +202,10 @@ int PipelineHandlerVimc::allocateBuffers(Camera *camera,
>  
>  	LOG(VIMC, Debug) << "Requesting " << cfg.bufferCount << " buffers";
>  
> -	return data->video_->exportBuffers(&stream->bufferPool());
> +	if (stream->memoryType() == InternalMemory)
> +		return data->video_->exportBuffers(&stream->bufferPool());
> +	else
> +		return data->video_->importBuffers(&stream->bufferPool());
>  }
>  
>  int PipelineHandlerVimc::freeBuffers(Camera *camera,
> -- 
> Regards,
> 
> Laurent Pinchart
> 
> _______________________________________________
> libcamera-devel mailing list
> libcamera-devel at lists.libcamera.org
> https://lists.libcamera.org/listinfo/libcamera-devel

-- 
Regards,
Niklas Söderlund


More information about the libcamera-devel mailing list