[libcamera-devel] [PATCH v2 16/27] libcamera: framebuffer: Allocate metadata planes at construction time

Jean-Michel Hautbois jeanmichel.hautbois at ideasonboard.com
Mon Sep 6 09:36:04 CEST 2021


Hi Laurent,

On 06/09/2021 04:00, Laurent Pinchart wrote:
> The metadata planes are allocated by V4L2VideoDevice when dequeuing a
> buffer. This causes the metadata planes to only be allocated after a
> buffer gets dequeued, and doesn't provide any strong guarantee that
> their number matches the number of FrameBuffer planes. The lack of this
> invariant makes the FrameBuffer class fragile.
> 
> As a first step towards fixing this, allocate the metadata planes when
> the FrameBuffer is constructed. The FrameMetadata API should be further
> improved by preventing a change in the number of planes.
> 
> Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
Reviewed-by: Jean-Michel Hautbois <jeanmichel.hautbois at ideasonboard.com>
> ---
> Changes since v1:
> 
> - Return buffer with state set to FrameError on error
> ---
>  src/libcamera/framebuffer.cpp      |  2 ++
>  src/libcamera/v4l2_videodevice.cpp | 10 +++++-----
>  2 files changed, 7 insertions(+), 5 deletions(-)
> 
> diff --git a/src/libcamera/framebuffer.cpp b/src/libcamera/framebuffer.cpp
> index e71c2ffae034..e4f8419a9063 100644
> --- a/src/libcamera/framebuffer.cpp
> +++ b/src/libcamera/framebuffer.cpp
> @@ -210,6 +210,8 @@ FrameBuffer::FrameBuffer(const std::vector<Plane> &planes, unsigned int cookie)
>  	: Extensible(std::make_unique<Private>()), planes_(planes),
>  	  cookie_(cookie)
>  {
> +	metadata_.planes.resize(planes_.size());
> +
>  	unsigned int offset = 0;
>  	bool isContiguous = true;
>  	ino_t inode = 0;
> diff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp
> index 59aa53c7c27e..e729e608448c 100644
> --- a/src/libcamera/v4l2_videodevice.cpp
> +++ b/src/libcamera/v4l2_videodevice.cpp
> @@ -1670,7 +1670,6 @@ FrameBuffer *V4L2VideoDevice::dequeueBuffer()
>  
>  	unsigned int numV4l2Planes = multiPlanar ? buf.length : 1;
>  	FrameMetadata &metadata = buffer->metadata_;
> -	metadata.planes.clear();
>  
>  	if (numV4l2Planes != buffer->planes().size()) {
>  		/*
> @@ -1700,8 +1699,9 @@ FrameBuffer *V4L2VideoDevice::dequeueBuffer()
>  				return buffer;
>  			}
>  
> -			metadata.planes.push_back({ std::min(plane.length, bytesused) });
> -			bytesused -= metadata.planes.back().bytesused;
> +			metadata.planes[i].bytesused =
> +				std::min(plane.length, bytesused);
> +			bytesused -= metadata.planes[i].bytesused;
>  		}
>  	} else if (multiPlanar) {
>  		/*
> @@ -1710,9 +1710,9 @@ FrameBuffer *V4L2VideoDevice::dequeueBuffer()
>  		 * V4L2 buffer is guaranteed to be equal at this point.
>  		 */
>  		for (unsigned int i = 0; i < numV4l2Planes; ++i)
> -			metadata.planes.push_back({ planes[i].bytesused });
> +			metadata.planes[i].bytesused = planes[i].bytesused;
>  	} else {
> -		metadata.planes.push_back({ buf.bytesused });
> +		metadata.planes[0].bytesused = buf.bytesused;
>  	}
>  
>  	return buffer;
> 


More information about the libcamera-devel mailing list