[libcamera-devel] [PATCH] libcamera: pipeline: simple: enable mplane devices using contiguous memory

Kieran Bingham kieran.bingham at ideasonboard.com
Wed Oct 7 10:52:05 CEST 2020


Hi Andrey,

On 07/10/2020 08:54, Andrey Konovalov wrote:
> The current simple pipeline handler refuses to work with capture devices
> which have V4L2_CAP_VIDEO_CAPTURE_MPLANE flag set in the device capabilities
> field. This is too restrictive, as devices supporting the multi-planar API
> can be using contiguous memory for semi-planar and planar formats, and this
> would just work without any changes to libcamera.

Agreed, and I'm sure in-kernel, the use of the mplane api is preferred
over the splane, so this likely isn't an uncommon case. It's just that
we haven't hit it ourselves yet.


> Drop the guard against MPLANE devices, and replace it with the check of
> the number of planes in the format the simple pipeline handler is going to
> use for capture. This will let MPLANE devices which don't use non-contiguous
> memory for frame buffers to work with the simple pipeline handler.

It sounds to me like this is a more accurate check of the restrictions
we are currently have imposed.

> Signed-off-by: Andrey Konovalov <andrey.konovalov at linaro.org>

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


> ---
>  src/libcamera/pipeline/simple/simple.cpp | 12 ++++++------
>  1 file changed, 6 insertions(+), 6 deletions(-)
> 
> diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp
> index 10223a9b..8dc23623 100644
> --- a/src/libcamera/pipeline/simple/simple.cpp
> +++ b/src/libcamera/pipeline/simple/simple.cpp
> @@ -592,6 +592,12 @@ int SimplePipelineHandler::configure(Camera *camera, CameraConfiguration *c)
>  	if (ret)
>  		return ret;
>  
> +	if (captureFormat.planesCount != 1) {
> +		LOG(SimplePipeline, Error)
> +			<<  "Planar formats using non-contiguous memory not supported";
> +		return -EINVAL;
> +	}
> +
>  	if (captureFormat.fourcc != videoFormat ||
>  	    captureFormat.size != pipeConfig.captureSize) {
>  		LOG(SimplePipeline, Error)
> @@ -845,12 +851,6 @@ V4L2VideoDevice *SimplePipelineHandler::video(const MediaEntity *entity)
>  	if (video->open() < 0)
>  		return nullptr;
>  
> -	if (video->caps().isMultiplanar()) {
> -		LOG(SimplePipeline, Error)
> -			<< "V4L2 multiplanar devices are not supported";
> -		return nullptr;
> -	}
> -
>  	video->bufferReady.connect(this, &SimplePipelineHandler::bufferReady);
>  
>  	auto element = videos_.emplace(entity, std::move(video));
> 

-- 
Regards
--
Kieran


More information about the libcamera-devel mailing list