Message ID | 20210906225636.14683-11-laurent.pinchart@ideasonboard.com |
---|---|
State | Accepted |
Headers | show |
Series |
|
Related | show |
On 06/09/2021 23:56, Laurent Pinchart wrote: > The V4L2VideoDevice::createBuffer() calculates offsets manually when > using a multi-planar pixel format and a single-planar V4L2 format. The > process isn't trivial, document it. > > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > Reviewed-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com> > Reviewed-by: Hirokazu Honda <hiroh@chromium.org> > --- > src/libcamera/v4l2_videodevice.cpp | 9 +++++++++ > 1 file changed, 9 insertions(+) > > diff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp > index 1483181a0856..88535f5a07c7 100644 > --- a/src/libcamera/v4l2_videodevice.cpp > +++ b/src/libcamera/v4l2_videodevice.cpp > @@ -1334,10 +1334,19 @@ std::unique_ptr<FrameBuffer> V4L2VideoDevice::createBuffer(unsigned int index) > } > > /* > + * If we have a multi-planar format with a V4L2 single-planar buffer, > + * split the single V4L2 plane into multiple FrameBuffer planes by > + * computing the offsets manually. > + * > * The format info is not guaranteed to be valid, as there are no > * PixelFormatInfo for metadata formats, so check it first. > */ > if (formatInfo_->isValid() && formatInfo_->numPlanes() != numPlanes) { > + /* > + * There's no valid situation where the number of colour planes > + * differs from the number of V4L2 planes and the V4L2 buffer > + * has more than one plane. > + */ I think that helps a lot on that assert. Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> > ASSERT(numPlanes == 1u); > > planes.resize(formatInfo_->numPlanes()); >
diff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp index 1483181a0856..88535f5a07c7 100644 --- a/src/libcamera/v4l2_videodevice.cpp +++ b/src/libcamera/v4l2_videodevice.cpp @@ -1334,10 +1334,19 @@ std::unique_ptr<FrameBuffer> V4L2VideoDevice::createBuffer(unsigned int index) } /* + * If we have a multi-planar format with a V4L2 single-planar buffer, + * split the single V4L2 plane into multiple FrameBuffer planes by + * computing the offsets manually. + * * The format info is not guaranteed to be valid, as there are no * PixelFormatInfo for metadata formats, so check it first. */ if (formatInfo_->isValid() && formatInfo_->numPlanes() != numPlanes) { + /* + * There's no valid situation where the number of colour planes + * differs from the number of V4L2 planes and the V4L2 buffer + * has more than one plane. + */ ASSERT(numPlanes == 1u); planes.resize(formatInfo_->numPlanes());